iptables是linux內(nèi)核自帶的防火墻,功能強(qiáng)大,但是因?yàn)槠渑渲帽容^復(fù)雜,往往會(huì)讓新手望而生畏。想當(dāng)年,我在學(xué)習(xí)iptbles的時(shí)候就花費(fèi)了不少精力,全憑自己零碎地摸索積累,著實(shí)走了不少彎路。接下來,我將給大家分享一下如何使用firewalld工具管理iptables。
1、使用firewalld的好處
首先,firewall-cmd是對(duì)iptables操作命令的封裝,使用簡單,新手比較容易接受。
其次,firewalld可靠性高,相對(duì)于直接使用iptables命令進(jìn)行配置,它幾乎不會(huì)出錯(cuò),特別適合在生產(chǎn)環(huán)境中使用。
2、查看firewalld狀態(tài)
大多數(shù)Linux系統(tǒng)都默認(rèn)安裝了firewalld包,提供的操作命令為firewall-cmd,我們可以使用--state參數(shù)查看firewalld的狀態(tài):
root@kali2020:~# firewall-cmd --state
running
root@kali2020:~#
有時(shí)候,雖然firewalld已經(jīng)安裝,但不一定開啟,我們可以使用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、查看當(dāng)前配置
我們可以使用--list-all參數(shù)查看當(dāng)前zone的配置,也可以使用--list-services、--list-ports等參數(shù)查看指定的配置:
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:~#
默認(rèn)所有網(wǎng)卡都屬于默認(rèn)public zone,可以使用--zone參數(shù)指定其它zone,關(guān)于zone的概念新手可以先忽略。我們看到,防火墻默認(rèn)只允許dhcpv6-client、ipsec、ssh服務(wù),實(shí)際上相當(dāng)于允許服務(wù)響應(yīng)的端口,而服務(wù)跟端口之間的關(guān)系在/etc/service文件中定義。
4、開放指定端口或服務(wù)
對(duì)于一些默認(rèn)允許的服務(wù),我們可以使用--remove-service參數(shù)進(jìn)行刪除,加上--permanent參數(shù)可指定當(dāng)前操作為永久生效,否則在firewalld重啟后配置又恢復(fù)了:
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方式允許相應(yīng)的端口,配置修改后不會(huì)立即生效,需要使用--reload參數(shù)重新加載配置文件,下面的例子分別添加了http服務(wù)及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參數(shù)只是簡單地開放某個(gè)端口,無法對(duì)源/目的IP、端口等進(jìn)行限制。要基于更多條件進(jìn)行限制,我們需要添加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訪問本機(jī)的21端口,以及拒絕192.168.30.8訪問本機(jī)的80端口。關(guān)于rich rule更多的參數(shù)信息請(qǐng)man firewalld.richlanguage。
6、添加direct rule
如果rich rule還不滿足我們的需求,我們可以使用--direct參數(shù)直接添加原生iptables規(guī)則:
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網(wǎng)段訪問本機(jī)的10000端口。查看當(dāng)前direct rule配置需要使用firewall-cmd --direct --get-rules ipv4 filter INPUT命令,其中filter表示iptbles的表,INPUT為指定的鏈(關(guān)于表鏈的知識(shí)這里暫時(shí)不做詳細(xì)解釋),通過--list-all參數(shù)是無法看到direct rule的。更多關(guān)于direct rule的幫助信息請(qǐng)man firewalld.direct。
7、其它需要注意的地方
- --reload參數(shù)用于重新加載iptables,不會(huì)導(dǎo)致當(dāng)前已經(jīng)建立的網(wǎng)絡(luò)連接中斷,而使用--complete-reload參數(shù)重新加載配置則會(huì)使當(dāng)前已經(jīng)建立的連接中斷,因此不建議使用。
- firewall-cmd工具實(shí)際上是修改/etc/firewalld目錄下的相應(yīng)文件,因此除了使用命令行,還可以直接修改這些配置文件,再使用--reload參數(shù)重新加載。
- 可以使用iptables-save命令查看當(dāng)前所有原生配置。
好了,關(guān)于firewalld的基本使用就先介紹到這里,后續(xù)我會(huì)繼續(xù)分享firewalld更高級(jí)的用法,敬請(qǐng)關(guān)注,謝謝。