Centos 7 не может перенаправить порт

У меня есть два сервера под управлением 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-адреса.

0
задан 1 January 2018 в 07:10
2 ответа

Установка цели для внутренней зоны на ПРИНЯТЬ устранила эту проблему для меня.

I.E. firewall-cmd --permanent --zone = internal --set-target = ACCEPT

Признаюсь, я как-то пропустил эту настройку на сервере B. Тем не менее, мне кажется немного странным, что исходящие соединения не используются Не принимается по умолчанию для цели по умолчанию .

0
ответ дан 5 December 2019 в 06:56

Очевидно, что убедитесь, что ваш WAN-маршрутизатор, каким бы он ни был, отправка входящего трафика через порт 80 на нужный сервер.

0
ответ дан 5 December 2019 в 06:56

Теги

Похожие вопросы