Linux防火墙(firewalld篇)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cxs123678/article/details/79966939

firewalld(centos7中的防火墙) 是 iptables 的前端控制器(iptables的封装),用于实现持久的网络流量规则。它提供命令行和图形界面,在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比,使用 FirewallD 有两个主要区别:

FirewallD 使用区域和服务而不是链式规则。
它动态管理规则集,允许更新规则而不破坏现有会话和连接。

(注centos7向后兼容iptables)

centos7上使用iptables工具

systemctl stop firewalld    #停止firewalld服务
systemctl disable firewalld #禁止firewalld服务开机启动
yum install -y iptables-services    #系统默认不自带iptables工具
systemctl enable iptables   #让它开机启动
systemctl start iptables    #启动iptables服务

centos7上使用firewalld工具

systemctl stop iptables     #停止该服务
systemctl disable iptables  #开机禁止启动
systemctl start firewalld   #启动该服务
systemctl enable firewalld  #开机自启
systemctl stop firewalld    #停止该服务
systemctl disable firewalld #开机禁止启动

(注:如果你在centos7上安装了python3且将/usr/bin/python3软链接为python时, 启动firewalld会失败,解决方法:)

ls /usr/bin/ |grep firewall
#firewall-cmd
#firewall-config
#firewall-offline-cmd

ls ls /usr/sbin/firewalld
#/usr/sbin/firewalld

使用vim分别打开这几个文件,将首行的/usr/bin/python改为/usr/bin/python2.7

firewalld有两个基本概念,分别是zone和service。每一个zone里面有不同iptables规则,默认一共九个zone,而centos7默认的zone为public。

“区域”(zone)是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 firewalld后,public 将是默认区域。

区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在external 区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。

firewall-cmd --get-zones    #获取系统中的所有zone
#block dmz drop external home internal public trusted work

firewall-cmd --get-default-zone #获取系统中的默认zone
#public

firewall-cmd --set-default-zone=public  #设定默认的zone

firewall-cmd --get-zone-of-interface=ens33  #查看指定网卡的zone
#public

firewall-cmd --zone=public --add-interface=lo   #给指定网卡设置zone
#success

firewall-cmd --zone=dmz  --change-interface=lo  #针对网卡更改zone
#success

firewall-cmd --zone=dmz --remove-interface=lo   #针对网卡删除zone
#success

firewall-cmd --get-zone-of-interface=lo #查看指定网卡的zone
#no zone

firewall-cmd --get-active-zones #查看系统的所有网卡所在的zone
#public
#  interfaces: ens33

每个zone里面都使用了不同的service,而service就是针对一个服务(端口)做的iptables规则。

firewall-cmd --get-services #查看系统中所有的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 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
-------------------------------------------------
这些service都是由一个个配置文件定义的,
配置文件的模板在/usr/lib/firewalld/services/目录下,
真正生效的配置在/etc/firewalld/services/目录下

ls /usr/lib/firewalld/services  #未全部列出
---------------------------------------------
amanda-client.xml        kadmin.xml                quassel.xml
amanda-k5-client.xml     kerberos.xml              radius.xml
bacula-client.xml        kibana.xml                RH-Satellite-6.xml
bacula.xml               klogin.xml                rpc-bind.xml
bitcoin-rpc.xml          kpasswd.xml               rsh.xml
bitcoin-testnet-rpc.xml  kshell.xml                rsyncd.xml
bitcoin-testnet.xml      ldaps.xml                 samba-client.xml
bitcoin.xml              ldap.xml                  samba.xml
ceph-mon.xml             libvirt-tls.xml           sane.xml
----------------------------------------------------------

ls /etc/firewalld/services  #默认为空
firewall-cmd --list-services    #查看当前zone下有哪些services
#ssh dhcpv6-client

firewall-cmd --zone=public --list-services
#ssh dhcpv6-client  #查看指定zone下有哪些services

#对于每个zone来说,都有自己的配置文件,查看zone的配置文件
ls /usr/lib/firewalld/zones
#block.xml  drop.xml      home.xml      public.xml   work.xml
#dmz.xml    external.xml  internal.xml  trusted.xml

#查看public这个zone的配置文件
cat /etc/firewalld/zones/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>
-----------------------------------------------------------


#在指定zone中增加一个service,仅仅在内存中生效,并没有修改配置文件
firewall-cmd  --zone=public --add-service=http
#success

#在指定zone中增加一个service,且修改其配置文件,加--permanent
firewall-cmd  --zone=public --add-service=http --permanent
#success

配置文件位于两个目录中

  • /usr/lib/firewalld 下保存默认配置,如默认区域和公用服务。 因避免修改它们,因为每次 firewall 软件包更新时都会覆盖这些文件。
  • /etc/firewalld 下保存系统配置文件。 这些文件将覆盖默认配置。

举例:假如服务器上配置了一个ftp服务,但端口 并非默认的21号,而是1212,并且需要在work zone 下放行ftp。

vi /usr/lib/firewalld/services/ftp.xml  #更改端口号为1212
-------------------------------------------
<?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"/>
  <port protocol="tcp" port="1212"/>
  <module name="nf_conntrack_ftp"/>
</service>
---------------------------------------------------------

#cp 模板 真正生效的配置文件
cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/  

vi /etc/firewalld/zones/work.xml    #加入一行ftp相关的配置
---------------------------------------------------------
<zone>
  <short>Work</short>
  <description>For use in work areas. You mostly 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"/>
  #此处增加配置
  <service name="ftp"/>
</zone>
----------------------------------------------------------

firewall-cmd --reload   #重新加载

#验证一下work zone里面是否有ftp
firewall-cmd --zone=work --list-services
#ssh dhcpv6-client ftp
#检查防火墙状态。输出应该是 running 或者 not running。
firewall-cmd --state

#要查看 firewalld 守护进程的状态:
systemctl status firewalld

#重新加载 Firewalld 配置:
firewall-cmd --reload

firewalld 使用 XML 进行配置。除非是非常特殊的配置,你不必处理它们,而应该使用 firewall-cmd

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页