Назад | Перейти на главную страницу

DNAT без маршрута по умолчанию

У меня есть служба 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.

Детальное объяснение:

  1. Клиент отправляет запрос в виде <C.IP>:<SOME.PORT> -> <S2.IP>:<APP.PORT>.
  2. S2 сервер получает этот запрос, перезаписывает место назначения на <S1.TUN.IP>. Это происходит до маршрутизации, поэтому после этого шага пакет сформируется <C.IP>:<SOME.PORT> -> <S1.TUN.IP>:<APP.PORT>.
  3. S2 пересылает переписанный запрос через VPN-туннель из-за таблицы маршрутизации.
  4. S1 получает запрос через VPN-туннель на <S1.TUN.IP> адрес.
  5. Ваше приложение на S1 обслуживает запрос и отвечает клиенту с адресом источника <S1.TUN.IP>. Ответ <S1.TUN.IP>:<APP.PORT> -> <C1.IP>:<SOME.PORT>.
  6. По правилу маршрутизации все пакеты с адресом отправителя <S1.TUN.IP> маршруты по таблице маршрутизации 1. Итак, ответные пакеты из вашего приложения будут отправлены через VPN-туннель на S2 сервер.
  7. S2 получает ответы, производит обратный перевод исходного адреса, переписывая его с <S1.TUN.IP> в <S2.IP>. После того, как этот ответ станет <S2.IP>:<APP.PORT> -> <C.IP>:<SOME.PORT>.
  8. Переписанные ответы отправляются обратно клиенту по адресу <C.IP> адрес назначения.
  9. Клиент получает ожидаемый ответ.

Для устранения неполадок вы можете использовать tcpdump.

Есть другой способ, более сложный. Опишу, если нужно.

На это был дан ответ в другом сообщении, хотя вопрос OP был не совсем таким.

Как установить отметку на пакете при его пересылке в таблице предварительной маршрутизации nat?

Первый блок кода показывает, как пометить пакеты, которые подвергаются DNAT'у в PREROUTING.

Надеюсь, это поможет, ура!