Изменить маршрут по умолчанию, не влияя на существующие соединения TCP

1435
Patrick Horn

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

3
Вы должны действительно исправить это навсегда и использовать маршрутизацию на основе источника (политики). David Schwartz 11 лет назад 0
@DavidSchwartz Круто! Это именно тот ответ, который я искал. Я, честно говоря, даже не знал, что такая концепция существует: на самом деле я должен был смотреть на «ip route», а не на простой старый «route» - я полностью забыл об этом. Если вы ответите формально на вопрос с помощью способа включения маршрутизации на основе источника или более подробной информации о типах команд ip, которые могут создавать простые таблицы маршрутизации на основе источника, я был бы рад принять ответ. Patrick Horn 11 лет назад 0

1 ответ на вопрос

1
Paul

Следующая команда проверит открытые соединения 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 

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

Решение с таблицей маршрутизации * будет работать *, если я в порядке, оставив подмножество IP-адресов на старом интерфейсе. Однако в моем приложении это фактически не решает мою проблему, потому что я хочу разрешить новым соединениям подключаться к новому интерфейсу, даже если они имеют одинаковый исходный IP-адрес. Также я частично задал этот вопрос, потому что надеялся на возможность менее грубый подход. Patrick Horn 11 лет назад 0
@PatrickHorn Стоит отредактировать ваш вопрос, чтобы уточнить это, так как другие люди, которые хотят помочь, могут не найти этот комментарий. Paul 11 лет назад 0

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