在CentOS 6和以前的时代,使用Linux自带的防火墙管理一般都是用iptables来实现,iptables实现是一个很好的方案,内核原生支持,规则灵活准确。唯一不方便的是规则的保存和恢复比较费事,要么把iptables命令写入到rc.local,要么就得使用iptables-save和iptables-restore命令来恢复,不是很方便。另外如果一条命令如果配错,可能会导致连不上服务器了,需要使用显示器或者远程重启,调试起来也不方便。firewalld就很好的解决了上面的问题,一方面firewalld可以做到像iptables一样灵活,语法更易读,而且可以设置timeout选项,让一条规格有一个失效时间,就像更改显示器分辨率设置后有个超时自动回退一样,非常人性化。下面就介绍一些常用的firewalld命令。
很多人对这个功能都是一关了之,这样一是不利于网络安全,另一方面也体会不到firewalld的优秀体验了。
首先要介绍一下zone的概念,一个zone会绑定一张或多张网卡,也就是eth0这样的。zone有active和非活动之分。需要设置一个default zone,这个default zone的规则会发挥作用,其他zone不发挥作用。每添加一条rule的时候,如果不指定zone那么就应用到default zone上去。系统默认的default zone是public,并且在使用光盘最小化安装的时候会安装上firewalld并且默认public zone。可以从外部访问SSH服务(也就是22端口),其他端口不允许连入,禁ping。对于出站流量没有限制。
关闭firewalld并使其开机不自启
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
注意下面的命令,要使其生效执行的话一定要执行reload,不然跟没做一样
firewall-cmd --reload
如果命令之间添加了--permanent参数,那么当前的命令会永久生效,即使重启也不会失效,这一点比iptables要方便
如果命令之间添加了--timeout
=时间长度 参数,那么该命令只会在这个时间长度内生效,超时失效,但是不可以与--permanent参数共用
创建一个新zone并设置为默认
firewall-cmd --permanent --new-zone=testing
firewall-cmd --permanent --set-default-zone=testing
永久放通一个端口
firewall-cmd --permanent --zone=public --add-port=8080/tcp
查看某个zone下放通的全部端口和协议
firewall-cmd --permanent --list-ports
永久放通一个服务(服务会对应着一个或者多个端口)
firewall-cmd --permanent --add-service=http
查看所有可用的服务名称
firewall-cmd --permanent --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp open ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
查看当前zone开放的服务
firewall-cmd --permanent --list-services
ssh dhcpv6-client
查看所有zone
firewall-cmd --get-zones
firewall-cmd --list-all-zones
查看某个zone下面所有的规则
firewall-cmd --permanent --list-all --zone=public
打开NAT功能,
有两种方式,--add-masquerade或使用--add-rich-rule添加自定义规则
firewall-cmd --permanent --zone=testing --add-masquerade
firewall-cmd --permanent --query-masquerade
firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 masquerade'
添加端口转发,
有多种方式,既可以直接使用--add-forward-port命令直接添加,也可以通过--add-rich-rule添加自定义规则
firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 forward-port port=22 protocol=tcp to-port=2222 to-addr=10.0.0.10'
firewall-cmd --permanent --zone=testing --list-rich-rules
firewall-cmd --permanent --zone=public --add-forward-port=port=9080:proto=tcp:toport=88:toaddr=192.166.1.187
firewall-cmd --permanent --zone=public --add-forward-port=port=9080:proto=tcp:toport=88
firewall-cmd --permanent --zone=public --remove-forward-port=port=9080
注意如果添加了:toaddr参数,后面跟的IP可以使本地IP(本地主机不同网络接口的)或者是远程主机的IP,如果是本地主机那么访问被转发端口如同访问源端口,如果是远程主机的IP,需要打开当前主机的NAT转发功能,如上面提到的,否则端口转发做了也不通。
封禁IP既可以通过--add-rich-rule来使用firewalld的语法,也可以使用 --add-rule来使用iptables的语法,让习惯iptables的运维人员无缝迁移
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.0.11' reject"
firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.0.10/24 reject'
firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 destination address=192.168.0.10/32 port port=8080-8090 protocol=tcp accept'
删除上面建立的某条规则
firewall-cmd --permanent --zone=testing --remove-rich-rule='rule family=ipv4 source address=10.0.0.0/24 destination address=192.168.0.10/32 port port=8080-8090 protocol=tcp accept'
允许某个IP连接本地某接口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.31.100" port protocol="tcp" port="8080" accept"
查看上面建立的规则
firewall-cmd --permanent --list-all --zone=test
允许某个IP或地址段连接本机任意端口
firewall-cmd --permanent --zone=test --remove-rich-rule='rule family="ipv4" source address="192.168.1.1" accept'
firewall-cmd --permanent --zone=test --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept'
(通过主动请求到服务器的反向流量不受影响),下面介绍使用--add-rule命令,模仿iptables的语法
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -d 192.168.1.1 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 2 -j DROP
firewall-cmd --permanent --direct --get-all-rules