Порт Centos firewall-cmd, перенаправляющий на диапазон портов Dest, не работает

Я пытаюсь настроить правило firewalld для пересылки 80/tcp на 8080-8081, правило было настроено правильно, но, кажется, только частично работает.

Проблема в том, что трафик всегда пересылается на 8080, а не на 8081, что-то не так?

Ниже мой env:

  • создать два http-сервера на 192.168.30.30, прослушивая на 8080 и 8081
  • установить правило firewalld для перенаправления порта

    firewall-cmd --add-forward-port='port=80:proto=tcp:toport=8080-8081' --permanent

  • от клиента, curl http://192.168.30.30/ (который всегда перенаправляет на порт 8080)

ниже мои настройки firewalld:

firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: ssh dhcpv6-client
  ports: 80/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=80:proto=tcp:toport=8080-8081:toaddr=
  source-ports: 
  icmp-blocks: 
  rich rules:

sysctl -a | grep ip_forward

net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0

1 ответ

tl;dr Firewalld не указывает при использовании диапазона DNAT.

Диапазон портов передается в iptables/ nftablesкоторый, в свою очередь, использует отслеживание соединений в ядре. Отслеживание соединений - это то, что на самом деле делает DNAT (прямой порт). Он выбирает порт из диапазона. По умолчанию поиск выполняется линейно. Поэтому, если отслеживание соединений в настоящее время не имеет записи для кортежа (dip, sip, dprot, sport и т. Д.), То будет использоваться. Только если все пары ( 8080, спорт) уже используются, только потом будет dport 8081 быть на рассмотрении.

Вы должны подать апстрим о проблеме с firewalld . Я думаю, используя random в сгенерированном правиле DNAT даст ожидаемые результаты.

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