iptables是linux內核自帶的防火墻,功能強大,但是因為其配置比較復雜,往往會讓新手望而生畏。想當年,我在學習iptbles的時候就花費了不少精力,全憑自己零碎地摸索積累,著實走了不少彎路。接下來,我將給大家分享一下如何使用firewalld工具管理iptables。
1、使用firewalld的好處
首先,firewall-cmd是對iptables操作命令的封裝,使用簡單,新手比較容易接受。
其次,firewalld可靠性高,相對于直接使用iptables命令進行配置,它幾乎不會出錯,特別適合在生產環境中使用。
2、查看firewalld狀態
大多數Linux系統都默認安裝了firewalld包,提供的操作命令為firewall-cmd,我們可以使用--state參數查看firewalld的狀態:
root@kali2020:~# firewall-cmd --state
running
root@kali2020:~#
有時候,雖然firewalld已經安裝,但不一定開啟,我們可以使用systemctl命令把它開起來:
root@kali2020:~# systemctl enable firewalld
Synchronizing state of firewalld.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable firewalld
root@kali2020:~# systemctl start firewalld
root@kali2020:~#
3、查看當前配置
我們可以使用--list-all參數查看當前zone的配置,也可以使用--list-services、--list-ports等參數查看指定的配置:
root@kali2020:~# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ipsec ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
root@kali2020:~#
默認所有網卡都屬于默認public zone,可以使用--zone參數指定其它zone,關于zone的概念新手可以先忽略。我們看到,防火墻默認只允許dhcpv6-client、ipsec、ssh服務,實際上相當于允許服務響應的端口,而服務跟端口之間的關系在/etc/service文件中定義。
4、開放指定端口或服務
對于一些默認允許的服務,我們可以使用--remove-service參數進行刪除,加上--permanent參數可指定當前操作為永久生效,否則在firewalld重啟后配置又恢復了:
root@kali2020:~# firewall-cmd --list-services
http ssh
root@kali2020:~# firewall-cmd --remove-service=ipsec --permanent
success
root@kali2020:~# firewall-cmd --remove-service=dhcpv6-client --permanent
success
root@kali2020:~# firewall-cmd --reload
success
root@kali2020:~#
我們可以使用--add-service或--add-port方式允許相應的端口,配置修改后不會立即生效,需要使用--reload參數重新加載配置文件,下面的例子分別添加了http服務及tcp443端口:
root@kali2020:~# grep http /etc/services
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
http 80/tcp www # WorldWideWeb HTTP
https 443/tcp # http protocol over TLS/SSL
http-alt 8080/tcp webcache # WWW caching service
root@kali2020:~#
root@kali2020:~# iptables -L -nv | grep :80 tcp dpt:80 ctstate NEW,UNTRACKED
root@kali2020:~#
5、添加rich rule
--add-service或--add-port參數只是簡單地開放某個端口,無法對源/目的IP、端口等進行限制。要基于更多條件進行限制,我們需要添加rich rule:
root@kali2020:~# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.88/32" port port=21 protocol="tcp" accept' --permanent
success
root@kali2020:~# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.8/32" service name="http" reject' --permanent
success
root@kali2020:~# iptables -L -nv | grep 192.168.30.8
0 0 REJECT tcp -- * * 192.168.30.8 0.0.0.0/0 tcp dpt:80 ctstate NEW,UNTRACKED reject-with icmp-port-unreachable
0 0 ACCEPT tcp -- * * 192.168.30.88 0.0.0.0/0 tcp dpt:21 ctstate NEW,UNTRACKED
root@kali2020:~#
root@kali2020:~# firewall-cmd --reload
success
root@kali2020:~# firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.30.8/32" service name="http" reject
rule family="ipv4" source address="192.168.30.88/32" port port="21" protocol="tcp" accept
root@kali2020:~#
上面的例子中,我們分別允許192.168.30.88訪問本機的21端口,以及拒絕192.168.30.8訪問本機的80端口。關于rich rule更多的參數信息請man firewalld.richlanguage。
6、添加direct rule
如果rich rule還不滿足我們的需求,我們可以使用--direct參數直接添加原生iptables規則:
root@kali2020:~# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 1 -m tcp -p tcp -s 192.168.30.0/24 --dport 10000 -j REJECT
success
root@kali2020:~#
root@kali2020:~# firewall-cmd --reload
success
root@kali2020:~#
root@kali2020:~# firewall-cmd --direct --get-rules ipv4 filter INPUT
1 -m tcp -p tcp -s 192.168.30.0/24 --dport 10000 -j REJECT
root@kali2020:~#
root@kali2020:~# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: http ssh
ports: 443/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.30.8/32" service name="http" reject
rule family="ipv4" source address="192.168.30.88/32" port port="21" protocol="tcp" accept
root@kali2020:~#
在上面的例子中我們通過添加direct rule方式拒絕了192.168.30.0/24網段訪問本機的10000端口。查看當前direct rule配置需要使用firewall-cmd --direct --get-rules ipv4 filter INPUT命令,其中filter表示iptbles的表,INPUT為指定的鏈(關于表鏈的知識這里暫時不做詳細解釋),通過--list-all參數是無法看到direct rule的。更多關于direct rule的幫助信息請man firewalld.direct。
7、其它需要注意的地方
- --reload參數用于重新加載iptables,不會導致當前已經建立的網絡連接中斷,而使用--complete-reload參數重新加載配置則會使當前已經建立的連接中斷,因此不建議使用。
- firewall-cmd工具實際上是修改/etc/firewalld目錄下的相應文件,因此除了使用命令行,還可以直接修改這些配置文件,再使用--reload參數重新加載。
- 可以使用iptables-save命令查看當前所有原生配置。
好了,關于firewalld的基本使用就先介紹到這里,后續我會繼續分享firewalld更高級的用法,敬請關注,謝謝。