简短问题:
如何仅在单个主机 IP 地址上启用端口转发?
背景故事:
我的 Centos 7 服务器有 5 个 IP 地址。之前我让 apache 监听所有 IP 地址,并将各种域名分配给这些 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 地址。
答案1
防火墙区域可以通过接口或来源地址,但你想过滤目的地地址。您需要一个丰富的规则来处理这种特殊情况。
如此丰富的规则可能如下所示:
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
到前一次调用。
答案2
假设您的五个 IP 地址中有一个是192.0.2.3
,您希望转发该 IP 地址上的端口 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,因为它在路由之前已重定向。
答案3
注意:我承认我提出的解决方案很奇怪,可能不受支持,在未来的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
答案4
我将为不同的域配置具有不同端口但 IP 地址相同的反向代理。在 httpd 配置页面中,我将为每个端口添加 Listen 指令(例如:Listen 80、Listen 8081、Listen 8082 等),在 httpd 配置页面中包含 vhosts 配置端口,并根据端口更新 vhosts 配置页面。