centos7的防火墙引入了新的防火墙firewalld,和以前的iptables完全不同,不过我觉得用起来还是新的好。

新安装的系统默认就启用了新防火墙,老的虽然还有,但是需要把新的停了,才能启动。

新系统安装完了,默认就开启了SSH协议,和ping(ICMP)协议。

据介绍,有图显示,其实只是对操作界面进行了更换,内核的操作还是用iptables去netfilter

引入了防火墙真正的概念,zone(区域),然后把网络接口归属于zone,这些都是真正防火墙的概念。


firewall-config是图形界面的命令,如果没安装图形界面就只能用firewall-cmd命令行。

现在的图形界面,普通的开启服务,端口还好用,稍微复杂的策略就完蛋了,所以命令行还是要搞清楚。


看看系统是否启动了新防火墙,

#firewall-cmd --state

running

表示在运行

默认是把接口划归public的zone,用命令可以查看现在活动的zone,zone也可以自己增加,不过一般用不上,除非真做防火墙用,有多个网络接口,一个接口只能属于一个zone,如果就一个网卡还搞啥啊。

# firewall-cmd --get-active-zones
public
  interfaces: ens160

这表示活动的zone是public,接入的网络接口是interfaces: ens160

firewall-cmd --zone=public --list-interfaces

命令是指定zone,列出接口

可以用firewall-cmd --zone=public --list-all列出所有信息

public (default, active)
  interfaces: ens160
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

这里public (default, active)表示默认的zone是public,如果不指定zone(--zone=public),就是默认是public

services: dhcpv6-client ssh

服务就开了ssh,其它都接不进了,dhcpv6-client是为了本机获取IP地址的,不是对外服务,但是虽然没有ipv4的dhcp,还是可以获取到IP的,安全问题不大。

看看有多少预定制服务

firewall-cmd --get-service
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp open*** pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https

很多吧,那么这样的预定义的东西可以改,可以加吗?

看看/usr/lib/firewalld/services

里面那么多xml文件,自己是不是可以修改,添加呢,哈哈。

有些就是定义了端口号,比如ssh

<?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>

想换端口号,把22改成想要的。

但是有些比较复杂,如ftp

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>FTP</short>
  <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
  <port protocol="tcp" port="21"/>
  <module name="nf_conntrack_ftp"/>
</service>

不仅仅有端口号,还有module,这可以智能打开的服务器的关键,主要是ftp协议的控制端口为21,但是数据端口还有其它的,以前的老ftp协议用20端口来传,现在为了更加安全,数据端口是动态产生的,所以必须要一个程序动态打开端口,module name="nf_conntrack_ftp"就干这个用的。

如果自己想添加一些进去的话,那么把一个文件从/usr/lib/firewalld/services拷贝到/etc/firewalld/services,然后修改文件名为自己想要的,内容也修改。firewall-cmd --reload生效。


增加,修改的命令打进去,立刻生效,不像以前的iptables,但是这个效果是在内存里,如果重启了,就消失了,如果想让命令存盘,加上参数--permanent

其实就是在/etc/firewalld/zones里面,各个zone的xml文件里,不过直接编辑publ.xml是不会生效的,当然重启机器后会生效,那么生效?

firewall-cmd --reload

这个命令,在远程用ssh连接进去还是可以用,不会断,但是

firewall-cmd --complete-reload就不行,会切断所有连接,ssh虽然本人测试没断,但是其它的连接可能会断。


永久增加smtp服务到默认zone

firewall-cmd --permanent --add-service=smtp

这时候去查看文件

cat /etc/firewalld/zones/public.xml

多一条<service name="smtp"/>

增加端口tcp的8080

firewall-cmd --add-port=8080/tcp

这时候查看public.xml文件,发现并没有增加这一条,

用firewall-cmd --list-all查看,发现有ports: 8080/tcp,这是为啥呢,自己想。


下面说说图形界面搞不定的,高级策略定制

比如说你打算只允许指定的IP访问你的FTP服务,那个图形界面就搞不定,就是不能输入,另外你修改了一条从命令行打出来的策略,一保存,竟然把源地址给丢了,原来是ipv4,也变成了all。我做测试还奇怪呢,怎么不行了,后来显示了一下,才发现。看来做图形界面的太粗制滥造了,还是不要用了。

可以先用命令查查看有没有那么复杂的策略

firewall-cmd --list-rich-rule

rule family="ipv4" source address="12.26.2.0/24" service name="ssh" accept
rule family="ipv4" source address="12.26.2.0/24" service name="ftp" log level="warning" limit value="1/m" audit accept
rule family="ipv4" source address="222.222.222.222" reject
rule family="ipv4" source address="12.26.2.0/24" service name="ftp" log level="warning" limit value="1/m" accept
rule family="ipv4" source address="12.26.2.0/24" service name="ftp" accept

增加一条

firewall-cmd --add-rich-rule="rule family='ipv4' service name='ftp' source address='192.168.2.0/24' log prefix='ssh ' level='warning' limit value='1/m' audit accept"

这个source address='192.168.2.0/24'就是许可的IP地址,limit value='1/m' audit是审查,一分钟一次,m是分钟,s是秒,这个东西老实说没啥太大意思,还是记录,只不过记录的方式是以审查的形式,记录的文件也在/var/log/audit/audit.log,看起来也挺费劲,不用也罢。log level='warning'是记录到log,级别为warning,最后的accept当然是许可了。这个log,我开始还以为存在/var/log/firewalld里,里面怎么都找不到,后来在/var/log/messages发现了内容。prefix="ssh "琢磨了很久,不知道干嘛用的,英语意思是前缀,后来在log里发现,就是起一个标志作用,搜索起来容易些,另外可以看见我在引号中,最后加了个空格,为啥呢,因为在log里和后面的接口没有空格的连在一起了,看起来很不清晰,至于那个level="info",在log里真看不出来,和="warning"有啥区别之处。


其实编辑xml文件也和容易。来看一下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>
  <interface name="ens160"/>
  <rule family="ipv4">
    <source address="172.26.2.0/24"/>
    <service name="ftp"/>
    <log level="warning">
      <limit value="1/m"/>
    </log>
    <audit/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="172.26.2.0/24"/>
    <service name="ssh"/>
    <log prefix="ssh " level="info"/>
    <accept/>
  </rule>
</zone>

比学命令容易多了,不需要注意格式,xml本身格式就很清晰,有使用防火墙经验,对xml文件有稍微的了解就可以进行编辑,不过这是存盘的,修改完不会立刻生效,firewall-cmd --reload,才可以,想立刻生效那么直接用命令行。


其它的一些比如锁定功能,怕一些人乱搞,在这个文件里加上

/etc/firewalld/firewalld.conf

Lockdown=yes

重引导一下reload

再加策略就无效了。


有个Panic模式,对应突发***比较有用

firewall-cmd --panic-on

关闭所有网络连接

firewall-cmd --panic-off

打开

查询状态

firewall-cmd --query-panic

默认是no