3

Допустим, у меня есть два общедоступных сетевых адреса на моем сервере: один NAT через ISP (192.168.99.0/24) и VPN через другого ISP (192.168.1.0/24), уже настроенный с маршрутом на хост к VPN-сервер через моего провайдера.

Вот моя начальная таблица маршрутизации. В настоящее время я маршрутизирую своего провайдера в подсети 192.168.99.0/24.

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.99.1    0.0.0.0         UG    0      0        0 eth1
55.66.77.88     192.168.99.1    255.255.255.255 UGH   0      0        0 eth1
192.168.99.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 tap0

Теперь я хочу, чтобы новые соединения TCP переключались на мой 192.168.1.0/24, поэтому я набираю следующее:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Когда я делаю это, это приводит к зависанию некоторых давних TCP-соединений. Есть ли способ безопасно сменить интерфейс по умолчанию для новых соединений, позволяя существующим TCP-соединениям использовать старый маршрут (т. Е. Нужно ли мне включить какую-нибудь таблицу маршрутизации с отслеживанием состояния)?

Я согласен с решением, которое работает только с установленными TCP-соединениями, и мне все равно, насколько это хакерски. Например, если есть способ добавить временные правила iptables для существующих подключений, чтобы принудительно переместить их по старому маршруту. Но должен быть какой-то способ сделать это.

РЕДАКТИРОВАТЬ: Просто примечание о простом "route add -host ..." для существующих подключений: это решение будет работать, если я в порядке, оставив подмножество IP-адресов на старом интерфейсе. Однако в моем приложении это на самом деле не решает мою проблему, потому что я хочу разрешить новым соединениям подключаться к новому интерфейсу, даже если они имеют одинаковый исходный IP. Сейчас я смотрю на использование команды "ip route" для установки правил маршрутизации на основе исходного кода.

1 ответ1

1

Следующая команда проверит открытые соединения tcp и выведет список адресатов за пределами локальной сети:

$ netstat -4ntu | tail -n +3 | cut -c45-65 | cut -d: -f1 | grep -v '192.168.99' | grep -v '192.168.1'
214.236.220.101
63.171.235.16
174.63.61.132
159.47.216.178
62.59.197.29
139.47.218.150
56.4.17.22
204.63.49.5
155.9.79.196
144.31.207.66

Так что нам просто нужно перебрать этот список и указать конкретные маршруты к основному маршрутизатору, прежде чем изменять маршрут по умолчанию:

for i in $(netstat -4nt | tail -n +3 | cut -c45-65 | cut -d: -f1 |grep -v '192\.168\.99' | grep -v '192\.168\.1') ; do echo route add -host $i gw 192.168.1.99; done

(Я оставил там команду "echo", чтобы вы могли видеть, что она делает, вы можете удалить ее, когда вы действительно хотите это сделать.

Затем измените ваш маршрут по умолчанию:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Поскольку добавленные маршруты более конкретны, они будут выбраны в качестве предпочтения к маршруту по умолчанию. Очевидно, вы можете поместить это в сценарий, чтобы сделать это проще.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .