从_Noroutetohost_到firewall命令

情景:主机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系统。

更多内容自行查之。