如何使多个IP绑定服务器上的传入和传出IP相同

我有一个centos 6 VPSconfiguration1个networking接口与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相同?

这是我设置iptables 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地址出去,所以当它们回来的时候,它们不会注定到用来build立连接的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 xxxx dev eth1 weight 1 nexthop via yyyy dev eth2 ip route add default table provider1 via xxxx dev eth1 ip route add default table provider2 via yyyy dev eth2 # and most important ip rule add fwmark 0x1 table provider1 ip rule add fwmark 0x2 table provider2 

还有其他的事情要考虑:

  1. 一些程序,如ssh,在初始设置后创build新的连接。 这个新的连接可以有不同于初始连接的路由,应用程序不会看到来自这个连接的数据包。 所以你已经设置了这样的应用程序的特殊路线。
  2. 如果你有很多的链接,会出现flakey问题。 使用vlan switch来将物理连接中继到调制解调器更好。
  3. 如果您想允许外部传入连接,则还需要特殊路由。

你所看到的是你所设立的追随规则的直接结果。

你想要做什么需要桥接(用于相同的networking通信)或路由(用于networking内通信)。 伪装(NAT)具有你所感叹的效果。