我认为我使用的技术是错误的,但不确定是否正确。
计算机:Red Hat 版本 7.2
防火墙d.noarch:0.3.9-14.el7
我被要求关闭两个端口,但确保其他所有端口都打开。解决方案需要易于打开和关闭。为此,我做了:
启动firewalld
设置“trusted”为默认区域#Trusted 开放所有端口
firewall-cmd --zone=trusted --add-interface=eno16780032 # 此服务器上仅有以太网接口。
为了测试目的,执行 nc -l port_number 以使某些东西在该端口上应答。
测试方式:转到另一台机器,执行“telnet machine_name port_number”并观察是否收到响应。(每次测试后重新启动 nc。)
关闭端口:
- 防火墙cmd --zone=trusted --remove-port 端口号/tcp
核实:
- 防火墙cmd --zone=trusted --query-port 端口号/tcp
返回“否”
此时,nc 应该正在监听 port_number,但它应该被防火墙阻止。我应该无法连接到它。
但是,来自不同机器的“telnet machine_name port_number”仍然可以连接。
此时我甚至没有尝试让它持久化,只是尝试让规则发挥作用。我做错了什么?
应用程序:我们有一个自主开发的后端服务,以主/从配置运行。从服务器始终处于运行状态,以便与主服务器同步数据。前端只能使用指定为“主”的系统。(开发人员告诉我,要使其成为真正的集群需要做太多工作。)
“云”中有一个负载均衡器(我们无法直接控制它),它指向两台机器。目标是阻塞从属机器上的两个关键端口,以便负载均衡器始终转到主机器。当我们进行故障转移时,“从属机器”(现在是主机器)上的端口将解除阻塞,“主机器”(现在是从属机器)上的端口将被阻塞,从而迫使负载均衡器转到新的主机器。
这可能不是负载平衡器或防火墙的良好用途,但这是一个奇怪的应用程序,我们只是试图找到一些可行的方法,既不涉及干扰负载平衡器,也不关闭从属服务器上的服务。
有任何想法吗?
答案1
我记得背后的理念firewalld
是关闭所有端口,只打开您需要的端口。所以您尝试做的只是相反的事情。因此,像这样的命令--add-port
将添加指定为打开的端口。
例如,添加端口 80 只会添加另一条ACCEPT
规则,iptables
但由于区域的目标trusted
已经ACCEPT
存在,因此这条规则毫无意义。
$ firewall-cmd --zone=trusted --add-port=80/tcp
$ iptables -L -n | grep 80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW
如果您使用 删除端口--remove-port
,也会是一样的,如果未配置相应的端口,则会给出提示。
$ firewall-cmd --zone=trusted --remove-port 80/tcp
success
$ firewall-cmd --zone=trusted --remove-port 80/tcp
Warning: NOT_ENABLED: '80:tcp' not in 'trusted'
success
firewalld
还提供了rich-rules
可用于您想要实现的目标的功能。
以下命令将关闭端口80/TCP。
firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" reject'
如果您想允许单个 IP 地址连接到该端口,您可以添加source
。
firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.1" port port="80" protocol="tcp" reject'firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.1" port port="80" protocol="tcp" reject'
该source
参数还接受 CIDR 表示法的子网。
firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.1" port port="80" protocol="tcp" reject'firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.0/24" port port="80" protocol="tcp" reject'