首先,如果这个问题之前已经问过,我深感抱歉,但是我无法通过 SE 上提供的信息找到任何答案。
我的情况如下:我有一台 CentOS 7 服务器,它位于最前端,提供多项服务。它连接到一个公共以太网端口 (eno1) 和一个 LAN 以太网端口 (eno2),连接到 LAN 的是第二台服务器,我想通过某个端口将流量转发到该服务器。
FirewallD 提供端口转发功能,并且能够正常工作。到目前为止,一切顺利!但是,我遇到了一个主要问题:我想限制谁可以通过公共 IP 访问该转发服务,但我一直无法解决这个问题,因为 FirewallD 似乎在功能上过于简单。如果您只想向所有人开放一项服务,那么这很好,但如果您只想向特定范围开放它,那么就不太好。另一个问题是,在 LAN 上的目标服务器上,转发流量的所有源 IP 都是网关服务器的 LAN 地址 (10.0.0.1)。这意味着我也无法通过 IP 过滤目标服务器上的流量,从而使服务向全世界开放(我不想这样)
有没有办法用firewalld来做到这一点?我曾尝试用iptables手动完成,但不得不承认失败。根据我找到的所有信息,我从未让转发起作用...
澄清:
Internet ->(eno1,公网IP)->Centos ->(eno2,10.0.0.1)->目标服务器(10.0.0.2)
答案1
在迈克尔·汉普顿(感谢!)的帮助下,我设法弄明白了这一点,并回答了我自己的问题。
您需要的是一个通过添加范围来定义的单独区域:
firewall-cmd --new-zone=special --permanent
firewall-cmd --reload
firewall-cmd --zone=special --add-source=12.34.56.78/32 --permanent
firewall-cmd --zone=special --add-source=12.34.56.88/32 --permanent
firewall-cmd --zone=special --add-source=12.34.99.0/24 --permanent
然后加全部您的民众区域到这个新区域(基本上复制它的配置)并最后添加转发端口规则仅限新区域使用(例如 http 代理):
firewall-cmd --zone=special --add-forward-port=port=8080:proto=tcp:toaddr=10.0.0.2 --permanent
然后发出最终重新加载以应用:
firewall-cmd --reload
瞧:范围 12.34.56.78/32 12.34.56.88/32 和 12.34.99.0/24 现在可以访问示例代理服务,但其他人则不能。
更新
重要提示:这些步骤适用于入站流量但要让防火墙充当包括出站在内的 NAT 路由器需要做更多工作(我还没能让它工作……)。如果有人有更完整的解决方案,允许入站和出站通过防火墙服务器工作,我会很乐意将其标记为可接受的答案!
OT:我最终还是使用了 IPTables,它让我可以进行端口转发和一旦我弄清楚我做错了什么(我在 FORWARD 链中没有出站规则... >.> <.<),NAT 就不会有太多问题,并且它允许对每条规则的范围进行精细控制(额外的好处是我可以从 Webmin 执行所有操作 :P)。由于这与主题无关,我将保持原样。