Как перенести переадресацию только на один IP-адрес хоста

Краткий вопрос:

Как включить переадресацию портов только на один IP-адрес хоста?

Предыстория:

Мой сервер Centos 7 имеет 5 IP-адресов. Ранее у меня был Apache, который прослушивал все из них и различные домены, назначенные тем IP-адресам, которые были разрешены с помощью виртуальных хостов.

Я изменил Listen директива в httpd.conf, так что теперь apache слушает только 4 из IP-адресов

Используя node.js, я создал другой экземпляр сервера, но он не позволит мне прослушивать стандартный порт 80 без повышенных разрешений. Я не хочу запускать его с повышенными разрешениями.

Я хотел бы перенести порт 80 перенаправления на что-то вроде 8080, но только на один IP-адрес, не влияя на трафик, направленный на другие 4 IP-адреса. Важно, чтобы правило не влияло на трафик на других IP-адресах.

Я думаю, что решение будет выглядеть так:

firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent

Другие вопросы и ответы, которые я нашел, имеют отношение к исходным IP-адресам вместо IP-адресов узлов.

4 ответа

Решение

Зона firewalld может быть указана либо по интерфейсу, либо по адресу источника, но вы хотите фильтровать по адресу назначения. Вам понадобится богатое правило для решения этой конкретной ситуации.

Такое богатое правило может выглядеть так:

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" destination address="198.51.100.237" forward-port port="80" protocol="tcp" to-port="8080"'

Увидеть firewalld.richlanguage(5) Справочная страница для документации по богатым правилам.

Как только ваше богатое правило сработает, не забудьте сделать его постоянным с

firewall-cmd --runtime-to-permanent

или добавление --permanent на предыдущий вызов.

Я бы настроил обратный прокси с разными портами для разных доменов, но с одинаковым IP-адресом. На странице конфигурации httpd я добавил бы директивы Listen для каждого порта (например: Listen 80, Listen 8081, Listen 8082 и т. Д.), Включил порт конфигурации vhosts на странице конфигурации httpd и обновил страницу конфигурации vhosts в соответствии с портами.

Примечание: я признаю, что предлагаю странное и, возможно, неподдерживаемое решение, которое может сломаться в будущем firewalld версии. Тем не менее, он, безусловно, будет работать на сервере CentOS 7.

Я предлагаю вам напрямую добавить такое правило переадресации портов в iptables/ip6tables стек. Вы можете достичь этого с помощью firewalldпрямые правила. Например:

# firewall-cmd --permanent --direct --add-rule ipv4 nat PRE_public_allow 0 \
    --destination 11.22.33.44 --protocol tcp --destination-port 80 \
    --jump REDIRECT --to-ports 8080

# firewall-cmd --permanent --direct --add-rule ipv6 nat PRE_public_allow 0 \
    --destination 11:22:33:44:55:66:77:88 --protocol tcp --destination-port 80 \
    --jump REDIRECT --to-ports 8080

Я понял, что CentOS firewalld создает PRE_<zone>_allow цепь в nat таблица для каждой активной зоны, которая оценивается при поступлении пакетов, соответствующих определениям зоны. Так iptables/ip6tables правила могут быть добавлены там.

Предположим, что из пяти ваших IP-адресов один 192.0.2.3, на который вы хотите перенаправить порт 80. Ты можешь использовать iptables перенаправить порты на этот IP-адрес так:

iptables -t nat -A PREROUTING -d 192.0.2.3 -p tcp --dport 80 -j REDIRECT --to-ports 8080

Это должно оставить все ваши другие адреса без изменений. Если программа связывается с портом 80 по всем адресам, 192.0.2.3 будет по-прежнему перенаправлять на порт 8080, поскольку он перенаправляется до маршрутизации.

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