centos7 之 firewalld

FirewallD是什么?

这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。

什么是区域(zone)?
过滤规则集合:zone
一个zone就是一套过滤规则,数据包必须要经过某个zone才能入站或出站。不同zone中规则粒度粗细、安全强度都不尽相同。可以把zone看作是一个个出站或入站必须经过的安检门,有的严格、有的宽松、有的检查的细致、有的检查的粗略。
firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block ,dmz ,drop external, home, internal ,public , trusted , work.
不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.
区域(zone)说明如下:
drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。

简单来讲就是为用户预先准备了几套规则集合,我们可以根据场景的不同选择合适的规矩集合,而默认区域是public。

什么是服务?
在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等.
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70多 种服务供我们使用.
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中.

/etc/firewalld/ 存放修改过的配置(优先查找,找不到再找默认的配置)
/usr/lib/firewalld/ 默认的配置
修改配置的话只需要将/usr/lib/firewalld中的配置文件复制到/etc/firewalld中修改。恢复配置的话直接删除/etc/firewalld中的配置文件即可。
比如:ssh服务默认运行在22端口,如果你的ssh服务运行在220端口(不是默认),此时需要放行220端口,就需要把/usr/lib/firewalld/ssh.xml 文件拷贝到 /etc/firewalld/services/ 目录下,修改文件端口为220

service 配置的好处显而易见:
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。

每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:
先停掉iptables,启动firewalld,查看firewalld状态

[root@localhost ~]# systemctl stop iptables
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2019-10-18 05:48:05 CST; 11h ago
     Docs: man:firewalld(1)
 Main PID: 6270 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─6270 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

10月 18 05:47:45 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
10月 18 05:48:05 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.

从上面可以看出firewalld服务已经起来

[root@localhost ~]# firewall-cmd --get-services     #列出所有支持的 service
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
[root@localhost ~]# firewall-cmd --list-services     #查看当前 zone 种加载的 service
ssh dhcpv6-client
firewalld常用命令
[root@localhost ~]# yum install firewalld       #安装服务
[root@localhost ~]#systemctl start firewalld        #启动
[root@localhost ~]#systemctl status firewalld 或者 firewall-cmd --state   #查看
[root@localhost ~]#systemctl disable firewalld    #禁用
[root@localhost ~]#systemctl stop firewalld      #停止

配置firewalld

[root@localhost ~]#firewall-cmd --version   #查看版本
[root@localhost ~]# firewall-cmd --help    #查看帮助
[root@localhost ~]#firewall-cmd --state     #显示状态
[root@localhost ~]#firewall-cmd --get-active-zones   #查看区域信息
[root@localhost ~]#firewall-cmd --get-zone-of-interface=eth0   #查看指定接口所属区域
[root@localhost ~]#firewall-cmd --panic-on   #拒绝所有包
[root@localhost ~]#firewall-cmd --panic-off    #取消拒绝状态
[root@localhost ~]#firewall-cmd --query-panic  #查看是否拒绝

更新防火墙规则:

[root@localhost ~]#firewall-cmd --reload   #重新加载
[root@localhost ~]#firewall-cmd --complete-reload

两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务

使用下面的命令分别列出所有支持的 zone 和查看当前的默认 zone:

[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@localhost ~]# firewall-cmd --get-default-zone
public

设置默认接口区域

[root@localhost ~]#firewall-cmd --set-default-zone=public    立即生效无需重启

将接口添加到区域,默认接口都在public

[root@localhost ~]#firewall-cmd --zone=public --add-interface=eth0

永久生效再加上 --permanent 然后reload防火墙

打开端口(貌似这个才最常用)

查看所有打开的端口:
[root@localhost ~]# firewall-cmd --zone=dmz --list-ports
加入一个端口到区域:
[root@localhost ~]# firewall-cmd --zone=dmz --add-port=8080/tcp
若要永久生效方法同上

打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹

[root@localhost ~]#firewall-cmd --zone=work --add-service=smtp

移除服务

[root@localhost ~]# firewall-cmd --zone=work --remove-service=smtp

输出区域 全部启用的特性。如果省略区域,将显示默认区域的信息。
firewall-cmd [–zone=] –list-all

[root@localhost ~]#firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@localhost ~]# firewall-cmd --zone=work --list-all
work
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

获取活动的区域

[root@localhost ~]# firewall-cmd --get-active-zones
public
  interfaces: ens33

根据接口获取区域

firewall-cmd –get-zone-of-interface=<interface>
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public

以下关于区域和接口的操作,就不一一举例了,可以根据实际情况修改.

#将接口增加到区域

firewall-cmd [–zone=] --add-interface=
#如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。
#修改接口所属区域
firewall-cmd [–zone=] --change-interface=
#这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。

从区域中删除一个接口

firewall-cmd [–zone=] --remove-interface=

查询区域中是否包含某接口

firewall-cmd [–zone=] --query-interface=

注意:返回接口是否存在于该区域。没有输出。

列举区域中启用的服务

firewall-cmd [ --zone= ] --list-services

这两条简单点说,就是断网和连网.

firewall-cmd --panic-on

启用应急模式阻断所有网络连接,以防出现紧急状况

firewall-cmd --panic-off

查询应急模式

firewall-cmd --query-panic

#####通过配置文件来使用Firewalld的方法#####
系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/
注意!
请勿编辑/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被编辑。

[root@localhost ~]# ls /usr/lib/firewalld/services/
amanda-client.xml        https.xml         nfs3.xml                  sip.xml
amanda-k5-client.xml     http.xml          nfs.xml                   smtp-submission.xml
bacula-client.xml        imaps.xml         nmea-0183.xml             smtps.xml
bacula.xml               imap.xml          nrpe.xml                  smtp.xml
bgp.xml                  ipp-client.xml    ntp.xml                   snmptrap.xml
bitcoin-rpc.xml          ipp.xml           openvpn.xml               snmp.xml
bitcoin-testnet-rpc.xml  ipsec.xml         ovirt-imageio.xml         spideroak-lansync.xml
bitcoin-testnet.xml      ircs.xml          ovirt-storageconsole.xml  squid.xml
bitcoin.xml              irc.xml           ovirt-vmconsole.xml       ssh.xml
ceph-mon.xml             iscsi-target.xml  pmcd.xml                  syncthing-gui.xml
ceph.xml                 jenkins.xml       pmproxy.xml               syncthing.xml
cfengine.xml             kadmin.xml        pmwebapis.xml             synergy.xml
condor-collector.xml     kerberos.xml      pmwebapi.xml              syslog-tls.xml
ctdb.xml                 kibana.xml        pop3s.xml                 syslog.xml
dhcpv6-client.xml        klogin.xml        pop3.xml                  telnet.xml
dhcpv6.xml               kpasswd.xml       postgresql.xml            tftp-client.xml
dhcp.xml                 kprop.xml         privoxy.xml               tftp.xml
dns.xml                  kshell.xml        proxy-dhcp.xml            tinc.xml
docker-registry.xml      ldaps.xml         ptp.xml                   tor-socks.xml
docker-swarm.xml         ldap.xml          pulseaudio.xml            transmission-client.xml
dropbox-lansync.xml      libvirt-tls.xml   puppetmaster.xml          upnp-client.xml
elasticsearch.xml        libvirt.xml       quassel.xml               vdsm.xml
freeipa-ldaps.xml        managesieve.xml   radius.xml                vnc-server.xml
freeipa-ldap.xml         mdns.xml          redis.xml                 wbem-https.xml
freeipa-replication.xml  minidlna.xml      RH-Satellite-6.xml        xmpp-bosh.xml
freeipa-trust.xml        mongodb.xml       rpc-bind.xml              xmpp-client.xml
ftp.xml                  mosh.xml          rsh.xml                   xmpp-local.xml
ganglia-client.xml       mountd.xml        rsyncd.xml                xmpp-server.xml
ganglia-master.xml       mssql.xml         samba-client.xml          zabbix-agent.xml
git.xml                  ms-wbt.xml        samba.xml                 zabbix-server.xml
gre.xml                  murmur.xml        sane.xml
high-availability.xml    mysql.xml         sips.xml

动态添加一条防火墙规则如下:
以下例子均以系统自带的public zone 为例子.
假设自定义的 ssh 端口号为 12222,使用下面的命令来添加新端口的防火墙规则:
如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent

[root@localhost ~]#firewall-cmd --add-port=12222/tcp
success
[root@localhost ~]#  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>

发现没有写到配置文件里

[root@localhost ~]# firewall-cmd --add-port=12222/tcp --permanent
success
[root@localhost ~]# 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"/>
  <port protocol="tcp" port="12222"/>
</zone>

已经写到配置文件里

注意:防火墙配置文件也可以手动修改,修改后记得重载

  1. 如果想开放80端口供外网访问http服务,例子如下
    1.1 将 http.xml复制到/etc/firewalld/services/下面,以服务形式管理防火墙,
    #这个cp命令其实是可以省略的,系统会优先去读取 /etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/ 再次读取.为了方便修改和管理,建议复制到/etc/firewalld
    [root@localhost ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/
    [root@localhost ~]# ls /etc/firewalld/services/
    http.xml
    [root@localhost ~]# ls /etc/firewalld/zones/
    public.xml public.xml.old

修改public.xml,加入http服务

[root@localhost ~]# 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"/>
  <service name="ssh"/>
  <service name="http"/> # 这行是后加的,要匹配 /etc/firewalld/services/文件夹下的文件名
  <port protocol="tcp" port="12222"/>
</zone>

重新载入 两条命令都可以的

[root@localhost ~]#firewall-cmd --reload
success

修改防火墙ssh的端口方法

复制ssh.xml文件到/etc/firewalld/services/

[root@localhost ~]#cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
修改ssh.xml文件 12222为ssh端口
[root@localhost services]# cat /etc/firewalld/services/ssh.xml
<?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"/>   修改成12222
</service>
重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:
[root@localhost ~]#firewall-cmd --reload
success

添加8080端口为新的Service

[root@localhost ~]#cat /etc/firewalld/services/8080.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>8080 Test</short>
<description>此处为文字说明</description>
<port protocol="tcp" port="8080"/>
</service>

编辑public.xml 文件,加入相应的Server

[root@localhost ~]#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="dhcpv6-client"/>
<service name="ssh"/>
<service name="8080"/> # 这行是后加的,要匹配 /etc/firewalld/services/8080.xml 文件名
</zone>

重新载入

[root@localhost ~]#firewall-cmd --reload
success

SNAT

[root@localhost ~]#firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 你的公网ip

DNAT

[root@localhost ~]#firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A PREROUTING -d 173.16.16.1 -p tcp--dport 2346 -j DNAT --to-destination 192.168.10.2:22

https://www.biaodianfu.com/firewalld.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rio520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值