RHEL Linux 7的防火牆firewalld學習總結
本文介紹一下RHEL 7下的防火牆配置工具firewalld。 在RHEL 7之前,我們一般使用iptables防火牆管理工具,其實,iptables與firewalld都不是真正的防火牆,它們都只是用來定義防火牆策略的防火牆管理工具而已,或者說,它們只是一種服務或程序。iptables服務會把配置好的防火牆策略交由內核層面的netfilter網絡過濾器來處理,而firewalld服務則是把配置好的防火牆策略交由內核層面的nftables包過濾框架來處理。
firewalld(Dynamic Firewall Manager of Linux systems,Linux系統的動態防火牆管理器),在RHLE 7下是默認的防火牆配置管理工具,它擁有基於CLI(命令行界面 firewalld-cmd)和基於GUI(圖形用戶界面 firewalld-config)的兩種管理方式。相較於傳統的防火牆管理配置工具,firewalld支持動態更新技術並加入了區域(zone)的概念。簡單來說,區域就是firewalld預先准備了幾套防火牆策略集合(策略模板),用戶可以根據生產場景的不同而選擇合適的策略集合,從而實現防火牆策略之間的快速切換。它具備對IP V4和IP V6防火牆設置的支持。
防火牆中的一切都與一個或者多個區域相關聯,下面對各個區進行說明:
Zone Description
-----------------------------------------------------
drop (immutable) Deny all incoming connections, outgoing ones are accepted.
block (immutable) Deny all incoming connections, with ICMP host prohibited messages issued.
trusted (immutable) Allow all network connections
public Public areas, do not trust other computers
external For computers with masquerading enabled, protecting a local network
dmz For computers publicly accessible with restricted access.
work For trusted work areas
home For trusted home network connections
internal For internal network, restrict incoming connections
drop(丟棄)
任何流入網絡的包都被丟棄,不作出任何響應,只允許流出的網絡連接。即使開放了某些服務(比如http),這些服務的數據也是不允許通過的。
block(限制)
任何進入的網絡連接都被拒絕,並返回IPv4的icmp-host-prohibited報文或者IPv6的icmp6-adm-prohibited 報文。只允許由該系統初始化的網絡連接。
trusted(信任)
可接受所有的網絡連接。允許所有網絡連接,即使沒有開放任何服務,那么使用此zone的流量照樣通過(一路綠燈)
public(公共)
在公共區域內使用,不能相信網絡內的其他計算機不會對您的計算機造成危害,只能接收經過選取的連接。
external(外部)
特別是為路由器啟用了偽裝功能的外部網。您不能信任來自網絡的其他計算,不能相信它們不會對您的計算機造成危害,只能接收經過選擇的連接。
dmz(非軍事區)
用以允許隔離區(dmz)中的電腦有限地被外界網絡訪問,只允許選中的服務通過。
work(工作)
用於工作區。您可以基本相信網絡內的其他電腦不會危害您的電腦。只允許選中的服務通過。
home(家庭)
用於家庭網絡。您可以基本信任網絡內的其他計算機不會危害您的計算機。,只允許選中的服務通過。
internal(內部)
用於內部網絡。您可以基本上信任網絡內的其他計算機不會威脅您的計算機。只允許選中的服務通過。
檢查防火牆工具
如果你要判斷RHEL 7使用的是iptables還是firewalld,那么可以通過命令來判斷
有iptables的情況:
# systemctl status iptables.service
● iptables.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
沒有iptables的情況
# systemctl status iptables.service
Unit iptables.service could not be found.
當然,最簡單的方法是使用下面命令來判別
# systemctl is-active firewalld
active
# systemctl is-active iptables
inactive
# systemctl is-active ip6tables
inactive
# systemctl is-active ebtables
inactive
查看防火牆狀態
# systemctl status firewalld
# firewall-cmd --state
[root@mylnx ~]# 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 Wed 2018-03-07 11:46:34 HKT; 1 day 4h ago
Main PID: 124126 (firewalld)
CGroup: /system.slice/firewalld.service
└─124126 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Mar 07 11:46:34 mylnx systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 07 11:46:34 mylnx systemd[1]: Started firewalld - dynamic firewall daemon.
# firewall-cmd --state
running
啟動防火牆服務:
# systemctl start firewalld
或
# systemctl start firewalld.service
重啟防火牆服務:
# systemctl restart firewalld.service
或
# systemctl restart firewalld
關閉防火牆:
systemctl stop firewalld
[root@mylnx ~]# systemctl stop firewalld
[root@mylnx ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2018-03-08 16:35:17 HKT; 6s ago
Process: 124126 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 124126 (code=exited, status=0/SUCCESS)
Mar 07 11:46:34 mylnx systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 07 11:46:34 mylnx systemd[1]: Started firewalld - dynamic firewall daemon.
Mar 08 16:35:16 mylnx systemd[1]: Stopping firewalld - dynamic firewall daemon...
Mar 08 16:35:17 mylnx systemd[1]: Stopped firewalld - dynamic firewall daemon.
[root@mylnx ~]#
禁用&啟用防火牆:
開機時啟用&禁用防火牆
# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
firewall-cmd幫助信息
# firewall-cmd --help
配置防火牆
firewall-cmd有臨時設定(runtime)和永久(permanent)設定兩種方式,臨時設定reload后或重啟服務器后會恢復原狀態,而永久設定方式則不會。參數--permanent表示永久(permanent)設定。下面如果指定了參數--permanent表示永久設定。
1:列出當前有幾個區域(zone)
[root@mylnx ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@mylnx ~]#
2: 查看當前活動的區域(zone)
[root@mylnx ~]# firewall-cmd --get-active-zones
public
interfaces: eth0
[root@mylnx ~]#
3: 查看當前默認的區域(zone)
[root@mylnx ~]# firewall-cmd --get-default-zone
public
4:設置當前默認的區域
[root@mylnx ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
5: 查看firewalld支持的服務。
[root@mylnx ~]# firewall-cmd --get-service
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
6:檢查下一次重載后將激活的服務。
[root@mylnx ~]# firewall-cmd --get-service --permanent
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
7: 列出區域開放的端口
[root@mylnx ~]# firewall-cmd --zone=public --list-ports
8123/tcp 8124/tcp 8217/tcp 80/tcp 443/tcp 3306/tcp 10050/tcp
8: 列出指定區域的設置信息
[root@mylnx ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: dhcpv6-client ssh
ports: 8123/tcp 8124/tcp 8217/tcp 80/tcp 443/tcp 3306/tcp 10050/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
9:開放指定區域的特定端口號
例如,我們需要開放端口號8123
# firewall-cmd --zone=public --add-port=8123/tcp --permanent
success
# firewall-cmd --reload #更新防火牆規則
--zone #作用域
--add-port=8123/tcp #添加端口,格式為:端口/通訊協議
--permanent #永久生效,沒有此參數重啟后失效
注意:有沒有--reload 選項的區別:
[root@mylnx ~]# firewall-cmd --zone=public --add-port=8124/tcp --permanent
success
[root@mylnx ~]# firewall-cmd --zone=public --list-ports
8123/tcp
[root@mylnx ~]# firewall-cmd --reload
success
[root@mylnx ~]# firewall-cmd --zone=public --list-ports
8123/tcp 8124/tcp
另外,還需要注意--reload與--complete-reload的區別:
# firewall-cmd --reload
# firewall-cmd --complete-reload
兩者的區別就是第一個無需斷開連接,就是firewalld特性之一動態添加規則,第二個需要斷開連接,類似重啟服務
如何一次開放多個端口呢? 這里有兩種方法,總結如下:
方法1:使用shell腳本,循環添加多個端口。
#!/bin/bash
for i in 22 21 1337 3306 31337
do
firewall-cmd --zone=public --add-port=${i}/tcp
done
方法2:如果端口是區間段,那么可以使用下面命令:
# firewall-cmd --zone=public --add-port=6001-6020/tcp --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --zone=public --list-ports
8123/tcp 8124/tcp 8217/tcp 80/tcp 443/tcp 3306/tcp 10050/tcp 6001-6020/tcp
10:刪除開放的端口
firewall-cmd --zone= public --remove-port=80/tcp --permanent
移除一個區間段的端口號:
# firewall-cmd --zone=public --remove-port=6001-6020/tcp --permanent
success
# firewall-cmd --reload
success
11: 查看有哪些服務可以打開。
# firewall-cmd --get-services
12: 開放某個服務
# firewall-cmd --add-service=zabbix-agent --permanent
success
# firewall-cmd --zone=public --add-service=zabbix-agent --permanent
success
13: 關閉某個服務
# firewall-cmd --remove-service=zabbix-agent --permanent
success
# firewall-cmd --reload
success
14: 查看當前開放了哪些服務
# firewall-cmd --list-services
dhcpv6-client ssh
# firewall-cmd --zone=public --list-services
dhcpv6-client ssh
查詢某個服務是否開放
# firewall-cmd --query-service ftp
no
# firewall-cmd --query-service ssh
yes
15: 一些不常用的應急命令
firewall-cmd --panic-on # 拒絕所有流量,遠程連接會立即斷開,只有本地能登陸
firewall-cmd --panic-off # 取消應急模式,但需要重啟firewalld后才可以遠程ssh
firewall-cmd --query-panic # 查看是否為應急模式
16: 設置某些IP允許訪問某個服務
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="ssh" accept"
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="ssh" accept"
firewall配置文件
這里存放了一些默認的文件。如默認區域和公用服務。避免修改它們,因為每次 firewall 軟件包更新時都會覆蓋這些文件
$ ls -lrt /usr/lib/firewalld
total 16
drwxr-xr-x. 2 root root 224 Feb 18 11:03 helpers
drwxr-xr-x. 2 root root 20 Feb 18 11:03 ipsets
drwxr-xr-x. 2 root root 4096 Feb 18 11:03 icmptypes
drwxr-xr-x. 2 root root 8192 Feb 18 11:03 services
drwxr-xr-x. 2 root root 163 Feb 18 11:03 zones
這里存放了用戶自定義數據
$ ls -lrt /etc/firewalld
total 8
drwxr-x---. 2 root root 46 Feb 5 00:29 zones
drwxr-x---. 2 root root 6 Feb 5 00:29 services
-rw-r--r--. 1 root root 272 Feb 5 00:29 lockdown-whitelist.xml
drwxr-x---. 2 root root 6 Feb 5 00:29 ipsets
drwxr-x---. 2 root root 6 Feb 5 00:29 icmptypes
drwxr-x---. 2 root root 6 Feb 5 00:29 helpers
-rw-r--r--. 1 root root 2006 Feb 5 00:29 firewalld.conf
firewall命令非常豐富、靈活,限於篇幅和經驗,不可能面面俱到,這里只是總結了一些比較常用、簡單的命令。后續在工作中遇到了一些特殊需求,在不斷學習和完善。