В моей офисной сети у меня есть два подключения к Интернету и один сервер CentOS, на котором работает веб-сайт (HTTPS на порту 443). Веб-сайт должен быть общедоступным через общедоступный IP-адрес первого подключения к Интернету (ISP-1). Другое подключение к Интернету, ISP-2, идентифицирует шлюз по умолчанию в сети. Оба интернет-соединения имеют маршрутизаторы (бытовые) с NAT, межсетевые экраны SPI и т. Д. Маршрутизатор на ISP-2 - Netgear WNDR3700 (он же N600) с оригинальной прошивкой.
Проблема в том, что сайт недоступен. Похоже, что входящий трафик от ISP-1 достигнет сервера, но возвращающийся трафик направляется через ISP-2, что фактически делает сайт недоступным. Насколько я могу судить, я не могу выполнять маршрутизацию на основе портов на WNDR3700.
Какие у меня есть варианты, чтобы это работало? Я искал реализацию решения на основе iptables / routing на самом сервере, но не смог заставить это работать.
Обновить: Обратите внимание, что у сервера есть один сетевой интерфейс, соединяющий его с обоими маршрутизаторами.
У меня была такая же проблема, но я решил только с помощью 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
Если я правильно понимаю ваши намерения, вы хотите, чтобы ваш веб-сервер обычно использовал 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
rule отмечает соответствующие исходящие пакеты, гарантируя, что их следующий переход будет направлен к 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, скорее всего, не будет реализована в какой-либо системе, которая явно не пропатчила ее в ядре, так как это экспериментальный.
Это называется асинхронной маршрутизацией. Вы должны указать шлюз по умолчанию веб-сервера на IP-адрес маршрутизатора на ISP-1. Если клиенты, которые обращаются к веб-серверу, пришли с одного и того же IP-адреса, вы можете маршрутизировать его, не меняя шлюз по умолчанию, или вы можете реализовать NAT на шлюзе ISP1, чтобы он действовал как обратный прокси, а затем маршрутизировал его на веб-сервере. С уважением.
Люди брандмауэра делают внутри нат, чтобы решить эту проблему. Входящее соединение привязано к адресу внутреннего интерфейса межсетевого экрана и, следовательно, не имеет проблем с маршрутизацией на сервере.
Если оба входящих соединения попадают в один интерфейс с одним и тем же 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.
Надеюсь это поможет.
Предполагая, что ваш веб-сервер находится в той же подсети, что и ваши рабочие станции, почему бы просто не настроить разделенный DNS, чтобы внутри yourwebsite.com разрешался его внутренний IP-адрес? Несомненно, превосходит сложную асинхронную маршрутизацию.
Кроме того, приобретение маршрутизатора, который может поддерживать несколько подключений к глобальной сети, значительно упростит вам жизнь (и позволит вам выполнять балансировку нагрузки / переключение между двумя подключениями к Интернету).