Направляйте обратный трафик на правильный шлюз в зависимости от услуги
В моей офисной сети у меня есть два интернет-соединения и один сервер 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.
Надеюсь это поможет.