Направляйте обратный трафик на правильный шлюз в зависимости от услуги

В моей офисной сети у меня есть два интернет-соединения и один сервер CentOS с веб-сайтом (HTTPS на порту 443). Веб-сайт должен быть общедоступным через общедоступный IP-адрес первого интернет-соединения (ISP-1). Другое интернет-соединение, ISP-2, идентифицирует шлюз по умолчанию в сети. Оба интернет-соединения имеют маршрутизаторы (бытовые) с NAT, межсетевыми экранами SPI и т. Д. Маршрутизатором на ISP-2 является Netgear WNDR3700 (он же N600) с оригинальной прошивкой.

Проблема в том, что сайт недоступен. Похоже, что входящий трафик на ISP-1 достигнет сервера, но возвращаемый трафик направляется через ISP-2, что делает сайт недоступным. Насколько я могу сказать, я не могу сделать маршрутизацию на основе портов на WNDR3700.

Какие у меня есть варианты сделать эту работу? Я смотрел на реализацию решения на основе iptables / маршрутизации на самом сервере, но не смог заставить эту работу.

Обновление: обратите внимание, что сервер имеет один сетевой интерфейс, соединяющий его с обоими маршрутизаторами.

5 ответов

Решение

Если я правильно понимаю ваши намерения, вы хотите, чтобы ваш веб-сервер обычно использовал ISP-2 в качестве шлюза по умолчанию для исходящего трафика, за исключением его ответов на внешние веб-запросы, которые вместо этого должны проходить через ISP-1. Вот эскиз решения, использующего политику маршрутизации:

echo "101 webtraffic" >> /etc/iproute2/rt_tables

ip route add default table webtraffic via $ISP1_GW_LAN_IP
ip rule add fwmark 1 table webtraffic
iptables -t mangle -A OUTPUT -d \! $LAN_NET_PREFIX \
                             -p tcp -m tcp --sport 443 \
                             -j MARK --set-mark 1

где:

  • LAN_NET_PREFIX является префиксом сети вашей локальной сети (например, 192.168.100.0/24), и
  • ISP1_GW_LAN_IP IP-адрес локальной сети вашего шлюза для ISP-1 (например, 192.168.100.100).

Первый ip Команда устанавливает маршрут по умолчанию на webtraffic таблица к вашему шлюзу ISP-1, а вторая гарантирует, что пакеты помечены 1 маршрутизируются с использованием webtraffic Таблица. Наконец, iptables Правило помечает соответствующие исходящие пакеты, гарантируя, что их следующий переход будет к ISP-1.

Вот альтернативное решение, которое использует экспериментальный iptables модуль, цель МАРШРУТА:

iptables -t mangle -A POSTROUTING -d \! $LAN_NET_PREFIX \
                                  -p tcp -m tcp --sport 443 \
                                  -j ROUTE --gw $ISP1_GW_LAN_IP

Это правило будет отменять решение о маршрутизации исходящих веб-пакетов ответа, отправляя их на ваш шлюз ISP-1, а не на ISP-2 по умолчанию. Весь другой трафик, включая веб-ответы клиентам в вашей локальной сети, не будет затронут. Как было отмечено в комментариях, цель ROUTE, скорее всего, не будет реализована ни в одной системе, которая явно не исправила ее в ядре, поскольку она является экспериментальной.

У меня была такая же проблема, но я решил только с iproute2 (исходная маршрутизация). Маркировка с помощью iptables не нужна:

echo "101 webtraffic" >> /etc/iproute2/rt_tables
ip route add default table webtraffic via $ISP1_GW_LAN_IP
ip rule add from $ISP1_IP table webtraffic

Дело в том, что не только Интернет может использовать соединение ISP1. Вы можете выбрать. Это хорошо, потому что вы можете подключиться к серверу из ssh с обоих подключений, если кто-то потерпит неудачу. Как пользователь CentOS я создал следующие файлы, чтобы мои изменения не были потеряны после перезагрузки:

echo "default table webtraffic via $ISP1_GW_LAN_IP" >> /etc/sysconfig/network-scripts/route-eth1
echo "from $ISP1_IP table webtraffic" >> /etc/sysconfig/network-scripts/rule-eth1

Это называется асинхронной маршрутизацией. Вы должны указать шлюз по умолчанию веб-сервера на IP-адрес маршрутизатора на ISP-1. Если клиенты, обращающиеся к веб-серверу, пришли с одного и того же IP-адреса, вы можете направить его без изменения шлюза по умолчанию или же вы можете внедрить NAT на шлюзе ISP1, чтобы он действовал как обратный прокси-сервер, а затем направить его на веб-сервер. С уважением.

Предполагая, что ваш веб-сервер находится в той же подсети, что и ваши рабочие станции, почему бы просто не настроить разделенный DNS, чтобы на вашем сайте yourwebsite.com разрешался внутренний IP-адрес? Конечно, побеждает сложную асинхронную маршрутизацию.

Кроме того, инвестирование в маршрутизатор, который может поддерживать несколько подключений к глобальной сети, значительно упростит вам жизнь (и позволит вам выполнить балансировку нагрузки / переключение между двумя подключениями к Интернету).

Брандмауэр люди делают внутри nat, чтобы справиться с этой проблемой. Входящее соединение настроено на межсетевой экран внутри адреса интерфейса и поэтому не имеет проблем с маршрутизацией на сервере.

Если оба входящих соединения оказываются в одном интерфейсе с одним и тем же IP-адресом, у вас очень ограниченные (нет?) Варианты. Посмотрите, можете ли вы получить другой IP для того же компьютера / интерфейса и иметь одно входящее соединение на одном IP и еще одно входящее на другом IP. После этого вы можете легко выполнить маршрутизацию исходного кода.

Если вы не можете подключить разные источники к разным IP-адресам, вы можете использовать iptables mac для перенаправления пакетов в зависимости от MAC, с которого они пришли.

   [!] --mac-source address
          Match  source  MAC  address.    It   must   be   of   the   form
          XX:XX:XX:XX:XX:XX.   Note that this only makes sense for packets
          coming from an Ethernet device and entering the PREROUTING, FOR‐
          WARD or INPUT chains.

Надеюсь это поможет.

Другие вопросы по тегам