linux下iptables防火牆詳解
Linux網絡防火牆基礎知識
工作在主機或網絡的邊緣,對于進出的資料封包按照事先定義好的規則中的比對标準進行檢查,并做出對應的處理辦法的機制稱作防火牆。
IP封包首部:主要包含源IP,目标IP
TCP封包首部:主要包含源端口,目标端口,标志位SYN,ACK,RST,FIN
比對标準解釋:
IP: 源IP,目标IP
TCP: 源端口,目标端口
TCP三向交握三個階段表示:
第一階段: SYN=1,FIN=0,RST=0,ACK=0;
第二階段: SYN=1,ACK=1,FIN=0,RST=0;
第三階段: ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)
UDP: 源端口,目标端口
ICMP:icmp-type 0 表示echo-reply, 8 表示echo-request
2.Iptables防火牆分為四個表五個鍊
四個表:filter,nat,mangle,row
五個鍊:PREROUTING,INPUT,FORWORD,OUTPUT,POSTROUTING
filter(過濾表):可應用于此3個規則鍊INPUT,OUTPUT,FORWARD
nat(位址轉換表):可應用于此3個規則鍊PREROUTING,OUTPUT,POSTROUTING
mangle(拆開/修改/封裝等表):可應用于此5個規則鍊,如下: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw(與mangle相反保留資料封包源有格式):可應用于此2個規則鍊PREROUTING,OUTPUT
注意:iptabels :可以使用自定鍊,但隻在被調用時才能發揮作用
可以删除自定義的空鍊,但預設鍊無法删除
每個規則鍊都有兩個内置的計數器:被比對的封包個數和被比對的封包大小之和
3.iptables指令:
格式: iptables [-t 表] 指令 鍊 [num] 比對标準 -j 處理辦法
3.1.比對标準:分為通用比對和擴充比對,而擴充比對又分為隐含擴充和顯式擴充
(1).通用比對:
-s, --src: 指定源位址
-d, --dst:指定目标位址
-p {tcp|udp|icmp}:指定協定
-i 網絡接口: 指定資料封包流入的接口
-o 網絡接口: 指定資料封包流出的接口
(2).擴充比對:
(2.1).隐含擴充:不用特别指明由哪個子產品進行的擴充,因為此時使用-p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目标端口
--tcp-flags mask comp: 隻檢查mask指定的标志位(逗号分隔),comp清單中出現的标記位必須為 1,comp中沒出現,而mask中出現的,必須為0;例如:
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn
-p icmp --icmp-type [0: echo-reply 8: echo-request]
-p udp --sport 或 --dport
(2.2).顯式擴充: 必須指明由哪個子產品進行的擴充,在iptables中使用-m選項可完成此功能
格式:-m 擴充 指定擴充類型 其他選項值
(2.2.1).狀态擴充: -m state 結合ip_conntrack追蹤會話的狀态
NEW: 新連接配接請求
ESTABLISHED:已建立的連接配接
INVALID:非法連接配接
RELATED:相關聯的
例如: -m state --state NEW,ESTABLISHED -j ACCEPT
(2.2.2).離散的多端口比對擴充:-m multiport
--source-ports #将多個不連續源端口寫在一條iptables語句中
--destination-ports #将多個不連續目标端口寫在一條iptables語句中
--ports将多個不連續端口(含源端口和目标端口)寫在一條iptables語句中
例如:-m multiport --destination-ports 21,22,80 -j ACCEPT
(2.2.3).連續的IP位址範圍擴充:-m iprange
--src-range
--dst-range
例如: -m iprange --src-range 1.1.1.2-1.1.1.9 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
(2.2.4).連接配接數限制:-m connlimit
! --connlimit-above n :通常用戶端達到連接配接數上限n拒絕,取反小于n才放行
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT
(2.2.5).機關時間響應限制:-m limit
--limit RATE: 每個機關時間内響應的平均個數
--limit-burst n :首次第一批響應個數
例如:-m limit --limit 5/miniute --limit-burst 10
(2.2.6).比對字元串限制:-m string
--algo {bm|kmp}
--string "STRING"
例如:-m string --algo kmp --sting "abcd" -j REJECT
iptables -I OUTPUT -d 1.1.1.19 -m string --algo kmp --sting "abcd" -j REJECT
條件取反:! 例如:-s ! 172.16.1.1,表示比對除172.16.1.1外所有源IP位址
3.2.指令:
管理規則
-A:附加一條規則,添加在鍊的尾部
-I CHAIN [num]: 插入一條規則,插入為對應CHAIN上的第num條;
-D CHAIN [num]: 删除指定鍊中的第num條規則;
-R CHAIN [num]: 替換指定的規則;
例如:iptables -D INPUT 2 #删除INPUT鍊中第2條規則
管理鍊:
-F [CHAIN]:flush,清空指定規則鍊,如果省略CHAIN,則可以實作删除對應表中的所有鍊
-P CHAIN: 設定指定鍊的預設政策;
-N:自定義一個新的空鍊
-X: 删除一個自定義的空鍊
-Z:清除指定鍊中所有規則的計數器;
-E: 重命名自定義的鍊;
例如:iptables -P INPUT DROP #将INPUT鍊預設政策為拒絕
檢視類:
-L: 顯示指定表中的規則;
-n: 以數字格式顯示主機位址和端口号;
-v: 顯示鍊及規則的詳細資訊,或用-vv,-vvv
-x: 顯示計數器的精确值
--line-numbers: 顯示規則号碼
例如:iptables -L -n #檢視目前INPUT鍊中現有規則
3.3.處理辦法: -j (TARGET)
ACCEPT:放行
DROP:丢棄
REJECT:拒絕,彈回資訊
DNAT:目标位址轉換,常應用于PREROUTING
SNAT: 源位址轉換, 常應用于POSTROUTING
REDIRECT:端口重定向
MASQUERADE:位址僞裝,常應用于ADSL撥号等動态擷取IP場景
MARK:打标記
RETURN:新增鍊傳回主鍊處理
CHAIN:主鍊調用新增鍊
LOG:日志
--log-prefix "STRING"
例如:iptables -I INPUT -d 1.1.1.19 -p icmp -j LOG --log-prefix "firewall log--"
4.iptables不是服務,但有服務腳本,主要作用在于管理儲存的規則
# service iptables save 并儲存在此檔案中:/etc/sysconfig/iptables
service iptables stop 清除并移除iptables相關子產品
service iptatbles start 加載iptables相關子產品
# iptables-save > /etc/sysconfig/iptables.bak
# iptables-restore < /etc/sysconfig/iptables.bak
裝載及移除iptables/netfilter相關的核心子產品;
iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack
5.僅允許1.1.1.0/24網段上能ssh通路1.1.1.19主機,請在1.1.1.19linux主機上寫出對應iptables
iptables -t filter -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWORD DROP
6.允許所有用戶端通路1.1.1.19網站伺服器,請在1.1.1.19linux主機上寫出對應iptables
iptables -t filter -A INPUT -d 1.1.1.19 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -j ACCEPT
iptables -P FORWORD DROP
7.允許1.1.1.19能夠ping通所有主機,但其他主機不能ping1.1.1.19
iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 0 -f ACCEPT
注意:0代表echo-reply響應封包,8代表echo-request請求封包
-t fliter沒有寫,iptables指令預設不寫就是指filter表
預設政策确認是拒絕,否則測試不到效果,拒絕政策如上已給出
8.通過狀态擴充,追蹤連接配接方式,允許所有主機能ssh通路1.1.1.19伺服器,但伺服器不能ssh連出去
iptables -L -n #檢視現有的iptables filter表現有規則
iptables -F #清空iptables filter表所有規則
iptables -A INPUT -d 1.1.1.19 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
9.通過狀态擴充,追蹤連接配接方式,允許所有主機能通路1.1.1.19伺服器網站,但伺服器不能上網
iptables -A INPUT -d 1.1.1.19 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptstate #檢視系統tcp/udp/icmp等連接配接狀态指令
10.通過狀态擴充,追蹤連接配接方式,允許所有主機能PING通1.1.1.19伺服器,但伺服器不能PING出去
iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
11.将OUTPUT鍊中都是ESTABLISHED規則條目.精減彙總成一個條目
iptables -L -n --line-numbles #檢視現有規則
Chain OUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 1.1.1.19 0.0.0.0/0 tcp spt:22 state ESTABLISHED
2 ACCEPT tcp -- 1.1.1.19 0.0.0.0/0 tcp spt:80 state ESTABLISHED
3 ACCEPT icmp -- 1.1.1.19 0.0.0.0/0 icmp type 0 state ESTABLISHED
iptables -I OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED -j ACCEPT
再删除原有3條OUTPUT規則
iptables -D OUTPUT 4
iptables -D OUTPUT 3
iptables -D OUTPUT 2
iptables -L -n #檢視現有OUTPUT規則,隻剩一條剛插入的彙總規則
12.通過狀态擴充,追蹤連接配接方式,允許所有主機能連到1.1.1.19 FTP伺服器
首先加載iptables ftp子產品,即vim /etc/sysconfig/iptables-config
添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
service iptables save
service iptables restart
iptables -I INPUT -d 1.1.1.19 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 1.1.1.19 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED,RELATED -j ACCEPT
13.允許1.1.1.0内用戶端通過1.1.1.19 DNS伺服器解析
解析内網主機:
iptables -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p udp --sport 53 -j ACCEPT
通過根疊代解析外部DNS上網:
iptables -A INPUT -d 1.1.1.19 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p udp --dport 53 -j ACCEPT
14.将INTPUT鍊中都是多個不連續的端口規則條目.精減彙總成一個條目
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 1.1.1.19 state RELATED,ESTABLISHED
2 ACCEPT tcp -- 0.0.0.0/0 1.1.1.19 tcp dpt:22 state NEW,ESTABLISHE
3 ACCEPT tcp -- 0.0.0.0/0 1.1.1.19 tcp dpt:80 state NEW,ESTABLISHED
4 ACCEPT tcp -- 0.0.0.0/0 1.1.1.19 tcp dpt:21 state NEW,ESTABLISHED

iptables -I INPUT 2 -d 1.1.1.19 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iptables -D INPUT 3
iptables -L -n --line-numbles #再檢視現有規則
15.自定義一條鍊Deny_in,拒絕接收ping廣播包,拒絕tcp标志位全為1和全為零,最後傳回INPUT鍊,并讓INPUT鍊調用Deny_in鍊,繼續處理
iptables -N Deny_in
iptables -A Deny_in -d 255.255.255.255 -p icmp -j DROP
iptables -A Deny_in -d 172.16.255.255 -p icmp -j DROP
iptables -A Deny_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A Deny_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A Deny_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A Deny_in -d 1.1.1.19 -j RETURN
iptables -I INPUT -j Deny_in
16.利用iptables的recent子產品來抵禦DOS攻擊,
利用connlimit子產品将單IP的并發設定為10;可以根據實際情況增大該值;
利用recent和state子產品限制單IP在120s内隻能與本機建立3個新連接配接。否則會被限制2分鐘,
2分鐘後才能恢複通路連接配接。
iptables -I INPUT 2 -p tcp --dport 22 -m connlimit --connlimit-above 10 -j DROP
iptables -I INPUT 3 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT 4 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 120 --hitcount 3 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 120 --hitcount 3 -j LOG --log-prefix "SSH Attack" #記錄日志
說明:上面第二句是記錄通路tcp 22端口的新連接配接,記錄名稱為SSH
--set 記錄資料包的來源IP,如果IP已經存在将更新已經存在的條目
上面第三句是指SSH記錄中的IP,120s内發起超過3次連接配接則拒絕此IP的連接配接。
--update 是指每次建立連接配接都更新清單;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用
17.利用SNAT技術:linux防火牆主機有兩塊網卡,内網卡IP為192.168.1.1,外網卡公網位址為 202.98.7.10,讓192.168.1.0/24所有用戶端上網,實作源位址靜态轉換
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.98.7.10
注意要開啟ip_forward路由功能,回包目标位址轉換将會是自動進行,無需人工幹預
18.利用MASQUERADE技術,如果是ADSL撥号上網,linux防火牆主機有兩塊網卡,内網卡IP為192.168.1.1,外 網卡公網位址為動态擷取,讓192.168.1.0/24所有用戶端上網,實作源位址動态轉換
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE #下面一條指令功能一樣
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
注意:如果是ADSL撥号上網,需安裝rp-pppoe撥号軟體
19.Forward轉發功能:讓内網1.1.1.0/24所有用戶端能通路外部網站,但外網不能通路内網用戶端
iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -P FORWARD DROP
20.Forward轉發功能:讓内網1.1.1.0/24所有用戶端能PING通外部,但外網不能PING内部
iptables -A FORWARD -s 1.1.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
21.Forward轉發功能:讓内網1.1.1.0/24所有用戶端能連接配接外部FTP,但外網不能FTP内部
iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A FORWARD -m state --state RELATED ESTABLISHED -j ACCEPT
注意:加載iptables ftp子產品,即vim /etc/sysconfig/iptables-config
添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
22.利用DNAT技術:linux防火牆主機有兩塊網卡,内網卡IP為1.1.1.1,外網卡公網位址為202.98.7.10,讓外網可通路内通路1.1.1.18網站,實作目标位址轉換
iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18
23.利用DNAT技術:linux防火牆主機有兩塊網卡,内網卡IP為1.1.1.1,外網卡公網位址為202.98.7.10,讓外網可通路内通路1.1.1.18:8080網站,實作目标位址轉換
iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18:8080
24.Forward轉發功能:拒絕轉發含有非法字樣如"abcd"字元串内容資訊
iptables -A FORWARD -m string --algo kmp --string "abcd" -j DROP
25.利用iptables技術根據協定協定特征碼禁止内網用戶端使用qq,skype,msn,迅雷等七層協定軟體
要想使用七層協定,必須使linux系統達到以下條件
25.1.給核心打更新檔,并重新編譯核心
25.2.給iptables源碼打更新檔,并重新編譯iptables
25.3.安裝l7proto,七層協定
下載下傳:核心:linux-2.6.28.10.tar.gz,網絡過濾器:netfilter-layer7-v2.22.tar.gz以及
協定特征碼:l7-protocols-2009-05-28
首先給核心打更新檔,并重新編譯核心
# tar zxvf linux-2.6.28.10.tar.gz -C /usr/src
# tar zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src
# cd /usr/src
# ln –s linux-2.6.28.10 linux
# cd /usr/src/linux/
# patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
# cp /boot/config-2.6.18-164.el5 /usr/src/linux/.config
# make menuconfig
主要編譯選項:
Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration
<M> Netfilter connection tracking support
<M> “layer7” match support
<M> “string” match support
<M> “time” match support
<M> “iprange” match support
<M> “connlimit” match support
<M> “state” match support
<M> “conntrack” connection match support
<M> “mac” address match support
<M> "multiport" Multiple port match support
Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
<M> IPv4 connection tracking support (required for NAT)
<M> Full NAT
<M> MASQUERADE target support
<M> NETMAP target support
<M> REDIRECT target support
# make
# make modules_install
# make install
給iptables源碼打更新檔,并重新編譯iptables
# cp /etc/init.d/iptables ~/iptables
# cp /etc/sysconfig/iptables-config ~/
# rpm -e iptables-ipv6 iptables iptstate --nodeps
# tar jxvf iptables-1.4.6.tar.bz2 –C /usr/src
# cd /usr/src/iptables-1.4.6
cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/
# ./configure --prefix=/usr --with-ksource=/usr/src/linux
# make
安裝七層協定特征碼:
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# mv ~/iptables /etc/rc.d/init.d/
注意:編譯的iptables的二進制檔案與rpm包安裝的路徑有所不同,如需運作iptables腳本服務,必須修改對應的腳本檔案裡的指令路徑
# service iptables start
七層協定相關iptables指令格式:
iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
禁止内網192.168.1.0/24通過202.100.8.66外網口登入qq
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.100.8.66
iptables -I FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP
25.4.限制用戶端上網時間段iptables指令
iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 08:00:00-12:00:00 -j DROP
iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 14:00:00-17:00:00 -j DROP