Linux Firewall详细讲解

 


 

firewalld和iptables的关系

firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。

 

firewalld的配置模式

firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置

 

 

 

1、/etc/firewalld/

2、/usr/lib/firewalld/

 

使用时的规则是这样的:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。

 

firewalld的这种配置文件结构的主要作用是这样的:在第二个目录中存放的是firewalld给提供的通用配置文件,如果我们想修改配置,那么可以copy一份到第一个目录中,然后再进行修改。这么做有两个好处:首先我们日后可以非常清晰地看到都有哪些文件是我们自己创建或者修改过的,其次,如果想恢复firewalld给提供的默认配置,只需要将自己在第一个目录中的配置文件删除即可,非常简单,而不需要像其他很多软件那样在修改之前还得先备份一下,而且时间长了还有可能忘掉之前备份的是什么版本。

 

zone

firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib/firewalld/zones/”目录下。这些zone之间是什么关系?他们分别适用用哪些场景呢?

 

public.xml

 

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
</zone>

 

service

 

service配置文件的命名规则是<服务名>.xml,比如ssh的配置文件是ssh.xml,http的配置文件是http.xml等,他们默认保存在“/usr/lib/firewalld/services/”目录下,常见的服务其中都可以找到,如果我们想修改某个服务的配置,那么可以复制一份到“/etc/firewalld/services/”目录下然后进行修改就可以了,要想恢复默认配置直接将我们自己的配置文件删除就可以了。

 

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

 

firewall的这个service做的很好,比如我们要开启http,其实就是80端口,我们直接
[root@timophp.com ~]# firewall-cmd --add-service=http --permanent
[root@timophp.com ~]# firewall-cmd --reload
即可

 

http://www.excelib.com/article/287/show/

 

firewall基本操作

 

启动
[root@timophp.com ~]# systemctl start firewalld

停止
[root@timophp.com ~]# systemctl stop firewalld

重启
[root@timophp.com ~]# systemctl restart firewalld

查询状态
[root@timophp.com ~]$ systemctl status firewalld

另外,对于firewalld来说还可以使用自身的firewall-cmd工具来查询运行状态
[root@timophp.com ~]$ firewall-cmd --state

启用开机自动启动
[root@timophp.com ~]$ systemctl enable firewalld

禁用开机自动启动
[root@timophp.com ~]$ systemctl disable firewalld

查看自动启动状态
[root@timophp.com ~]$ systemctl is-enabled firewalld

 

更新规则

 

直接使用firewall-cmd修改的规则是不需要更新就可以直接生效的,但是如果加了--permanent参数,或者直接编辑xml文件之后就需要我们手动reload了,firewall-cmd提供了两个更新规则的参数:--reload和--complete-reload,前者只是更新需要更新规则,而且更新的过程中不会影响现有的连接,而后者在更新时会将所有的规则清除掉然后重建,而且为了安全考虑,在更新之前首先会将策略设置为DROP,等更新完成之后再恢复为ACCEPT,这样就会对现有连接造成影响,所以如果没有特殊需求我们应该尽量使用前者。具体命令如下

 

[root@timophp.com ~]# firewall-cmd --reload
[root@timophp.com ~]# firewall-cmd --complete-reload

 

四、开放某个端口

 

[root@timophp.com ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
[root@timophp.com ~]# firewall-cmd --reload

查看
firewall-cmd --zone=public --query-port=8080/tcp
删除
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

 

五、指定某个ip访问某个端口

 

比如我们需要指定ip:192.168.1.250的ip才能访问本机的MySQL服务

 

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.250" port protocol="tcp" port="3306" accept"
[root@timophp.com ~]# firewall-cmd --reload

 

这样,我们是不用--add-port=3306/tcp这来添加端口的

 

http://www.excelib.com/article/288/show/