Имеется VPS с двумя сетевыми интерфейсами eth0: 10.129.0.11 и eth1: 10.129.0.12 (внешний адреса в интернете у них другие с которыми они связаны через NAT One-to-One). Представим, что это адреса 11.1.1.1 и 22.2.2.2.
Эта VPS связана с другой VPS через GRE туннель с адресами 172.30.0.1 (шлюз) и 172.30.0.2 (дальняя) на концах.
На "дальней vps" работает сервис с открытым портом 11336, а на первой VPS (шлюз) проброшен такой же порт 11336 на ту неё через связующий их GRE туннель:
iptables -A FORWARD -p tcp -m multiport --dport 11336 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -m multiport --dport 11336 -j DNAT --to-destination 172.30.0.2
На самом шлюзе в маршрутах (появляются автоматом):
default via 10.129.0.1 dev eth0
default via 10.129.0.1 dev eth1 metric 200
10.129.0.0/24 dev eth0 proto kernel scope link src 10.129.0.11
10.129.0.0/24 dev eth1 proto kernel scope link src 10.129.0.12
172.30.0.0/30 dev gre_vps2 proto kernel scope link src 172.30.0.1
/etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
101 isp1
102 isp2
Дополнительные правила iptables
ip route add 10.129.0.0/24 dev eth0 src 10.129.0.11 table isp1
ip route add 10.129.0.0/24 dev eth1 src 10.129.0.12 table isp2
ip route add default via 10.129.0.1 dev eth0 table isp1
ip route add default via 10.129.0.1 dev eth1 table isp2
ip rule add from 192.168.0.11 table isp1
ip rule add from 192.168.0.12 table isp2
iptables -t mangle -A PREROUTING -i eth0 -j CONNMARK --set-mark 101
iptables -t mangle -A PREROUTING -i eth1 -j CONNMARK --set-mark 102
ip rule add fwmark 101 lookup isp1
ip rule add fwmark 102 lookup isp2
iptables -t mangle -A FORWARD -j CONNMARK --save-mark
iptables -t mangle -I OUTPUT -j CONNMARK --restore-mar
ip route show table 101
default via 10.129.0.1 dev eth0
10.129.0.0/24 dev eth0 scope link src 10.129.0.11
ip route show table 102
default via 10.129.0.1 dev eth1
10.129.0.0/24 dev eth1 scope link src 10.129.0.12
Проблема в том, что если стучаться на 11.1.1.1:11336, то запросы корректно идут до сервиса через GRE туннель и возвращаются адресату, но если стучаться 22.2.2.2:11336 (то есть через
второй интерфейс), то они до сервиса доходят, он ответ присылает... но из шлюза обратно они уходят через
первый интерфейс. Я так понимаю, это как то связано с маршрутами, но не понимаю где именно ошибка.