前言:
對于firewalld的理解
centos7中使用firewalld來作為防火墻,其底層調用的命令仍然是iptables等命令,但是在配置上發生了較大的變化。
Centos7中有兩個位置存放了firewall的配置文件,一個是/etc/firewalld,一個是/usr/lib/firewalld,前者是用戶配置目錄,后者是系統配置目錄。/usr/lib/firewalld目錄中存放的是firewalld提供的一些默認和備份的配置文件,一般不隨意改變,/etc/firewalld目錄下才是用戶配置的真正生效的配置文件,只有在/etc/firewalld目錄不存在或該目錄下不存在配置文件的情況下/usr/lib/firewalld目錄下的配置文件才會生效。
01、zone的概念
zone定義了防火墻對某個連接、網口(interface)或源地址的信任等級,我們可以把他理解為防火墻對不同的連接(connection)、網口(interface)或源地址(source address)劃分到不同的zone當中,而不同的zone定義了不同的規則,因此防火墻可以針對不同的連接、網口(interface)或源地址做出不同的行為。
例如,我們將10.12.18.201這個地址劃分到zone1中,將10.12.18.202這個地址劃分到zone2中,然后zone1中定義的規則為:允許訪問3306端口,其余的端口都拒絕訪問;zone2中定義的規則為:拒絕訪問3306端口,其余的端口都允許訪問。那么10.12.18.201就僅能訪問本機的3306端口,10.12.18.202就僅不能訪問本機的3306端口。每個zone的防火墻規則是通過/etc/firewalld/zones目錄下的xml配置文件來配置的。
zone和connection、interface、source address之間是一對多的關系,即一個connection、interface或source address僅能劃分到一個zone中,而一個zone中可以包含多個connection、interface或source address。
01-1
預定義的zone
Centos7中firewalld為用戶預定義了9個zone,分別為drop,block,public,external,dmz,work,home,internal,trusted。這9個zone的配置文件在/usr/lib/firewalld/zones目錄下,通過查看他們的配置文件可以得知這9個zone的規則是怎么樣的。
1-1-1 drop--丟棄
任何傳入本機的網絡數據包都會被丟棄,并且不會回復,只允許本機對外訪問其他服務器。
1-1-2 block--阻塞
任何傳入本機的網絡連接請求都會被拒絕,并且會回復一條拒絕訪問的消息。
1-1-3 public--公共
用于本機處于公共網絡環境的場景下,僅接受特定的連接請求,如僅接受某些特定的IP的連接請求,或僅對外部開放特定的某些端口。Centos 7 默認的public.xml文件中僅開放用于ssh連接請求的22端口和dhcpv6-client服務的546端口。
1-1-4 external--外部
與public類似,Centos 7 默認僅開放用于ssh連接請求的22端口。
1-1-5 dmz--非軍事區
與external一樣,Centos 7 默認也是僅開放用于ssh連接請求的22端口。
1-1-6 work--工作
用于工作網絡環境場景下,信任大部分的其他的計算機不會對本機進行攻擊。Centos 7 默認開放用于ssh連接請求的22端口,dhcpv6-client服務的546端口,以及IPP協議的631端口。
1-1-7 home--家
用于家庭網絡環境,信任網絡上的其他計算機不會攻擊本機。Centos 7默認開放用于ssh連接請求的22端口,dhcpv6-client服務的546端口,IPP協議的631端口,samba服務的137、138端口,mDNS服務的5353端口。
1-1-8 internal--內部
與home一樣,Centos 7默認開放用于ssh連接請求的22端口,dhcpv6-client服務的546端口,IPP協議的631端口,samba服務的137、138端口,mDNS服務的5353端口。
1-1-9 trusted--信任
所有對本機的網絡連接請求都會被接受。
01-2
將interface和source劃分到某個zone
1-2-1 將source劃分到某個zone的命令如下
將某個source劃分到某個zone的命令如下:
firewall-cmd [--permanent] [--zone=zone] --add-source=source
1-2-2 例如
firewall-cmd --permanent --zone=trusted --add-source=192.168.5.112
這條命令會將192.168.5.112這個網口劃分到trusted這個zone,–permanent參數會將該配置寫入trusted這個zone的配置文件trusted.xml中,使其永久生效,如果不加–permanent,則只會臨時生效,重啟防火墻或者調用firewall-cmd --reload重新加載配置文件會使得該項配置失效。
1-2-3 將某個網口(interface)劃分到某個zone的命令如下:
將某個source劃分到某個zone的命令如下:
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
1-2-4 例如
firewall-cmd --permanent --zone=block --add-interface=ens33
這條命令會將ens33這個網口劃分到block這個zone,這樣其他機器訪問本機的ens33網口時就會默認走這個zone。
如果某個連接請求沒有劃分到任何一個zone,那么就會走默認的zone,Centos7 默認情況下,默認zone為public。可以通過以下命令查看或者修改默認zone。
1-2-5 獲取默認的zone:
firewall-cmd --get-default-zone
1-2-6 修改默認的zone:
firewall-cmd --permanent --set-default-zone=[zone]
1-2-7 其他的一些相關的命令:
列出該zone下綁定了哪些interface:
firewall-cmd [--zone=zone] --list-interfaces
將該interface綁定到另一個zone上:
firewall-cmd [--permanent] [--zone=zone] --change-interface=interface
如果該interface之前綁定到了某個zone,則取消綁定,這樣就會走默認zone
firewall-cmd [--permanent] --remove-interface=interface
與source相關的:
firewall-cmd [--permanent] --remove-source=source
firewall-cmd [--permanent] [--zone=zone] --list-sources
firewall-cmd [--permanent] [--zone=zone] --add-source=source
01-2
zone的配置文件
一個zone的xml配置文件的示例如下:
<?xml version="1.0" encoding="utf-8"?>
<zone target="DEFAULT">
<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="80"/>
<port protocol="tcp" port="8080"/>
<source address="192.168.5.112">
<source address="10.12.18.0/24"/>
<rule family="ipv4">
<source address="10.12.18.0/24"/>
<port protocol="tcp" port="7180-7190"/>
<accept/>
</rule>
</zone>
每個標簽的含義:
zone:給一個zone指定target,
target=“ACCEPT|%%REJECT%%|DROP”
可用于接受(ACCEPT)、拒絕(%%REJECT%%)或丟棄(DROP)與任何規則(端口、服務等)都不匹配的每個數據包,即指定該zone的默認的對連接(connection)、網口(interface)或源地址(source address)的行為,如果不指定target,則默認為default,default的行為與REJECT類似。
short:給該zone指定一個名字。
description:對該zone的描述
service:該zone開啟的服務(service),service下一小節會講 port:該zone打開的端口,protocol屬性可以指定協議,通常為tcp或udp,port屬性指定端口號
source:綁定到該zone的source,其效果等同于 firewall-cmd [–permanent] [–zone=zone] --add-source=source 指令
rule:為該zone添加的富語言規則(rich language rule)。
rich language rule的寫法可以參照官網https://firewalld.org/documentation/man-pages/firewalld.richlanguage
上述示例的富語言規則的含義為對10.12.18.X網段的source開放7180至7190所有端口的tcp連接請求。
對于service的理解
02、Service的概念
service是預定義的一系列的本機的協議、端口、目標ip等,service可以讓我們更加方便的讓防火墻限制外部對本機的某些端口的訪問。service的配置文件在/etc/firewalld/services或
/usr/lib/firewalld/services文件夾下,每個service的配置都是一個xml文件。
02-1
service配置文件
系統在
/usr/lib/firewalld/services文件夾下為我們預定義了一些列的service配置文件,我們也可以在/etc/firewalld/services定義自己的service。例如,ftp.xml的內容如下:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>FTP</short>
<description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
<port protocol="tcp" port="21"/>
<module name="nf_conntrack_ftp"/>
</service>
這樣,在某個zone的配置文件中可以引用這個service,例如,在public.xml中引入ftp service:
<?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="ftp"/>
</zone>
等價于:
<?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"/>
<port protocol="tcp" port="21"/>
</zone>
02-2
service的相關指令
打印所有預定義的service(
/usr/lib/firewalld/services或/etc/firewalld/services下每個xml配置文件就是一個預定義的service):
firewall-cmd [--permanent] --get-services
列出此zone開啟的服務列表:
firewall-cmd [--permanent] [--zone=zone] [--permanent] [--policy=policy] --list-services
將一個service添加到一個zone,timeout可以為這個zone設置這個service的生效時間,過了這個生效時間,此service將從該zone中被移除。–timeout參數和–permanent參數是不兼容的
firewall-cmd [--permanent] [--zone=zone] [--permanent] [--policy=policy] --add-service=service [--timeout=timeval]
03、ipset的概念
ipset,顧名思義,就是可用于將多個IP或mac地址分組在一起。通過使用ipset,可以將不同的ip地址進行分組,簡化ip地址的管理和zone的配置。ipset的配置文件在/etc/firewalld/ipsets目錄下,該目錄下一個xml配置文件對應一個ipset。
03-1
ipset配置文件
例如,將以下ip地址組合為一個ipset,配置文件命名為ipset1.xml:
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:net">
<entry>10.12.18.201</entry>
<entry>192.168.5.201</entry>
</ipset>
將以下mac地址組合為一個ipset,配置文件命名為ipset2.xml:
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:mac">
<entry>00:11:22:33:44:55</entry>
<entry>11:22:33:44:55:66</entry>
</ipset>
在public.xml中引用這兩個ipset:
<?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>
<source ipset="ipset1" />
<source ipset="ipset2" />
<service name="dhcpv6-client"/>
<service name="ssh"/>
<rule family="ipv4">
<source ipset="ipset1" />
<port port="3306" protocol="tcp" />
<accept />
</rule>
<rule family="ipv4">
<source ipset="ipset2" />
<port port="8080" protocol="tcp" />
<accept />
</rule>
</zone>
這等同于:
<?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>
<source address="10.12.18.201" />
<source address="192.168.5.201" />
<source mac="00:11:22:33:44:55" />
<source mac="11:22:33:44:55:66" />
<service name="dhcpv6-client"/>
<service name="ssh"/>
<rule family="ipv4">
<source address="10.12.18.201" />
<port port="3306" protocol="tcp" />
<accept />
</rule>
<rule family="ipv4">
<source address="192.168.5.201" />
<port port="3306" protocol="tcp" />
<accept />
</rule>
<rule family="ipv4">
<source mac="00:11:22:33:44:55" />
<port port="8080" protocol="tcp" />
<accept />
</rule>
<rule family="ipv4">
<source mac="11:22:33:44:55:66" />
<port port="8080" protocol="tcp" />
<accept />
</rule>
</zone>
顯然,采用ipset可以極大簡化配置。
04、簡單實戰案例:
04-1
查看firewalld
firewall-cmd --state
04-2
啟動關閉防火墻
#啟動防火墻
systemctl start firewalld
#重啟防火墻
systemctl restart firewalld 或 systemctl reload firewalld
#關閉
systemctl stop firewalld
#設置開機自啟動防火墻
systemctl enable firewalld.service
#查看防火墻設置開機自啟是否成功
systemctl is-enabled firewalld.service
04-2
防火墻端口配置
在開啟防火墻之后,我們有些服務就會訪問不到,是因為服務的相關端口沒有打開。
04-3
查看已開啟的端口
firewall-cmd --list-ports或netstat -ntlp
04-4
查看防火墻規則
firewall-cmd --list-all
04-5
查看允許協議
firewall-cmd --list-protocols
04-6
開啟,關閉,查詢端口
# 查詢端口是否開放
firewall-cmd --query-port=80/tcp
命令規則:
–permanent:表示永久生效,若沒有重啟失效;
– zone :表示作用域
–add-port=80/tcp 表示添加端口,格式為端口/通訊協議
開啟端口的關鍵字:add
移除的關鍵字:remove
#永久增加/開啟80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --add-port=8080/tcp
#重啟防火墻服務
systemctl restart firewalld
#刪除端口
firewall-cmd --remove-port=8080/tcp
05、防火墻IP限制配置:
05-1
允許指定IP訪問所有流量
允許ip訪問的關鍵字:accept
阻止ip訪問的關鍵字:drop
#開啟192.168.43.88訪問
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.43.100" accept"
#重啟防火墻服務
firewall-cmd --reload
#禁止192.168.43.88訪問
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.43.100" drop"
05-2
允許指定IP訪問指定端口
# 允許IPV4 Ip是8.8.8.8 連接端口80 accept表示允許使用
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="8.8.8.8" port protocol="tcp" port="80" accept"
# 允許IPV4 Ip是10.168.186.25 連接端口22 accept表示允許使用
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.168.186.25" port protocol="tcp" port="22" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.168.186.25,10.168.186.211" port protocol="tcp" port="3306" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.168.186.0/24" port protocol="tcp" port="22" accept"
# 以上運行完后提示success則表示配置成功
05-3
允許指定IP訪問指定協議
#阻止ICMP包
firewall-cmd --permanent --add-rich-rule="rule protocol value="icmp" drop"
#允許特定地址通過icmp
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="120.12.23.136" protocol value="icmp" accept"
05-4
允許指定IP訪問指定服務
#允許特定地址可以訪問SSH服務
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.168.186.25" service name="ssh" accept"
05-5
防火墻移除某個服務
firewall-cmd --remove-rich-rule="rule family="ipv4" source address="10.168.186.25" service name="ssh" drop"
#從允許通過防火墻的列表里移除SSH服務
sudo firewall-cmd --remove-service=ssh --permanent
firewall-cmd --remove-rich-rule="rule protocol value="icmp" drop" --permanent
05-6
xml方式查看所有規則--對應zone的xml文件中查看規則
cat /etc/firewalld/zones/public.xml