моя конфигурация:
# ip route sh
zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1
yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146
xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47
169.254.0.0/16 dev eth3 scope link metric 1002
169.254.0.0/16 dev eth4 scope link metric 1003
169.254.0.0/16 dev eth1 scope link metric 1004
default via xxx.xxx.xxx.1 dev eth4
# ip rule sh
0: from all lookup local
217: from xxx.xxx.xx9.47 lookup table1
219: from yyy.yyy.yyy.146 lookup table2
32766: from all lookup main
32767: from all lookup default
# ip ro sh table table2
zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1
yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146
default via yyy.yyy.yyy.1 dev eth1
# ip ro sh table table1
zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1
xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47
default via xxx.xxx.xx8.1 dev eth4
iptables -t nat -L POSTROUTING
MASQUERADE all -- * eth4 0.0.0.0/0 0.0.0.0/0
MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
rp_filter установлен в 0 (пробовал с 2, то же самое)
когда я пытаюсь получить доступ к xxx.xxx.xx9.47 или yyy.yyy.yyy.146 из Интернета, они отлично работают с этой конфигурацией. из локальной сети (zzz.zzz.zzz.0 / 24) интернет работает отлично, трафик идет по маршруту по умолчанию.
я перенаправил порт на комп в zzz.zzz.zzz.0 / 24 lan
# iptables -t nat -L PREROUTING -nv
DNAT tcp -- eth4 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb
DNAT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb
из Интернета я могу получить доступ к zzz.zzz.zzz.3 на порту aa только с помощью xxx.xxx.xx9.47, ip из маршрута по умолчанию. У меня не удалось установить соединение с yyy.yyy.yyy.146, что не является маршрутом по умолчанию. tcpdump на eth1 показывает только входящий трафик, если я tcpdump интерфейс маршрута по умолчанию (в данном случае eth4), я вижу, что пакеты пытаются покинуть интерфейс с исходным ip yyy.yyy.yyy.146, ведь, конечно, это не работает
Если я изменю маршрут по умолчанию на eth1, произойдет противоположное. я получаю ответ от yyy.yyy.yyy.146 на порту aa, и соединение не удалось с xxx.xxx.xx9.47 tcpdump the eth1 я вижу, что пакеты пытаются выйти на eth1 с xxx.xxx.xx9.47 при попытке доступа к xxx .xxx.xx9.47 на порт aa
поменял maquerade с snat # iptables -t nat -L POSTROUTING
SNAT all -- * eth1 0.0.0.0/0 0.0.0.0/0 to:yyy.yyy.yyy.146
SNAT all -- * eth4 0.0.0.0/0 0.0.0.0/0 to:xxx.xxx.xx9.47
и по-прежнему tcpdump на маршруте по умолчанию показывает пакеты ответов с исходным кодом yyy.yyy.yyy.146, оставляя eth4 так .. snat или маскарад работает, Contrack работает. Я действительно не понимаю, почему он пытается отвечать только на интерфейсе по умолчанию, даже если исходный IP-адрес находится с другого интерфейса ... и как получилось, что он схватил один интерфейс с IP-адресом из другого. операционная система - centos 6.8.
спасибо за объяснения. Я думал, что это нужно сделать с маркировкой пакетов.
Я понял, используя Mangle # iptables -t mangle -L PREROUTING -nv
CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK restore
MARK all -- eth4 * 0.0.0.0/0 0.0.0.0/0 MARK set 0xc8
MARK all -- eth1 * 0.0.0.0/0 0.0.0.0/0 MARK set 0xd3
CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK save
в основном я отмечаю входящие соединения на каждом интерфейсе и восстанавливаю маркер на отслеживаемых соединениях. поэтому соединение, помеченное как от eth1, всегда будет переходить к правилу fwmark 211 (0xd3) и eth4 через правило fwmark 200 (0xc8)
Спасибо еще раз :)
Когда пакеты поступают через интерфейс X и на них немедленно отвечает тот же компьютер, тогда ваше правило маршрутизации на основе источника может перехватить ответ, поскольку его исходный IP-адрес обязательно будет соответствовать правилу.
Когда эти пакеты впоследствии пересылаются через интерфейс Y на другой IP-адрес, эта первая часть связи будет работать. Но как только первый ответный пакет поступит с этого другого IP-адреса, он войдет в анализатор правил маршрутизации со своим собственным исходным IP-адресом, а не с этим маршрутизатором. Затем он пропустит правила маршрутизации на основе источника и вместо этого будет соответствовать поиску по умолчанию, который, как обычно, будет основан на месте назначения.
Что вам нужно сделать, так это пометить пакеты по мере их поступления на интерфейс X, чтобы эта метка сохранялась при пересылке, а затем сопоставить эту метку в правилах маршрутизации, чтобы использовалась другая таблица исходящей маршрутизации.