情景:主机A和主机B可以相互ping通,但主机A无法访问主机B上运行的某服务,服务的端口是11486。主机A访问主机B时报错如下:
curl访问失败
curl: (7) Failed to connect to 192.168.56.4 port 11486: No route to host
像这种可ping通但访问服务时报“ No route to host”/“没有到主机的路由”的情况,首先要考虑是否防火墙原因,服务端口是否可用?
查看某个端口是否开启命令:firewall-cmd --query-port=11486/tcp
查看端口是否启用
可见11486端口未启用。
那么,启用11486端口就好了。如何启用某个端口呢?
永久开启某端口:firewall-cmd --add-port=11486/tcp --permanent
永久启用端口
查看全体端口命令:firewall-cmd --list-ports
永久启用端口
添加端口后,firewall-cmd --list-ports并未显示新增的端口,这是因为永久修改(--permanent)配置文件需要重新加载。
重新加载命令:firewall-cmd --reload
临时添加端口,不涉及修改配置文件,命令后立即生效,如:
[root@wen zones]# firewall-cmd --add-port=11911/tcp
success
[root@wen zones]# firewall-cmd --list-ports
11418/tcp 11417/tcp 11415/tcp 11486/tcp 11911/tcp 11416/tcp
回到本文开头,如果能ping通,但若报"Connection refused"/“连接被拒绝”的错,就不是防火墙原因了,这很可能是服务(进程)未开启导致的。
服务未开启报此错
前面说了几个firewall-cmd命令,提到了永久修改。那么永久修改的配置文件在哪里呢
这里要引出zone这个概念了。
firewalld中为了灵活设置规则,引入了zone,每个zone代表一个规则集,对应<zone名>.xml配置文件,位置在/etc/firewalld/zones目录下,文件名即是zone名称。像前面命令添加或删除端口没有指明作用到哪个zone上,实际是作用到默认zone上。
firewall支持多种zone。可通命令firewall-cmd --get-zones查看。
查看zone
哪个zone是默认的呢,网上有文章说默认public,但本人实测默认zone是不确定的,与系统有关。在centos7.6上默认public,在fedora21上默认zone是FedoraServer。
默认zone是可以查询到的,
查询默认zone命令:firewall-cmd --get-default-zone
查看默认zone
当默认zone是FedoraServer时,前面永久开启/停用端口命令修改的是/etc/firewalld/zones/FedoraServer.xml文件。
FedoraServer.xml示例
同理,当默认zone是public时,永久开启/停用端口命令修改的是/etc/firewalld/zones/public.xml文件。
默认zone也是可以修改的,
更改默认zone命令:firewall-cmd --set-default-zone=public
更改默认zone为public
firewall-cmd --set-default-zone=xxx命令,会把修改写到
/etc/firewalld/firewalld.conf 和etc/firewalld/firewalld-server.conf文件,里面记录默认zone。
在知道了firewall的zone概念后,就可以在命令中加入--zone=xxx参数,更灵活地控制规则,如:
为某个zone添加端口
下面列出几个常用的命令:
在多网卡服务器中,可以为将某个zone应用到指定网卡上,如:firewall-cmd --zone=public --add-interface=eth1 --permanent
[root@wen log]# systemctl stop firewalld
[root@wen log]# systemctl start firewalld.service
[root@wen log]# systemctl disable firewalld 取消开机启动
[root@wen log]# systemctl enable firewalld 开机启动
disable/enable firewalld
端口转发
[root@wen zones]# firewall-cmd --zone=public --add-forward-port=port=2100:proto=tcp:toport=3100 --permanent
加端口转发
删除端口转发
[root@wen zones]# firewall-cmd --zone=public --remove-forward-port=port=2100:proto=tcp:toport=3100 --permanent
删除端口转发
转发数据到某IP
转发到某IP
转发数据到某IP结果
删除到192.168.56.2的数据转发规则:
firewall-cmd --zone=public --remove-forward-port=port=2100:proto=tcp:toaddr=192.168.56.2 --permanent
转发数据到某IP的某个端口:
firewall-cmd --zone=public --add-forward-port=port=2100:proto=tcp:toport=3100:toaddr=192.168.56.2 --permanent
转发数据到某IP某端口
本文所用截图均来自fedora21系统。
更多内容自行查之。