У меня есть два сервера под управлением CentOS 7 с общедоступными IP-адресами, которые также подключены к одной локальной сети. На сервере A есть несколько виртуальных машин, на одну из которых я пытаюсь перенаправить порт 80. Я делаю это с помощью firewall-cmd
, и моя сетевая карта WAN присоединена к внешней зоне в обоих случаях (LAN является внутренней зоной). Это, конечно, означает, что маскарад включен (так как это значение по умолчанию для внешнего). Я также проверил (как минимум дюжину раз), чтобы убедиться, что для параметра ip_forwarding
установлено значение 1 и что этот параметр сохраняется после перезагрузки.
Вот результат выполнения команды firewall-cmd - -list-all
на сервере A:
external (active)
target: default
icmp-block-inversion: no
interfaces: em1
sources:
services:
ports:
protocols:
masquerade: yes
forward-ports: port=80:proto=tcp:toport=80:toaddr=192.168.11.1
source-ports:
icmp-blocks:
rich rules:
Насколько мне известно, это должно работать, но это не так. Для тестирования я запускаю nc -vl 80
на виртуальной машине, и nc -v [внешний IP] 80
на внешнем сервере. Время ожидания соединения истекло.
Та же самая конфигурация на сервере B работает отлично. Я могу отправлять и получать текст с помощью netcat без проблем.
Вот схема сети для некоторых дополнительных деталей:
WAN
|
_____Switch_____
/ \
em1 enp1s0
| | zone: external
+----------+ +----------+ ---------------
| Server A | | Server B |
+----------+ +----------+ ---------------
| | zone: internal
bridge1 bridge1
| | |
| em2 enp3s0
| \____Switch_____/
|
vnet0
+--------+
| Web VM |
+--------+
Конфигурация сети выполняется с помощью скриптов с NM_CONTROLLED = no
на всех интерфейсах для обоих серверы. Оба сервера также имеют одинаковую конфигурацию (очевидное различие заключается в IP-адресах).
Установка SELinux на разрешающую способность ничего не меняет (она включена на сервере B без проблем, а сервер A не имеет никаких соответствующих отказов, отображаемых в журналах аудита. в любом случае)
Я могу направить трафик через netcat, например, на сервере A: nc -vl 80 | nc -v 192.168.11.1 80
, и он отлично работает. Я также могу просто открыть порт 80 на сервере A и без проблем слушать оттуда. Так что проблема здесь строго в пересылке.
Я запустил iptables -t nat -S
, чтобы просмотреть загруженные правила, и вижу следующее:
-A PRE_external_allow -p tcp -m mark --mark 0x66 -j DNAT - к месту назначения 192.168.11.1:80
Когда я запускаю iptables -t nat -vnL | grep: 80
Я вижу, что счетчик пакетов увеличивается, когда я пытаюсь подключиться (хотя опять же, время ожидания соединения истекло), поэтому я знаю, что срабатывает правило.
Я пробовал перенаправить порт на другое устройство в сети, не расположенной ни на одном сервере, с одинаковыми результатами (сервер B работает, сервер A выходит из строя).
Сервер A только сейчас подключается к WAN в первый раз, поэтому я не знаю, была ли пересылка когда-либо работал в прошлом.
Что касается основных различий, я могу думать только о следующем:
Оба сервера работают с разными версиями ядра (сервер A находится на 3.10.0-693.11.1.el7. x86_64
, сервер B находится на 3.10.0-514.26.2.el7.x86_64
). Однако я попытался запустить старое ядро на сервере A, но это не помогло. t решить проблему (поэтому я относительно уверен, что это не ошибка ядра, если только она не связана с драйверами сетевого адаптера, хотя это все равно было бы странно).
На сервере A работает firewalld v0.4.4.4, а Сервер B находится на v0.4.3.2. Я еще не пробовал откатиться до v0.4.3.2 на сервере A (yum не может найти эту версию пакета).
Как вы уже догадались, на сервере B не было крупных обновлений с августа . Как бы мне ни хотелось, я не решаюсь обновлять его на данный момент из опасения, что пересылка также прервется (будьте уверены, я обновлюсь в конце концов. Надеюсь, что скоро). К сожалению, это означает, что существует чрезвычайно большое количество пакетов с более новыми версиями на сервере A. Простое сравнение версий пакетов приведет к тому, что нужно будет просмотреть много информации. -A POSTROUTING_ZONES -o bridge1 -g POST_internal -A POSTROUTING_ZONES -o em2 -g POST_internal -A POSTROUTING_ZONES -g POST_external -A PREROUTING_ZONES -i em1 -g PRE_external -A PREROUTING_ZONES -i bridge1 -g PRE_internal -A PREROUTING_ZONES -i em2 -g PRE_внутренний -A PREROUTING_ZONES -g PRE_external
Сервер B
-A POSTROUTING_ZONES -o enp1s0 -g POST_external
-A POSTROUTING_ZONES -o bridge1 -j POST_internal
-A POSTROUTING_ZONES -o enp3s0 -j POST_internal
-A POSTROUTING_ZONES -g POST_external
-A PREROUTING_ZONES -i enp1s0 -g PRE_external
-A PREROUTING_ZONES -i bridge1 -j PRE_internal
-A PREROUTING_ZONES -i enp3s0 -j PRE_internal
-A PREROUTING_ZONES -g PRE_external
Сервер B использует jump
для внутренней зоны, а сервер A использует goto
. Это могло быть из-за разницы в версии firewalld, и это единственное, о чем я могу думать на данный момент, что может вызвать эту проблему (хотя я все еще считаю это маловероятным, поскольку это связано с внутренней зоной).
И то, и другое. на серверах установлен и настроен докер. Контейнеры на сервере A предназначены только для внутреннего использования. Некоторые контейнеры на сервере B имеют переадресацию портов в Интернет (настраивается с помощью docker run
). Сервер B также работает под управлением OpenVPN.
Единственное, что я могу придумать, чтобы отметить, это то, что аппаратное обеспечение серверов сильно различается (сервер A - это Dell T420, сервер B - это кастомный LGA 775, поэтому только настольное оборудование).
Я уже начинаю сойти с ума. Я' Я даже пробовал включить маскировку во внутренней зоне, как я видел в другом месте (что не имеет никакого смысла и, к удивлению, не решило проблему).
Что мне здесь не хватает? ] Пытался перенаправить локально на другой порт на сервере A (например, firewall-cmd --zone = external --add-forward-port = port = 80: proto = tcp: toaddr = 192.168.11.3: toport: 81
). Я могу подключиться к порту 80 при прослушивании с помощью netcat на сервере A на порту 81, поэтому локальная переадресация работает нормально. Просто не могу пересылать на другие IP-адреса.
Установка цели для внутренней зоны на ПРИНЯТЬ устранила эту проблему для меня.
I.E. firewall-cmd --permanent --zone = internal --set-target = ACCEPT
Признаюсь, я как-то пропустил эту настройку на сервере B. Тем не менее, мне кажется немного странным, что исходящие соединения не используются Не принимается по умолчанию для цели по умолчанию
.
Очевидно, что убедитесь, что ваш WAN-маршрутизатор, каким бы он ни был, отправка входящего трафика через порт 80 на нужный сервер.