Networking

如何在多IP綁定伺服器上使傳入和傳出IP相同

  • June 16, 2013

我有一個 centos 6 VPS 配置了 1 個與 4 個 IP 綁定的網路介面,例如 172.xx11、172.xx12、172.xx13、172.xx14 與 venet0:0、venet0:1、venet0:2、venet0:3 綁定。

我在伺服器上執行 pptpd 服務。客戶端可以通過4個IP中的每一個連接到PPTP VPN服務,但是當包轉發到目的地時,IP始終是伺服器的主IP,即172.xx11。

例如,使用者通過 PPTP VPN 客戶端連接到 172.xx13 請求 twitter.com 的頁面,但 twitter.com 看到請求來自 172.xx11。我應該如何設置伺服器(可能是 iptables、路由)以使傳入和傳出 IP 相同?

這是我為 ip forwading 設置的 iptables:

-A POSTROUTING -s 192.168.24.0/255.255.255.0 -o venet0 -j MASQUERADE

這是路由命令的結果:

`[root@bla1 ~]# route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

link-local * 255.255.0.0 U 1002 0 0 venet0

default * 0.0.0.0 U 0 0 0 venet0`

使用 iptables CONNMARK 在每個數據包發出時對其進行標記,並在數據包從連接返回時恢復該標記。您還需要設置多個路由表,每個標記一個,以便您可以根據標記路由數據包。

要設置路由,您可以使用“ip route nexthop”。您還可以為每條路線指定權重,這樣您就可以根據需要平衡流量。

另外,我認為您的範例不准確。發生的情況是數據包從不同的 IP 地址發出,因此當它們返回時,它們不會被指定到用於建立連接的 IP。這就是為什麼您需要確保一個連接的所有數據包始終使用相同的路由。

我沒有腳本來做這件事,但我的腳本是基於http://mailman.ds9a.nl/pipermail/lartc/2006q2/018964.html的範例(複製如下)。

#by-pass rules if it is already MARKed
iptables -t mangle -A POSTROUTING -m mark  --mark ! 0 -j ACCEPT 
#1st packets(from a connection) will arrive here 
iptables -t mangle -A POSTROUTING -o eth1 -j MARK --set-mark 0x1
iptables -t mangle -A POSTROUTING -o eth2 -j MARK --set-mark 0x2
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

#restore mark before ROUTING decision
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

#route commands
ip ro add default  nexthop via x.x.x.x dev eth1 weight 1 nexthop via
   y.y.y.y dev eth2
ip route add default table provider1 via x.x.x.x dev eth1
ip route add default table provider2 via y.y.y.y dev eth2

# and most important
ip rule add fwmark 0x1 table provider1
ip rule add fwmark 0x2 table provider2

還有其他一些事情需要考慮:

  1. 一些程序(如 ssh)會在初始設置後創建新連接。這個新連接可以有與初始連接不同的路由,並且應用程序不會看到來自這個連接的數據包。所以你已經為這樣的應用程序設置了特殊的路線。
  2. 如果你有很多連結,就會出現 flakey nics 的問題。最好使用 vlan 交換機將物理連接中繼到調製解調器。
  3. 如果您想允許來自外部的傳入連接,您還需要特殊路由。

引用自:https://serverfault.com/questions/515849