netfilter/iptables是集成在linux2.4.x版本內核中的包過濾防火牆系統。
該框架可以實現數據包過濾,網絡地址轉換以及數據包管理功能。linux中的防火牆系統包括兩個部分:netfilte和iptables。netfilte可以對本機所有流入、流出、轉發的數據包進行查看、修改、丟棄、拒絕等操作。由於netfilter在內核空間中,用戶通常無法接觸內核和修改內核,此時需要命令行工具,一般使用iptables,firewalld等工具。使用iptables可以添加、刪除具體的過濾規則,iptables默認維護四個表和五個鏈,所有的防火牆策略規則都將被分別寫入表和鏈中。centos7系統防火牆模塊存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目錄下,當需要某個模塊功能時,可以通過modprobe加載。
centos7在原有的netfilter/iptables架構上又增加了firewalld。iptables工具是一個比較低級別的工具,僅可以調整ipv4的防火牆規則,所以在centos7上使用了firewalld作爲默認的用戶防火牆工具,但當用戶使用firewalld編寫ipv4防火牆規則時,firewalld依然是調用了底層的iptables實現具體的功能,只是這個調用過程對用戶是透明的。
一、iptables
默認的iptables規則表又fileter表(過濾規則表),nat表(地址轉換規則表)、mangle(修改數據標記位規則表)、raw(跟蹤數據表規則表)。每個規則表中包含多個數據鏈:INPUT(入站數據過濾)、OUTPUT(出站數據過濾)、FORWARD(轉發數據過濾)、PREROUTING(路由前過濾)和POSTROUTING(路由後過濾),防火牆規則需要寫入到這些具體的數據鏈中。
以下爲流程
1)外部主機發送數據包給防火牆本機,數據將會經過PEROUTING與INPUT鏈;
2)如果防火牆本機發送數據包到外部主機,數據經過OUTPUT於POSTRTOUTING鏈
3)如果防火牆作爲路由負責轉發數據,則數據經過PEROUTING鏈、FORWARD鏈已經POSTROUTING鏈
iptables的表與鏈的關係如下所示:
1.1 iptables的語法
iptables定義規則的方式比較複雜:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3個filter nat mangle
COMMAND:定義如何對規則進行管理
chain:指定你接下來的規則到底是在哪個鏈上操作的,當定義策略的時候,是可以省略的
CRETIRIA:指定匹配標準
-j ACTION :指定如何進行處理
選項:
-t 指定需要維護的防火牆規則表,不使用-t時,則默認操作對象爲filter表
-A 追加防火牆規則
-D 刪除防火牆規則
-I 插入防火牆規則
-F 清空防火牆規則
-L 列出防火牆規則
-R 替換防火牆規則
-Z 清空防火牆數據表統計信息
-P 設置默認規則
匹配參數:
[!]-p 匹配協議,!代表取反
[!]-s 匹配源地址
[!]-d 匹配目標地址
[!]-o 匹配入站網卡接口
[!]--sport 匹配源端口
[!]--dport 匹配目的端口
[!]--src-range 匹配目標地址範圍
[!]--dst-range 匹配目標地址範圍
[!]--limit 匹配數據錶速率
[!]--mac-source 匹配源mac地址
[!]--sports 匹配多個源地址
[!]--dports 匹配多個目的地址
[!]--state 匹配狀態(INVALID,ESTABLISHED,NEW,EELATED)
[!]--string 匹配應用層字符串
觸發動作:
ACCEPT 允許數據包通過
REJECT 拒絕數據包通過
LOG 將數據包信息記錄syslog日誌
DNAT 目標地址轉換
SNAT 源地址轉換
MASQUERADE 地址欺騙
REDIRECT 重定向
iptables防火牆規則的順序非常重要,內核按順序檢查這些規則,如果發現有匹配的股則條目按,則立刻執行相關動作,停止繼續向下查找規則條目,如果所有的防火牆規則都未能匹配成功,
則按照默認策略處理。使用-A選項添加防火牆規則會將該規則追加到整個鏈的最後,而使用-I選項添加的規則則默認會插入到鏈中作爲第一條規則。下面通過實例簡單演示iptables命令的使用方法。
iptables -nL #查看filter表的所有規則 iptables -t nat -nL #查看nat表所有的規則 iptables -F #清空filter表中所有的規則 iptables -A INPUT -s 192.168.0.1 -j DROP #向filter表中添加一條新的入站規則,丟棄192.168.0.1主機發送給防火牆本機的所有的數據包 iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT #向filter表中插入一條新的入站規則,拒絕192.168.0.22 ping iptables -nL --line-number #查看錶中防火牆規則並顯示規則編號 iptables -D INPUT 1 #刪除表中INPUT鏈的第一條規則 iptables -R INPURT 2 ! -s 192.168.0.254 -j REJECT #替換filter表中INPUT鏈的第二條規則,拒絕192.168.0.254之外的任何主機連接防火牆本機 iptables -t fileter -p INPUT ACCEPT #修改filte表中INPUT鏈的默認規則爲接收數據包 iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG #將192.168.0.10主機發送給防火牆本機的22端口的所有數據包信息記錄到messages日誌 iptables -I INPUT -i eth1 --p tcp --dport 80 -j ACCEPT #允許任何主機從eth1網絡接口訪問本機的80端口
1.2運用舉例
1) 允許任意客戶端訪問服務器主機提供的日常服務(HTTP,HTTPS,DNS,NTP,SMTP,POP3,SSH),在linux系統中,/etc/services文件可以找到各種服務所對應的標準端口信息
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p udp --dport 25 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp --dport 143 -j ACCEPT iptables -A INPUT -p tcp --dport 123 -j ACCEPT iptables -P INPUT -P INPUT DROP iptables -P INPUT -p OUTPUT ACCEPT
2)使用SNAT共享上網,服務器作爲軟路由,內部所有的192.168.0.0/24網端內的主機連接外網時,防火牆自動將所有源地址修改爲公網IP,最後互聯網將信息返回給路由後,由路由再轉交給真正的後端主機。防火牆源地址轉換(SNAT)規則需要被寫入到NAT表中的POSTROUTING鏈
vim /etc/sysctl.conf
systctl -p #重新加載內核參數配置文件 iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.125.199.84 #配置nat表,使用snat方式將源地址段192.168.0.0/24 轉換爲124.125.199.84公網地址
3)配置DNAT,外部網絡公網IP訪問內網業務服務器
sed -i '$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf #配置文件最後一行添加 systctl -p #重新加載內核配置文件 iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100 #配置nat表,使用dnat方式,訪問公網地址80端口轉換192.168.0.100 iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
4)限制單位時間內數據包的個數,防止網絡***發送大量無效的數據包給服務器,造成服務器無法響應正常的請求包
iptables -I INPUT -m limit --limit 500/sec -j ACCCEPT #當每秒數據包個數爲500的時候接收入站連接,否則拒絕連接 iptables -P INPURT DROP
5)根據數據連接狀態設置防火牆規則,放行所有的出站數據包,拒絕入站的新連接請求與無效鏈接,放行入站的迴應請求
iptables -F iptables -A INPUT -m state --state NEW -j DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -P OUTPUT ACCEPT
6)防火牆設置規則,記錄192.168.0.1 到192.168.0.22地址段內所有的主機發送給路由要求轉發的數據包,並允許轉發這些數據包
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT
1.4 iptables備份與還原
默認的iptables防火牆規則會立刻生效,但是如果不保存,當計算機重啓後,所有的規則將會丟失,所以需要即時保存。
iptables軟件包提供了兩個非常有用的工具,iptables-save和iptables-restore,可以方便的處理大量的防火牆規則。centos7系統中的防火牆規則默認保存再/etc/sysconfig/iptables文件中,使用iptables-save將規則保存至該文件中實現保存防火牆規則的作用,重啓後會自動加載該文件中的規則。如果使用iptables-save將規則保存到其他位置,可以實現備份防火牆規則的作用。當防火牆規則需要做還原時,可以使用iptables-restore將備份文件直接導入當前防火牆規則。
iptables-save > /etc/sysconfig/iptables iptables-save > firewall.bak iptables-restore < firewall.bak
二、firewalld
firewalld將所有的網絡流量都分類匯聚到zones中,它通過zones管理防火牆規則,每一個進入系統的數據包,都會首先檢查源IP地址和接口,如果與某個zone匹配,則該zone的規則將生效。而每個zone都會有開啓或關閉服務和端口的列表,以實現允許或拒絕鏈接服務和端口。如果數據包的源IP地址和網卡接口都不能和任何zone匹配,則該數據包將匹配默認zone,一般情況下是一個public的默認zone。firewalld會提供block,dmz,drop,external,home,internal,public,trusted,work這九個zone。比如有一個數據包從eno1網卡進入本機,根據規則進入work這個zone而在work這和zone中有允許訪問http服務的規則,則最後該數據包將可以進入本機並訪問http服務
大部分zone都定義的有自己的允許規則,規則通過端口/協議(631/udp)或者預定義的服務(ssh)這種形式設置,如果數據包沒有匹配這些允許的規則,則該數據包一般會被防火牆拒絕。但是如果有名爲trusted的zone,默認會運行所有的數據流量,如果有一個數據包進入了該zone,則被允許訪問所有的資源。
具體的firwalld預定義zone及其描述信息如下所示:
drop(丟棄):任何接受的網絡數據包都被丟棄,沒有任何回覆,
僅能有發送出去的網絡連接(數據包不能進來,但是可以出去)
block(限制):任何接受的網絡連接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒絕。(和drop相比,比較寬鬆一些,主要是爲了針對icmp)
piblic(公共):在公共區域內使用,不能相信網絡內其他計算機不會對你造成危害,只能接受經過選取的連接。
external(外部):特別是爲路由器啓用了僞裝功能的外部網,你不能信任來自網絡的其他計算,不能相信他們不會對你造成傷害,只能接受經過選擇的連接。
dmz(非軍事區):用於你的非軍事區內的電腦,此區域可公開訪問,可以有限的進入你的內部網絡,僅僅接受經過選擇的連接。
work(工作):用於工作區,你可以基本信任網絡內的其他電腦不會對你造成危害,僅僅接收經過選擇的連接。
home(家庭):用於內部網絡,你可以基本上信任網絡內其他電腦不會對你造成危害,僅僅接收經過選擇的連接。
internal(內部):用於內部網絡,你可以基本上信任網絡內其他電腦不會對你造成危害,僅僅接收經過選擇的連接。
trusted(信任):可接受所有的網絡連接。
2.1 firewalld-cmd命令
可以使用firewall-cmd命令來管理防火牆規則,語法格式如下:
用法:
firwall-cmd [OPTIONS....]
選項:
--get-default-zone 獲取默認zone信息
--set-default-zone=<zone> 設置默認zone
--get-active-zones 顯示當前正在使用的zone信息
--get-zones 顯示系統預定義的zone
--get-zone-of-interface=<interface> 查詢某個接口與哪個zone匹配
--get-zone-of-source=<source>[/<mast>/] 查詢某個源地址與哪個zone匹配
--list-all-zones 顯示所有的zone信息的所有規則
--add-service=<service> 向zone中添加允許訪問的服務
--add-port=<portid>[-<portid>]/<protocol> 向zone中添加允許訪問的端口
--add-interface=<interface> 將接口與zone綁定
--add-source=<source>[/<mask>/] 將源地址與zone綁定
--list-all 列出某個zone所有的規則信息
--remove-service=<service> 從zone中移除允許某個服務的規則
--remove-port=<portid>[-<portid>]/<protocol> 從zone中移除允許的某個端口規則
--remove-source=<source>[/<mask>] 將源地址與zone解除綁定
--remove-interface=<interface> 將網卡接口與zone接觸綁定
--permanent 設置永久有效的規則,默認的情況規則都是臨時的
--reload 重新加載防火牆規則
firewall-cmd --get-default-zone #查看默認zone,爲public firewall-cmd --set-default-zone=trusted #設置默認zone爲trusted
firewall-cmd --get-active-zones #顯示當前正在使用的zone信息
firewall-cmd --get-zones #顯示系統預定義的zone,默認爲九個zone
firewall-cmd --get-services #顯示系統預定義的服務名稱
firewall-cmd --get-zone-of-interface=ens192 #查詢接口匹配的zone
firewall-cmd --list-all-zones #顯示所有的zone以及對應的規則信息
firewall-cmd --add-service=ftp --zone=public #public中添加允許訪問ftp服務的規則 firewall-cmd --remove-service=ftp --zone=public #public中刪除允許訪問ftp服務的規則 firewall-cmd --add-port=3306/tcp --zone=public #public中添加允許訪問3306服務的規則 firewall-cmd --remove-port=3306/tcp --zone=public #public中刪除允許訪問3306服務的規則 firewall-cmd --add-interface=eno1 --zone=public #將網卡eno1與public綁定,流量接入該接口匹配public規則 firewall-cmd --remove-port=eno1 --zone=public #將網卡eno1與public解綁定 firewall-cmd --add-source=1.1.1 --zone=public #將源地址1.1.1.1與public綁定,以後該主機訪問本機時匹配public中的規則 firewall-cmd --list-all --zone=public #查看public中這個zone的規則列表 firewall-cmd --permanet --add-port=3306/tcp --zone=public #public中添加一條永久規則 firewall-cmd --reload #重啓防火牆
一般在實際運維中,我們主要使用 iptables做爲防火牆,將firewalld服務禁用,避免干擾