Изменить маршрут по умолчанию, не влияя на существующие соединения TCP
Допустим, у меня есть два общедоступных сетевых адреса на моем сервере: один 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 ответ
Следующая команда проверит открытые соединения 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
Поскольку добавленные маршруты более конкретны, они будут выбраны в качестве предпочтения к маршруту по умолчанию. Очевидно, вы можете поместить это в сценарий, чтобы сделать это проще.