У меня есть centos 6 VPS, настроенная 1 привязка сетевого интерфейса с 4 IP-адресами, например привязка 172.xx11, 172.xx12, 172.xx13, 172.xx14 с venet0: 0, venet0: 1, venet0: 2, venet0: 3.
У меня на сервере работает служба pptpd. Клиент может подключиться к службе PPTP VPN с каждым из 4 IP-адресов, но когда пакет пересылается по назначению, IP-адрес всегда является основным IP-адресом сервера, т.е. 172.x.x.11.
Например, пользователь запрашивает страницу twitter.com, подключившись к 172.x.x.13 с помощью PPTP VPN-клиента, но twitter.com видит, что запрос от 172.x.x.11. Как мне настроить сервер (возможно, iptables, route), чтобы сделать входящий и исходящий IP одинаковыми?
Вот что я установил iptables для пересылки ip:
-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
Есть и другие вещи, которые следует учитывать:
То, что вы видите, является прямым следствием установленного вами правила постмаршрутизации.
То, что вы хотите сделать, требует либо моста (для связи в одной сети), либо маршрутизации (для связи внутри сети). Маскарадинг (NATting) имеет тот самый эффект, на который вы сетуете.