简短的问题:
如何仅在单个主机 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 区域,但您希望按目标地址进行过滤。您需要一个丰富的规则来处理这种特殊情况。
如此丰富的规则可能如下所示:
有关丰富规则的文档,请参见
firewalld.richlanguage(5)
手册页。一旦你的丰富规则起作用了,记得让它永久化
或添加
--permanent
到先前的调用。假设在您的五个 IP 地址中,有一个是
192.0.2.3
,您希望在其上转发端口 80。您可以使用iptables
转发此 IP 地址上的端口,如下所示:这应该不会影响您的所有其他地址。如果程序在所有地址上绑定到端口 80,
192.0.2.3
仍将重定向到端口 8080,因为它在路由之前被重定向。注意:我承认我提出了一个奇怪且可能不受支持的解决方案,它可能会在未来的
firewalld
版本中被破坏。尽管如此,它肯定可以在 CentOS 7 服务器上运行。我建议你直接将这样的端口转发规则添加到
iptables
/ip6tables
堆栈中。您可以通过使用firewalld
's 直接规则来实现。例如:我认为 CentOS会在表中为每个活动区域
firewalld
创建一个PRE_<zone>_allow
链,nat
当与区域定义匹配的数据包到达时会对其进行评估。所以iptables
/ip6tables
规则可以在那里添加。我会为不同的域配置不同的端口但IP地址相同的反向代理。在 httpd 配置页面中,我将为每个端口添加 Listen 指令(例如:Listen 80、Listen 8081、Listen 8082 等),在 httpd 配置页面中包含 vhosts 配置端口并根据端口更新 vhosts 配置页面。