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