互聯網上提供了各種網路服務,而防火牆可以設置各種規則來限制訪問,保護伺服器。 ...
互聯網上提供了各種網路服務,而防火牆可以設置各種規則來限制訪問,保護伺服器。
概述
Linux
的防火牆體系主要工作在網路層,針對TCP/IP
數據包實施過濾和限制,屬於典型的包過濾防火牆。
Linux
系統的防火牆體系基於內核編碼實現,具有非常穩定的性能和極高的效率。
三種防火牆
netfilter
- 指
linux
內核中實現包過濾防火牆的內部結構 - 屬於
內核態
的防火牆功能體系
iptables
- 指管理
linux
防火牆的命令程式 - 屬於
用戶態
的防火牆管理體系
Firewalld
CentOS 7
預設的防火牆管理工具,取代之前的iptables
防火牆- 屬於
用戶態
firewalld
和iptables
內部結構都指向netfilter
這個強大的網路過濾子系統,以實現包過濾防火牆功能- 支持動態更新、加入防火牆
zone
概念 - 支持
IPv4
和IPv6
地址 - 字元管理工具
firewall-cmd
和圖形化管理工具firewall-config
區別
名稱 | Firewalld | iptables |
---|---|---|
配置文件 | /usr/lib/firewalld/和/etc/firewalld/ | /etc/sysconfig/iptables |
對規則的修改 | 不需要全部刷新策略,不丟失現行連接 | 需要全部刷新策略,丟失連接 |
防火牆類型 | 動態防火牆 | 靜態防火牆 |
網路區域
區域介紹
區域 | 描述 |
---|---|
drop (丟棄) | 任何接收的網路數據包都被丟棄,沒有任何回覆。僅能有發送出去的網路連接 |
block (限制) | 任何接收的網路連接都被IPv4 的icmp-host-prohibited 信息和IPv6 的icmp6-adm-prohibited 信息所拒絕 |
public (公共) | 在公共區域內使用,不能相信網路內的其他電腦不會對您的電腦造成危害,只能接收經過選取的連接 |
external (外部) | 特別是為路由器啟用了偽裝功能的外部網。您不能信任來自網路的其他計算,不能相信它們不會對您的電腦造成危害,只能接收經過選擇的連接 |
dmz (非軍事區) | 用於您的非軍事區內的電腦,此區域內可公開訪問,可以有限地進入您的內部網路,僅僅接收經過選擇的連接 |
work (工作) | 用於工作區。您可以基本相信網路內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連接 |
home (家庭) | 用於家庭網路。您可以基本信任網路內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連接 |
internal (內部) | 用於內部網路。您可以基本上信任網路內的其他電腦不會威脅您的電腦。僅僅接受經過選擇的連接 |
trusted (信任) | 可接受所有的網路連接 |
- 每個區域都具有不同限製程度的規則
- 可以使用一個或多個區域,但是任何一個活躍區域至少需要關聯源地址或介面
- 預設情況下,public區域是預設區域,包含所有介面(網卡)
數據處理流程
檢查數據來源的源地址
- 若源地址關聯到特定的區域,則執行該區域所指定的規則
- 若源地址未關聯到特定的區域,則使用傳入網路介面的區域並執行該區域所指定的規則
- 若網路介面未關聯到特定的區域,則使用預設區域並執行該區域所指定的規則
配置方法
運行時配置
- 實時生效,並持續至
Firewalld
重新啟動或重新載入配置 - 不中斷現有連接
- 不能修改服務配置
永久配置
- 不立即生效,除非
Firewalld
重新啟動或重新載入配置 - 中斷現有連接
- 可以修改服務配置
配置文件
Firewalld
會優先使用/etc/firewalld/
中的配置,如果不存在配置文件,則使用/usr/ib/firewalld/
中的配置
/etc/firewalld/
:用戶自定義配置文件,需要時可通過從/usr/ib/firewalld/
中拷貝/usr/ib/firewalld/
:預設配置文件,不建議修改,若恢復至預設配置,可直接刪除/etc/firewalld/
中的配置
圖形工具
[root@localhost ~]# firewall-config
命令行工具
[root@localhost ~]# firewall-cmd 命令
- 以下是整理的一些命令
--get-default-zone
顯示網路連接或介面的預設區域
--set-default-zone=<zone>
設置網路連接或介面的預設區域
--get-active-zones
顯示已激活的所有區域
--get-zone-of-interface=<interface>
顯示指定介面綁定的區域
--zone=<zone> --add-interface=<interface>
為指定介面綁定區域
--zone=<zone> --change-interface=<interface>
為指定的區域更改綁定的網路介面
--zone=<zone> --remove-interface=<interface>
為指定的區域刪除綁定的網路介面
--query-interface=<interface>
查詢區域中是否包含某介面
--list-all-zones
顯示所有區域及其規則
[--zone=<zone>] --list-all
顯示所有指定區域的所有規則
[--zone=<zone>] --list-services
顯示指定區域內允許訪問的所有服務
[--zone=<zone>] --add-service=<service>
為指定區域設置允許訪問的某項服務
[--zone=<zone>] --remove-service=<service>
刪除指定區域已設置的允許訪問的某項服務
[--zone=<zone>] --query-service=<service>
查詢指定區域中是否啟用了某項服務
[--zone=<zone>] --list-ports
顯示指定區域內允許訪問的所有埠號
[--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]
啟用區域埠和協議組合,可選配置超時時間
[--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
禁用區域埠和協議組合
[--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
查詢區域中是否啟用了埠和協議組合
[--zone=<zone>] --list-icmp-blocks
顯示指定區域內阻塞的所有ICMP類型
[--zone=<zone>] --add-icmp-block=<icmptype>
為指定區域設置阻塞的某項ICMP類型
[--zone=<zone>] --remove-icmp-block=<icmptype>
刪除指定區域已阻塞的某項ICMP類型
[--zone=<zone>] --query-icmp-block=<icmptype>
查詢指定區域的ICMP阻塞功能
firewall-cmd
狀態操作
- 停止、啟動
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start firewalld
- 禁止/允許開機啟動
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl enable firewalld
- 查看狀態
[root@localhost ~]# systemctl status firewalld
[root@localhost ~]# firewall-cmd --state
running
獲取預定義信息
預定義信息主要包括三種:可用的區域、可用的服務以及可用的
ICMP
阻塞類型
- 顯示預定義的區域
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
- 顯示預定義的服務
[root@localhost ~]# firewall-cmd --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 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
- 顯示預定義的
icmp
阻塞類型
[root@localhost ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
- 各種阻塞類型的含義分別如下所示:
destination-unreachable
:目的地址不可達。
echo-reply
:應答回應(pong)。
parameter-problem
:參數問題。
redirect
:重新定向。
router-advertisement
:路由器通告。
router-solicitation
:路由器徵尋。
source-quench
:源端抑制。
time-exceeded
:超時。
timestamp-reply
:時間戳應答回應。
timestamp-request
:時間戳請求。
區域管理
使用
firewall-cmd
命令可以實現獲取和管理區域,為指定區域綁定網路介面等功能。
--get-default-zone
顯示網路連接或介面的預設區域
--set-default-zone=<zone>
設置網路連接或介面的預設區域
--get-active-zones
顯示已激活的所有區域
--get-zone-of-interface=<interface>
顯示指定介面綁定的區域
--zone=<zone> --add-interface=<interface>
為指定介面綁定區域
--zone=<zone> --change-interface=<interface>
為指定的區域更改綁定的網路介面
--zone=<zone> --remove-interface=<interface>
為指定的區域刪除綁定的網路介面
--list-all-zones
顯示所有區域及其規則
[--zone=<zone>] --list-all
顯示所有指定區域的所有規則,省略--zone=<zone>時表示僅對預設區域操作
- 顯示當前系統中的預設區域
[root@localhost ~]# firewall-cmd --get-default-zone
public
- 顯示預設區域的所有規則
[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:
- 顯示網路介面
ens33
對應的區域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public
- 將網路介面
ens33
對應區域改為internal
區域
[root@localhost ~]# firewall-cmd --zone=internal --change-interface=ens33
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
internal
- 顯示
internal
區域下有哪些網路介面
[root@localhost ~]# firewall-cmd --zone=internal --list-interfaces
ens33
- 顯示所有已激活的區域
[root@localhost ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
服務管理
為了方便管理,firewalld
預先定義了很多服務,存放在/usr/lib/firewalld/services/
目錄中,服務通過單個的XML
配置文件來指定。
這些配置文件則按以下格式命名:service-name.xml
,每個文件對應一項具體的網路服務,如ssh
服務等。
與之對應的配置文件中記錄了各項服務所使用的tcp/udp
埠。在最新版本的firewalld
中預設已經定義了70
多種服務供我們使用,對於每個網路區域,均可以配置允許訪問的服務。
當預設提供的服務不適用或者需要自定義某項服務的埠時,我們需要將service
配置文件放置在/etc/firewalld/services/
目錄中。
service
配置具有以下優點。
- 通過服務名字來管理規則更加人性化。
- 通過服務來組織埠分組的模式更加高效,如果一個服務使用了若幹個網路埠,則服務的配置文件就相當於提供了到這些埠的規則管理的批量操作快捷方式。
[--zone=<zone>] --list-services
顯示指定區域內允許訪問的所有服務
[--zone=<zone>] --add-service=<service>
為指定區域設置允許訪問的某項服務
[--zone=<zone>] --remove-service=<service>
刪除指定區域已設置的允許訪問的某項服務
[--zone=<zone>] --list-ports
顯示指定區域內允許訪問的所有埠號
[--zone=<zone>] --add-port=<portid>[-<portid>]/<protocol>
為指定區域設置允許訪問的某個/某段埠號(包括協議名)
[--zone=<zone>] --remove-port=<portid>[-<portid>]/<protocol>
刪除指定區域已設置的允許訪問的埠號(包括協議名)
[--zone=<zone>] --list-icmp-blocks
顯示指定區域內拒絕訪問的所有 ICMP 類型
[--zone=<zone>] --add-icmp-block=<icmptype>
為指定區域設置拒絕訪問的某項 ICMP 類型
[--zone=<zone>] --remove-icmp-block=<icmptype>
刪除指定區域已設置的拒絕訪問的某項 ICMP 類型,省略--zone=<zone>時表示對預設區域操作
- 顯示預設區域允許訪問的所有服務
[root@localhost ~]# firewall-cmd --list-services
ssh dhcpv6-client
- 設置預設區域允許訪問
http
服務
[root@localhost ~]# firewall-cmd --add-service=http
success
- 設置預設區域允許訪問
https
服務
[root@localhost ~]# firewall-cmd --add-service=https
success
- 顯示預設區域允許訪問的所有服務
[root@localhost ~]# firewall-cmd --list-services
ssh dhcpv6-client http https
- 顯示
internal
區域內允許訪問的所有服務
[root@localhost ~]# firewall-cmd --zone=internal --list-services
ssh mdns samba-client dhcpv6-client
- 設置
internal
區域允許訪問mysql
服務
[root@localhost ~]# firewall-cmd --zone=internal --add-service=mysql
success
- 設置
internal
區域不允許訪問samba-client
服務
[root@localhost ~]# firewall-cmd --zone=internal --remove-service=samba-client
success
- 顯示
internal
區域內允許訪問的所有服務
[root@localhost ~]# firewall-cmd --zone=internal --list-services
ssh mdns dhcpv6-client mysql
埠管理
在進行服務配置時,預定義的網路服務可以使用服務名配置,服務所涉及的埠就會自動打開。
但是,對於非預定義的服務只能手動為指定的區域添加埠。
- 在
internal
區域打開443/TCP
埠
[root@localhost ~]# firewall-cmd --zone=internal --add-port=443/tcp
success
- 在
internal
區域禁止443/TCP
埠訪問
[root@localhost ~]# firewall-cmd --zone=internal --remove-port=443/tcp
success
兩種配置模式
前面提到firewall-cmd
命令工具有兩種配置模式:
- 運行時模式
Runtime mode
表示當前記憶體中運行的防火牆配置,在系統或firewalld
服務重啟、停止時配置將失效。 - 永久模式
Permanent mode
表示重啟防火牆或重新載入防火牆時的規則配置,是永久存儲在配置文件中的。
firewall-cmd
命令工具與配置模式相關的選項有三個。
--reload
:重新載入防火牆規則並保持狀態信息,即將永久配置應用為運行時配置。--permanent
:帶有此選項的命令用於設置永久性規則,這些規則只有在重新啟動firewalld
或重新載入防火牆規則時才會生效;若不帶有此選項,表示用於設置運行時規則。--runtime-to-permanent
:將當前的運行時配置寫入規則配置文件中,使之成為永久性。
[root@localhost ~]# firewall-cmd --runtime-to-permanent
success