Назад | Перейти на главную страницу

Как выполнить переадресацию портов только на 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-адресами хостов.

Зона 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-адресов один 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, так как он перенаправляется до маршрутизации.

Примечание: я признаю, что предлагаю странное и, возможно, неподдерживаемое решение, которое может выйти из строя в будущем. 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-адресом. На странице конфигурации httpd я бы добавил директивы Listen для каждого порта (например: Listen 80, Listen 8081, Listen 8082 и т. Д.), Включил порт конфигурации vhosts в страницу конфигурации httpd и обновил страницу конфигурации vhosts в соответствии с портами.