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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章