一名致力於在技術道路上的終身學習者、實踐者、分享者,一位忙起來又偶爾偷懶的原創博主,一個偶爾無聊又偶爾幽默的少年。html
1、Linux 防火牆基礎
Linux防火牆
主要工做在網絡層,針對 TCP/IP
數據包實施過濾和限制,典型的包過濾防火牆,基於內核編碼實現,具備很是穩定的性能和高效率。git
-
iptables
:用來管理 Linux 防火牆的命令程序,位於/sbin/iptables
目錄下,屬於用戶空間
的防火牆管理體系。github -
netfilter:Linux
內核中實現包過濾防火牆的內部結構,通常不以程序
或文件
的形式存在,屬於內核空間
的防火牆管理體系。安全
iptables 的做用
:爲包過濾機制的實現提供規則,經過各類不一樣的規則,來告訴netfilter
對來自某些源以及前往某些目的或具備某些協議特徵的數據包是如何進行處理的。服務器
2、iptables 的表、鏈結構
每一個規則表
,其實就至關於一個內核空間的容器,按照規則集
的不一樣用途進行劃分爲默認的四個表,在每一個規則表
中包含不一樣的規則鏈
,處理數據包的不一樣時機分爲五種鏈
,決定是否過濾或處理數據包的各類規則並按照前後順序存放在各規則鏈
中。網絡
-
規則的做用:對數據包進行過濾或處理;ssh
-
鏈的做用:容納多種防火牆規則;tcp
規則表
iptables
管理着四個不一樣的規則表,分別由獨立的內核模塊實現。post
-
filter 表
:用來對數據包進行過濾,具體的規則要求決定如何處理一個數據包。性能對應的內核模塊爲:
iptable_filter
,其表內包括三個鏈:input
、forward
、output
; -
nat 表
:nat 全稱:network address translation 網絡地址轉換,主要用來修改數據包的 IP 地址、端口號信息
。對應的內核模塊爲:
iptable_nat
,其表內包括三個鏈:prerouting
、postrouting
、output
; -
mangle 表
:主要用來修改數據包的服務類型
,生存週期
,爲數據包設置標記,實現流量整形、策略路由等。對應的內核模塊爲:
iptable_mangle
,其表內包括五個鏈:prerouting
、postrouting
、input
、output
、forward
; -
raw 表
:主要用來決定是否對數據包進行狀態跟蹤。對應的內核模塊爲:
iptable_raw
,其表內包括兩個鏈:output
、prerouting
;
規則鏈
-
input 鏈
:當收到訪問防火牆本機地址的數據包時,將應用此鏈中的規則; -
output 鏈
:當防火牆本機向外發送數據包時,將應用此鏈中的規則; -
forward 鏈
:當收到須要經過防火中轉發給其餘地址的數據包時,將應用此鏈中的規則; -
prerouting 鏈
:在對數據包作路由選擇以前,將應用此鏈中的規則; -
postrouting 鏈
:在對數據包作路由選擇以後,將應用此鏈中的規則;
input 鏈 和 output 鏈主要用在主機型防火牆,是針對服務器本機進行保護的防火牆;
forward 鏈、prerouting 鏈、postrouting 鏈主要用在網絡型防火牆,是針對公司內網與 Internet 之間進行安全控制。
3、數據包過濾的匹配流程
規則表之間的順序
當數據包到達防火牆時,若是對應的鏈內有規則存在,將按照順序依次從raw 表
→mangle 表
→nat 表
→filter 表
。
規則鏈之間的順序
-
入數據流向
:若是是外邊的數據包到達防火牆後,要先經過prerouting 鏈
:對數據包作路由選擇以後,將應用此鏈中的規則,而後將進行路由選擇,確認數據包的目標地址是不是防火牆本機,結合內核傳送給input
鏈作處理,確認經過以後,即可以交給服務器端來進行響應。 -
轉發數據流向
:若是是外邊的數據包到達防火牆後,要先經過prerouting 鏈
作相關處理,隨後進行路由選擇,數據包的目標地址是任何其餘地址的話,則將經過內核傳給forward
來進行處理是否須要經過或直接丟棄,最後將交給postrouting 鏈
來查看是否有須要修改的數據包信息來進行處理。 -
出數據流向
:出流量,其實就是防火牆本機向外的地址發送數據包,首先被output 鏈
處理,而後選擇路由,而後在postrouting 鏈
查看是否修改數據包的信息來進行處理。
規則鏈內部各條防火牆規則之間的順序
數據包通過每條規則鏈時,將按照第一條規則、第二條規則……的順序進行匹配和處理。
鏈內的過濾原則
-
將按照從
匹配到中止
的方式,如找到一條匹配的規則,將再也不執行本鏈中後續的其餘規則; -
若是對比整個鏈也找不到與數據包相匹配的規則時,將按照該規則鏈的默認策略進行處理;
4、編寫防火牆規則
iptables 的基本語法命令格式
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
複製代碼
-
表名
、鏈名
:指定iptables
命令所操做的表
和鏈
,未指定表名時將默認使用filter
表; -
管理選項
:表示iptables
規則的操做方式,好比:插入
、增長
、刪除
、查看
等; -
匹配條件
:指定要處理的數據包的特徵,不符合指定條件的數據包不在處理; -
控制類型
:指數據包的處理方式,好比:容許
、拒絕
、丟棄
等;
iptables 防火牆最經常使用的控制類型
-
accept
:容許數據包; -
drop
:丟棄數據包,且不給任何迴應信息; -
reject
:拒絕數據包,必要時會給數據發送端一個響應信息; -
log
:在/var/log/messages
文件中記錄日誌信息,而後將數據包傳遞給下一個地址;
iptables 防火牆的最經常使用基本操做
iptables 命令的經常使用管理選項
-A:在指定鏈的末尾添加一條新的規則
-D:刪除指定鏈中的某一條規則,可刪除指定序號或具體內容
-I:在指定鏈中插入一條新規則,未指定序號時默認做爲第一條規則
-R:修改、替換指定鏈中的某一條規則,可指定規則序號或具體內容
-L:列出指定鏈中全部的規則,未指定鏈名,則列出表中的全部鏈
-F:清空指定鏈中全部的規則,未指定鏈名,則清空表中的全部鏈
-P:設置指定鏈的默認策略
-n:使用數字形式顯示輸出結果
-v:查看規則列表時顯示詳細的信息
-h:查看命令幫助信息
--line-numbers:查看規則列表時,同時顯示規則在鏈中的順序好
複製代碼
添加新的規則
添加新的防火牆規則時,可以使用管理選項-A
:用來追加規則-l
:用來插入規則;
在filter 表 INPUT 鏈
的末尾添加一條規則,可以使用-p
協議名來作匹配條件;
# iptables -t filter -A INPUT -p tcp -j ACCEPT
複製代碼
使用管理選項-I
,容許同時制定添加規則的順序號,未指定序號時默認做爲第一條規則;
添加兩條規則分別位於filter
表的第一條、第二條,將使用默認的filter
表;
# iptables -I INPUT -p udp -j ACCEPT
# iptables -I INPUT 2 -p icmp -j ACCEPT
複製代碼
查看規則列表
查看防火牆規則時,需使用管理選項-L
並結合--line-numbers
選項顯示各條規則在鏈內的順序號;
查看filter 表 INPUT 鏈
中的全部規則,並顯示規則序號;
# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
4 ACCEPT icmp -- anywhere anywhere
5 ACCEPT all -- anywhere anywhere
6 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
7 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
8 ACCEPT tcp -- anywhere anywhere
複製代碼
防火牆規則多時,能夠以數字形式顯示地址和端口信息,減小地址解析的過程,加快命令的執行速度。
以數字形式查看默認表INPUT 鏈
中的全部規則,可結合參數-nL
或者拆分-n -L
的方式來操做;
# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
複製代碼
刪除、清空規則
刪除filter 表 INPUT 鏈
中的第三條規則,可以使用管理選項-D
來刪除一條防火牆規則;
# iptables -D INPUT 3
# iptables -n -L INPUT
複製代碼
清空指定鏈或表中的全部防火牆規則,可以使用管理選項-F
;
# iptables -F INPUT
# iptables -n -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
複製代碼
省略鏈名而清空指定表全部鏈的規則,可以使用管理選項-F
;
# iptables -F
# iptables -t nat -F
# iptables -t mangle -F
複製代碼
設置默認策略
默認策略的控制類型分爲:accept
、drop
兩種。
將filter 表
中的FORWARD 鏈
的默認策略設置爲:丟棄,OUTPUT 鏈
的默認策略設置爲:容許;
# iptables -t filter -P FROWARD DROP
# iptables -P OUTPUT ACCEPT
複製代碼
5、規則的匹配條件
通用匹配
:稱爲常規匹配,可獨立使用,不依賴於其餘條件或擴展模塊。
協議匹配
編寫規則時使用-p 協議名
的形式指定;
用來檢查數據包所使用的網絡協議,可用的協議類型文件位於:/etc/procotols
中。
# iptables -I INPUT -p icmp -j DROP
# iptables -A FORWARD ! -p icmp -j ACCEPT
複製代碼
地址匹配
編寫iptables
規則時使用-s 源地址
或-d 目標地址
的形式指定;
用來檢查數據包的源地址或目標地址。(IP地址、網段地址)
不建議使用主機名、域名地址;
比方說:若要拒絕轉發源地址爲 192.168.123.123 的數據,但容許轉發源地址位於 192.168.1.0/24 網段的數據;
# iptables -A FORWARD -s 192.168.123.123 -j REJECT
# iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
複製代碼
比方說:若要檢測到來自某個網站的頻繁掃描、登陸時,可添加防火牆規則進行封鎖;
# iptables -I INPUT -s 192.168.123.0/24 -j DROP
# iptables -I FORWARD -s 192.168.123.0/24 -j DROP
複製代碼
網絡接口匹配
編寫iptables
規則時使用-i 接口名
和-o 接口名
的形式指定;
用來檢查數據包從防火牆的哪個接口進或出的,而且分別對應入站/出站網卡;
比方說:若要丟棄從外網接口訪問防火牆本機且源地址爲私有地址的數據包;
# iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
# iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
複製代碼
隱含匹配
:以指定的協議匹配做爲前提條件,對應的功能由iptables
在須要時自動隱含
載入內核。
常見的隱含匹配:端口匹配、TCP匹配、ICMP匹配;
端口匹配
編寫iptables
規則時使用--sport 源端口
或者--dport 目標端口
的形式指定;
針對的協議類型爲:TCP、UDP
用來檢查數據包的源端口或目標端口。
單個端口號或者以冒號:
分隔的端口範圍是能夠接受的,但不連續的多個端口是不能夠採用的。
比方說:容許爲網段 192.168.123.0/24 轉發 http 查詢數據包;
# iptables -A FORWARD -s 192.168.123.0/24 -p udp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 192.168.123.0/24 -p udp --dport 80 -j ACCEPT
複製代碼
比方說:搭建 ftp 服務時,開放 20、21 端口,以及用於被動模式的端口範圍爲 24 100~25 200;
# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 24100:25200 -j ACCEPT
複製代碼
ICMP 匹配
編寫iptables
規則時使用--icmp-type ICMP 類型
的形式指定;
針對的協議:ICMP,用來檢查 ICMP 數據包的類型。
ICMP 類型使用字符串或數字顯示
-
echo-request
:8(ICMP 協議請求) -
echo-reply
:0(ICMP 協議回顯) -
destination-unreachable
:3(ICMP 協議目標不可達)
比方說:若要禁止從其餘主機 ping 本機,可是容許本機 ping 其餘主機。
# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp -j DROP
複製代碼
更多可用的 ICMP 協議類型,可執行iptables -p icmp -h
進行查看;
顯示匹配
該匹配方式須要有額外的內核模塊提供支持,以-m 模塊名稱
的形式調用相應的模塊,而後設置匹配條件。
常見的顯示匹配:多端口匹配、IP 範圍匹配、MAC 地址匹配、狀態匹配;
多端口匹配
編寫iptables
規則時使用-m multiport --dports 端口列表
、-m multiport --sports 端口列表
的形式指定;
用來檢查數據包的源端口、目標端口、多個端口之間以逗號進行分隔;
比方說:若要容許本機開放端口:80、44三、110 等等,提供相關服務;
# iptables -A INPUT -p tcp -m multiport --dport 80,443,110 -j ACCEPT
複製代碼
IP 範圍匹配
編寫iptables
規則時使用-m iprange --src-range IP 範圍
、-m iprange --dst-range IP 範圍
的形式指定;
用來檢查數據包的源地址、目標地址;
IP 範圍:起始地址-結束地址
的形式表示;
比方說:要禁止轉發源 IP 地址位於 192.168.8.100 與 192.168.8.123 之間的 TCP 數據包;
# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.8.100-192.168.8.123 -j ACCEPT
複製代碼
MAC 地址匹配
編寫iptables
規則時使用-m mac --mac-source MAC 地址
的形式指定;
用來檢查數據包的源 MAC 地址,只適用於內部網絡;
比方說:要根據 MAC 地址封鎖主機,禁止其訪問本機的任何應用;
# iptables -A INPUT -m mac --mac-source MAC 地址 xxx -j DROP
複製代碼
狀態匹配
編寫iptables
規則時使用-m state --state 鏈接狀態
的形式指定;
基於iptables
的狀態跟蹤機制用來檢查數據包的鏈接狀態;
常見的鏈接狀態包括:new(與任何鏈接無關)、established(響應請求或已創建鏈接)、related(與有鏈接相關性的);
比方說:要禁止轉發與正常 TCP 鏈接無關的非 --syn 請求數據包;
# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
複製代碼
只開放本機的 WEB 服務,但對發給本機的 TCP 數據包進行放行,其餘入數據包丟棄;
# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
# iptables -P INPUT DROP
複製代碼
總結
以上就是今天的所有內容了,從 Linux 防火牆基礎、iptables 的表、鏈結構、數據包過濾的匹配流程、編寫防火牆規則以及規則的匹配條件等內容;
原創不易,若是你以爲這篇文章對你有點用的話,麻煩 請給咱們的開源項目點點star: http://github.crmeb.net/u/defu 不勝感激 !
咱們下期再見!