Допустим, у меня есть два общедоступных сетевых адреса на моем сервере: один 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" для установки правил маршрутизации на основе исходного кода.