< 返回云服务器列表

系统防火墙认识之firewall使用实例

发布时间:2020-07-14    来源: 118云vps 阅读:
    在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 openvpn 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操作:
 
    打开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:
 
    封禁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