У меня есть служба TCP в центре обработки данных, которая выполняет фильтрацию и ограничение скорости на основе исходного IP-адреса. Я хочу переместить его в другой центр обработки данных.
Я хотел бы предоставить такую же услугу на IP-адресе из нового центра обработки данных и перенаправить весь трафик с одного порта на старый, чтобы и новый, и старый работали одновременно. Я не могу просто изменить имя хоста, так как некоторые клиенты используют IP-адрес для подключения (вздох), а некоторые используют IP-фильтрацию исходящих подключений на основе IP-адреса (вздох), и на их изменение уйдут недели.
Я знаю, что могу использовать SNAT для соединений, но если я это сделаю, все соединения будут получены с одного и того же IP-адреса, что конфликтует с фильтрацией и ограничением скорости на основе IP-адреса источника.
Я могу DNAT подключать и направлять их через VPN-туннель, но это означает, что возвращаемые пакеты будут пытаться идти с маршрутом по умолчанию и IP-адресом источника службы и будут игнорироваться клиентами.
Есть ли способ с помощью Linux каким-либо образом пометить TCP-пакеты, которые были обработаны DNAT, чтобы возвращаемые пакеты могли маршрутизироваться обратно через VPN-туннель вместо маршрута службы по умолчанию?
Есть разные способы реализовать то, что вы хотите. Нарисуйте топологию вашей сети.
Для этого требуется только одно правило DNAT на S2 (сервер в новом DC) и дополнительная конфигурация маршрутизации на S1 (сервер в старом DC). Но это также требует, чтобы ваше приложение также принимало запросы на адрес туннеля VPN.
В S2
конфигурация сервера iptables:
iptables -t nat -A PREROUTING \
-i eth0 --dst <S2.IP> \
-p tcp --dport <APP.PORT> \
-j DNAT --to-address <S1.TUN.IP>:<APP.PORT>
Кроме того, вы должны включить переадресацию на S2
сервер (используйте sysctl -w net.ipv4.ip_forward=1
команду, чтобы включить его).
Проверка: используйте ip route get <S1.TUN.IP> from 8.8.8.8 iif <S2.IFACE>
и ip route get 8.8.8.8 from <S1.TUN.IP> iif <S2.TUN.IFACE>
команда. Он должен вернуть действительные маршруты.
В S1
конфигурация маршрутизации сервера:
ip route add 0/0 dev <TUN.IFACE> table 1
ip rule add from <S1.TUN.IP> lookup 1 pref 1000
LINUX отвечает на запрос с того же IP-адреса, по которому запрос был получен.
Проверка: используйте ip route get <S1.TUN.IP> from 8.8.8.8 iif <S1.TUN.IFACE>
и ip route get 8.8.8.8 from <S1.TUN.IP>
команды. Он также должен возвращать действительные маршруты. Может ты увидишь что-то вроде invalid cross-device link
. В этом случае вам следует настроить rp_filter
на интерфейсе туннеля vpn.
Детальное объяснение:
<C.IP>:<SOME.PORT> -> <S2.IP>:<APP.PORT>
.S2
сервер получает этот запрос, перезаписывает место назначения на <S1.TUN.IP>
. Это происходит до маршрутизации, поэтому после этого шага пакет сформируется <C.IP>:<SOME.PORT> -> <S1.TUN.IP>:<APP.PORT>
.S2
пересылает переписанный запрос через VPN-туннель из-за таблицы маршрутизации.S1
получает запрос через VPN-туннель на <S1.TUN.IP>
адрес.S1
обслуживает запрос и отвечает клиенту с адресом источника <S1.TUN.IP>
. Ответ <S1.TUN.IP>:<APP.PORT> -> <C1.IP>:<SOME.PORT>
.<S1.TUN.IP>
маршруты по таблице маршрутизации 1
. Итак, ответные пакеты из вашего приложения будут отправлены через VPN-туннель на S2
сервер.S2
получает ответы, производит обратный перевод исходного адреса, переписывая его с <S1.TUN.IP>
в <S2.IP>
. После того, как этот ответ станет <S2.IP>:<APP.PORT> -> <C.IP>:<SOME.PORT>
.<C.IP>
адрес назначения.Для устранения неполадок вы можете использовать tcpdump
.
Есть другой способ, более сложный. Опишу, если нужно.
На это был дан ответ в другом сообщении, хотя вопрос OP был не совсем таким.
Как установить отметку на пакете при его пересылке в таблице предварительной маршрутизации nat?
Первый блок кода показывает, как пометить пакеты, которые подвергаются DNAT'у в PREROUTING.
Надеюсь, это поможет, ура!