Задать вопрос

Как настроить два сетевых интерфейсов на VPS (с ролью шлюза)?

Имеется 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 (то есть через второй интерфейс), то они до сервиса доходят, он ответ присылает... но из шлюза обратно они уходят через первый интерфейс. Я так понимаю, это как то связано с маршрутами, но не понимаю где именно ошибка.
  • Вопрос задан
  • 346 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • ИПК
    Сетевой и системный администратор
    2 месяца
    Далее
  • Нетология
    Сетевой инженер
    13 месяцев
    Далее
  • Skillbox
    Профессия DevOps-инженер PRO
    12 месяцев
    Далее
Решения вопроса 1
astrave
@astrave Автор вопроса
Разобрался сам.

Готовый скрипт

OUTTUN_NET=$(ip route show dev gre0 | awk '{ print $1 }')
OUTTUN_IP=$(ip route show dev gre0 | grep -v "default" | awk '{ print $7 }')

iptables -t nat -A POSTROUTING -o gre0 -j SNAT --to $OUTTUN_IP

for ((i=0; i<$(ls /sys/class/net/ | grep "^eth" | wc -l); i++)); do
ETH_IP=$(ip route show dev eth${i} | grep -v "default" | awk '{ print $7 }')
ETH_NET=$(ip route show dev eth${i} | grep -v "default" | awk '{ print $1 }')
ETH_GW=$(ip route show dev eth${i} | grep "default" | awk '{ print $3 }')
ip route add $ETH_NET dev eth${i} src $ETH_IP table gate${i}
ip route add default via $ETH_GW dev eth${i} table gate${i}
ip route add 172.30.0.0/30 dev gre0 src 172.30.0.1 table gate${i}
ip rule add from $ETH_IP lookup gate${i}
ip rule add fwmark 10${i} lookup gate${i}
iptables -t mangle -A FORWARD -i eth${i} -j CONNMARK --set-mark 10${i}
iptables -t nat -A POSTROUTING -o eth${i} -j SNAT --to $ETH_IP
done

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
ip route flush cache


Основные косяки:
1) Надо было в каждую "особую таблицу маршрутизации" добавить маршрут до сети gre туннеля 172.30.0.0
2) Надо было маркировать соединения в таблице FORWARD
3) Надо было в PREROUTING добавить --restore-mark (чтобы при возвращении из туннеля метка вешалась обратно)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Drno
отмени правило masquerade в iptables

и настрой SNAT - чтоб уходило через то тже интерфейс, на который пришло
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы