Linux
通過 NAT 的虛擬網關
我有以下網路設置:
網關:
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 VIP
10.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