如何仅在单个主机 IP 地址上进行端口转发

如何仅在单个主机 IP 地址上进行端口转发

简短问题:

如何仅在单个主机 IP 地址上启用端口转发?

背景故事:

我的 Centos 7 服务器有 5 个 IP 地址。之前我让 apache 监听所有 IP 地址,并将各种域名分配给这些 IP 地址,这些域名通过虚拟主机进行解析。

我修改了Listenhttpd.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 配置页面。

相关内容