Linux

通過 NAT 的虛擬網關

  • April 20, 2021

我有以下網路設置:

網關:

Internet <-- eth0 : a.b.c.d (static address)
Clients <-- eth1  : DHCP at server at 172.16.0.1, leasing 172.16.0.0/24

客戶:

Gateway <-- eth0: 172.16.0.0/24

客戶端可以訪問網際網路並且轉發正在工作。我想創建某種“虛擬”地址,客戶端可以通過網關訪問,但該地址實際上是 Internet 上的某些機器。

所以,當他們連接到172.32.1.1他們實際上連接到Google等等。我用 NAT 試過了:

TARGET=$(dig -q google.com)
VIRTUAL=172.32.1.1
iptables -t nat -A PREROUTING -d "$VIRTUAL" -j DNAT --to "$TARGET"
iptables -t nat -A POSTROUTING -s "$TARGET" -j SNAT --to "$VIRTUAL"

這以某種方式有效,但是當我從網關 ping 它時,我得到了

From 20.249.x.y icmp_seq=1 Destination Net Unreachable

(其中 20.249.xy 是我的網關的網關),當我從客戶端跟踪路由到該虛擬 IP 時,我得到以下資訊:

traceroute to 172.32.1.1 (172.32.1.1), 30 hops max, 38 byte packets
1  172.32.1.1 (172.32.1.1)  31.886 ms  31.638 ms  34.029 ms
2  172.32.1.1 (172.32.1.1)  39.660 ms  40.489 ms  39.153 ms
3  172.32.1.1 (172.32.1.1)  41.879 ms  40.367 ms  40.436 ms
4  172.32.1.1 (172.32.1.1)  47.375 ms  48.200 ms  48.878 ms
5  172.32.1.1 (172.32.1.1)  47.801 ms  47.280 ms  47.405 ms

這對我來說看起來非常奇怪。有沒有辦法解決這些問題?我試圖使用ip tunnel,但看起來它也需要不同的端設置,這顯然是我做不到的。

伺服器上的 iptables 配置-A FORWARD -i eth1 -j ACCEPT僅包含這兩個規則。

您可能想要刷新現有的損壞 iptables 規則,然後從頭開始。在充當網關的 Linux 機器上,假設以下條件:

linux網關有兩個網卡;eth0 面向 LAN,而 eth1 面向 WAN。

在網關上啟用 IP 數據包轉發:

$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward

根據我們的測試計劃在 eth0 上創建兩個測試虛擬 IP (VIP)

$ sudo ifconfig eth0:1 10.1.1.1 netmask 255.255.255.0
$ sudo ifconfig eth0:2 10.8.8.8 netmask 255.255.255.0

按照我們的計劃配置 iptables

sudo iptables -t nat -A PREROUTING -d 10.1.1.1 -j DNAT --to 1.1.1.1
sudo iptables -t nat -A PREROUTING -d 10.8.8.8 -j DNAT --to 8.8.8.8
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

在這種情況下,當使用者 ping VIP10.1.1.1時,會重定向到 Cloudflare 的1.1.1.1

如果使用者 ping VIP 10.8.8.8,他們將被重定向到 Google 的8.8.8.8

10.1.1.1 ---> 1.1.1.1
10.8.8.8 ---> 8.8.8.8

引用自:https://unix.stackexchange.com/questions/644933