netfilter/iptables是集成在linux2.4.x版本內核中的包過濾防火牆系統。linux
該框架能夠實現數據包過濾,網絡地址轉換以及數據包管理功能。linux中的防火牆系統包括兩個部分:netfilte和iptables。netfilte能夠對本機全部流入、流出、轉發的數據包進行查看、修改、丟棄、拒絕等操做。因爲netfilter在內核空間中,用戶一般沒法接觸內核和修改內核,此時須要命令行工具,通常使用iptables,firewalld等工具。使用iptables能夠添加、刪除具體的過濾規則,iptables默認維護四個表和五個鏈,全部的防火牆策略規則都將被分別寫入表和鏈中。centos7系統防火牆模塊存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目錄下,當須要某個模塊功能時,能夠經過modprobe加載。vim
centos7在原有的netfilter/iptables架構上又增長了firewalld。iptables工具是一個比較低級別的工具,僅能夠調整ipv4的防火牆規則,因此在centos7上使用了firewalld做爲默認的用戶防火牆工具,但當用戶使用firewalld編寫ipv4防火牆規則時,firewalld依然是調用了底層的iptables實現具體的功能,只是這個調用過程對用戶是透明的。
後端
1、iptablescentos
默認的iptables規則表又fileter表(過濾規則表),nat表(地址轉換規則表)、mangle(修改數據標記位規則表)、raw(跟蹤數據表規則表)。每一個規則表中包含多個數據鏈:INPUT(入站數據過濾)、OUTPUT(出站數據過濾)、FORWARD(轉發數據過濾)、PREROUTING(路由前過濾)和POSTROUTING(路由後過濾),防火牆規則須要寫入到這些具體的數據鏈中。bash
如下爲流程服務器
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
2、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服務禁用,避免干擾