Iptables

#####################################

基礎原理

實戰練習之隱式規則

實戰練習之顯式規則

SNAT

DNAT

iptables七層過濾

Panabit

#####################################

基礎原理

防火牆的定義

   工作在主機或網絡的邊緣,對於進出的數據報文按照事先定義好的規則中的標準進行檢查,一旦符合標準隨後便採取此規則定義的處理動作的機制稱作防火牆。


Linux防火牆iptables

分別由位於內核空間的netfilte和用戶空間的iptables組合

netfilter Frame

iptables 數據報文過濾,NAT,mangle等規則生成的工具

數據包進入linux主機有可能會進過5個過濾點,這五個過濾點又稱爲hook function(鉤子函數),他們分別是:

input;output ;forward;prerouting;postrouting

每一個鉤子函數上都可以有多條規則,叫做規則鏈。因此有五個規則鏈:

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

iptable可以定義4類規,這裏規則中可以由不同的鏈構成,因此這個表分別是:

filter(過濾)表

INPUT

OUTPUT

FORWARD

nat(地址轉換)表

PREROUTING

POSTROUTING

mangle(拆開、修改、封裝)表

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

raw(還原原始)表

PREROUTING

OUTPUT

192623754.jpg

優先級次序爲

raw-mangle-nat-filter

基本語法

iptabels [-t table] common chain [num] 匹配標準-j 處理辦法

管理規則

-A 附加一條規則,在鏈的尾部

-I chain [num] 插入一條規則,插入爲對應chain上的第幾條,如果省略則表示插入爲第一條

-Dchain [num] 刪除制定鏈中第num條規則,如果省略表示刪除第一條

-Rchain [num] 替換指定的規則

管理鏈

-F [chain] 清空制定規則鏈,如果省略chain,則可以實現刪除對應表中的所有鏈

-P chain 設置制定鏈的默認策略

-N 自定義一個新的空鏈

-X 刪除一個自定義的空鏈

-Z 置零制定鏈中所有規則的計數器

-E 重命名自定鏈

查看類

-L 顯示制定表中的所有規則

-n 以數據格式顯示主機地址和端口號

-v 顯示詳細信息

-vv

-x 顯示計數器的精確值

--line-numbers 顯示規則號碼

iptables不是服務,但有服務腳本,服務腳本的主要作用在於生效保存的規則,因爲規則在內核空間的內存之中,重啓就沒有了。

iptables停止服務的過程就是移除這些模塊的過程,腳本作用主要是完成裝載及移除iptables/netfilter相關的內核模塊

iptables_net iptables_filter iptables_mangle iptables_raw ip_nat ip_conntrack

lsmod | grep ip查看相關功能模塊



實戰練習之隱式規則

放行本機192.168.1.190 ssh服務被192.168.1.0/24訪問

iptables -t filter -A INPUT -s 192.168.1.0/24 -d 192.168.1.190  -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.1.190 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

127.0.0.1的icmp只對自己放行(爲了更加可靠,-i 制定interface爲迴環口)

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT

本機可以ping通外面

iptables -A OUTPUT -s 192.168.1.190 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.1.190 -p icmp --icmp-type 0 -j ACCEPT

生成環境中httpd訪問量肯定比ssh多,所以放在第一個

iptables -I INPUT -d 192.168.1.190 -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -s 192.168.1.190 -p tcp --sport 80 -j ACCEPT
iptables -L -n -v

DNS爲本地客戶端解析(有可能會轉發)還有tcp,所有需要8條規則

iptables -A INPUT -d 192.168.1.190 -p udp --dport 53 -j ACCEPT
客戶機請求進來
iptables -A OUTPUT -s 192.168.1.190 -p udp --sport 53 -j ACCEPT
服務端解析返回
iptables -A OUTPUT -s 192.168.1.190 -p udp --dport 53 -j ACCEPT
服務端遞歸找根
iptables -A INPUT -d 192.168.1.190 -p udp --sport 53 -j ACCEPT
根返回結果給DNS服務器


實戰練習之顯式規則

-m state 狀態追蹤

NEW 新連接請求

ESTABLISHED 已建立的連接

NVALID 非法連接請求

RELATED 相關聯的(ftp命令連接中的命令激活的另一個連接)

放行sshd出去一定是對進來包的響應。

iptables -A INPUT -d 192.168.1.190 -p tcp --dport 22 -m state NEW,ESTABLISHED -j ACCEPT
(此時ip_conntrack會自動加載)
iptables -A OUTPUT -s 192.168.1.190 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
(此時22號端口出去的必須是響應報文)

放行別人ping自己,並且自己只允許迴應的包是響應的包。

iptables -A INPUT -d 192.198.1.190 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.190 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

ip_conntrack追蹤可以優化OUTPUT鏈,以後只限定INPUT,OUT使用一條即可,可以提高規則檢測效率

iptables -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED -j ACCEPT

FTP放行(狀態追蹤)

修改配置文件 /etc/sysconfig/iptables-config

IPTABLES_MODULES = "ip_nat-ftp ip_conntrack_ftp"指明加載模塊

ip_nat-ftp ip_conntrack_ftp

iptables -A INPUT -d 192.168.1.190 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
命令連接
iptables -A INPUT -d 192.168.1.190 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
命令連接中的命令關聯
iptables -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED,RELATED -j ACCEPT
數據連接出口

條目優化

(SHH、HTTP等服務多數都是ESTABLISHED,只有FTP多數是ESTABLISH、RELATED,爲了優化INPUT鏈匹配性能可以如下)

iptables -I INPUT -d 192.168.1.190 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

FTP SSH HTTP 範例如下:

(FTP注意修改配置文件修改配置文件 /etc/sysconfig/iptables-config IPTABLES_MODULES = "ip_nat-ftp ip_conntrack_ftp"指明加載模塊)

-A INPUT -d 192.168.1.190 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d 192.168.1.190 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
-A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED -j ACCEPT

multiport 離散的多端口匹配擴展

--source-ports

--destination-ports

--ports

iptables -I INPUT 2 -d 192.168.1.190 -p tcp -m multiport --destination-ports 21,22,80  -m state --state NEW -j ACCEPT

iprange 範圍地址[支持取反]

[!] --src-range

[!] --dst-range

iptables -A INPUT -p tcp -d 192.168.1.190 -p tcp -m iprange --src-range 192.168.1.200-192.168.1.250 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

connlimit 連接數限制

[!] --conlimit-above num同一個IP地址併發最大請求數(當默認策略爲DROP的時候需要配合取反使用)

iptables -A INPUT -d 192.168.1.190 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
某個IP的併發連接低於2個就允許
iptables -A INPUT -d 192.168.1.190 -p tcp --dport 80 -m connlimit  --connlimit-above 2 -j  DROP
等同上面含義(當默認策略爲DROP時候推薦上面那種用法)

limit

--limitRATE 時間速率限定(但第一次請求併發量滿了,時間速率就會生效)

--limit-burst 第一批請求到達響應數量 (如果不寫,默認爲5)

iptables -A INPUT -d 192.168.1.190 -p icmp -icmp-type 8 -m limit --limit 6/minute -j ACCEPT
第一批併發請求響應數量爲5個,
iptables -R OUTPUT 1 -s 192.168.1.190 -m state --state RELATED,ESTABLISHED -j ACCEPT
修改是因爲之前是tcp協議

string字符串過濾

--algo {bm|kmp}

--string "STRING"

iptables  -I INPUT -d 192.168.1.190 -m string --algo kmp --string "sex" -j REJECTURI
中包含sex的字符被拒絕
iptables  -I OUTPUT -s 192.168.1.190 -m string --algo kmp --string "sex" -j REJECT
頁面內容中有sex的字符不給予迴應iptabls

-N自定義鏈

被引用鏈不能使用X刪除,鏈中有規則也不能使用X直接刪除,只有空鏈可以使用X刪除

iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 192.168.1.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn  -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 192.168.1.190 -j RETURN
iptables -I INPUT -j clean_in      引用自定義鏈

利用 recent模塊抵禦DOS***

ssh遠程連接(可以引用鏈clean_in之後)

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
單個IP 併發請求數  不是必須加的
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP



SNAT

--to-source MASQUERADE 動態捕獲外網地址

內部維護着NAT會話池,記錄那些經過SNAT的報文,到報文回到NAT服務上,源地址是公網客戶端請求地址,目標地址是內網客戶端

所以說SNAT在數據包回來的時候也會根據NAT會話池做DNAT轉換,把目標地址轉換爲發起請求道公網的那臺客戶端的IP地址

而TCP報文的序列號確保了DNAT過程中內網客戶端的唯一性(NAT會話表),DNAT是自動進行的。

而轉換是在出口網卡時候進行,所以當然是postrouting,或者OUTPUT而不是prerouting

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 220.1.1.1
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 SNAT --to-source 220.1.1.1
只有從ppp0流出的才做NAT會話記錄

當服務器收到來自於192.168.1.0網段的用戶的請求報文,都做源地址轉換並轉換爲220.1.1.1並發出去,但是又想拒絕內網向外網發出的ping包

iptables -A FORWARD -s 192.168.1.0/24 -p icmp -j REJECT


把FORWARD默認策略修改爲DROP之後如何放行httpd請求,還有ping協議,如果是FTP請確保啓動ip_nat-ftp模塊並且把第一條改爲ESTABLISH,RELATED

iptables -P FORWARD DROP
iptables -A FORWARD -m -state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -AFORWARD -s 192.168.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
迴應的包會被第一條ESTABLISHED匹配到,所以沒有必要添加type 0
iptables -AFORWARD -s 192.168.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT



DNAT

因爲外網的請求到達服務器公網網卡,所以必須立刻轉換目標IP才能通過路由機制通過另一塊內網網卡轉送至內網服務器上

所以把內網的服務器發佈出去,應該prerouting,否則因爲目標地址是本機就會自己送到本機內部。

並且內網服務器網管必須指向NAT服務器內網網卡,如果直接回應給他源地址就不是NAT服務器公網地址了,外網用戶發現不是同一條連接,沒辦法處理。

內網服務器響應報文目標IP應該外網請求用戶的IP,當迴應報文到達NAT服務器內網網卡時候會自動進行SNAT轉換,把源IP從內網服務器變爲NAT服務器的公網IP地址,然後送至客戶端。

可見不僅SNAT用到了DNAT,DNAT的過程也用到了SNAT(這個過程是自動的)

iptables -t nat -A PREROUTING -d 192.168.1.190 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20 [-p tcp --dport80]
前者是公網IP地址,後者是內網WEB服務器

DNAT做FTP的時候,由於FTP服務器的端口是變化的,所以無法提前預測, 以上只要請求80端口的時候才轉發,因此DNAT要寫清楚。


PNAT

另外也可以映射到內網不同的端口,比如80映射到內部的8080,如下:

iptables -t nat -A PREROUTING -d 192.168.1.190 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20:8080

string過濾(網關)

-iptables -A FORWARD -m string --alog kmp --string "h7n9" -j DROP



iptables七層過濾

在Linux的防火牆體系Netfilter下有一個獨立的模塊L7 filter 。從字面上看Netfilter是對網絡數據的過濾,L7 filter是基於數據流應用層內容的過濾。不過實際上 L7 filter的本職工作不是對數據流進行過濾而是對數據流進行分類。它使用模式匹配算法把進入設備的數據包應用層內容與事先定義好的協議規則進行比對,如果匹配成功就說明這個數據包屬於某種協議。

L7 filter是基於數據流工作的,建立在Netfilter connstrack功能之上。因爲一個數據流或者說一個連接的所有數據都是屬於同一個應用的,所以L7 filter沒有必要對所以的數據包進行模式匹配,而只匹配一個流的前面幾個數據包 (比如10個數據包)。當一個流的前面幾個數據包包含了某種應用層協議的特徵碼時 (比如QQ),則這個數據流被L7 filter識別;當前面幾個數據包的內容沒有包含某種應用層協議的特徵碼時,則L7 filter放棄繼續做模式匹配,這個數據流也就沒有辦法被識別,L7 filter所支持的協議如下圖所:

1、給內核打補丁,並重新編譯內核

# 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
# vim /etc/grub.confg
    default=0
#chkconfig iptables off
#shutdown -r now

2、給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
# make install
# vim ~/iptables                修改路徑 前面加上/usr
    if [ ! -x /usr/sbin/$IPTABLES ]; then
    echo -n $"/usr/sbin/$IPTABLES does not exist."; warning; echo
# mv ~/iptables  /etc/rc.d/init.d/  添加服務腳本
# chkconfig --add iptables      開機啓動
# service iptables start
# cp iptables-config  /etc/sysconfig/   還原之前設置

3、安裝l7proto

# tar zxvf l7-protocols-2009-05-28.tar.gz   應用層協議的特徵碼
# cd l7-protocols-2009-05-28
# make install
# /etc/l7-protocols/protocols           此目錄中文件代表所支持的協議

4、利用l7-protocols提供的協議的特徵碼過濾qq、xunlei等應用……

防火牆

192.168.1.190 內部地址

220.1.1.10 外部地址

iptables -A nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 220.1.1.10
    內部用戶通過SNAT上網
iptables -A FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP
    過濾應用層qq協議轉發包
iptables -A FORWARD -s 192.168.1.0/24 -m layer7 --l7proto xunlei -j DROP
    過濾應用層xunlei協議轉發包

控制上網時間

-m time

--datestart --datestop

--timestart --timestop

iptables -A FORWARD -s 192.168.1.10/24-m time--timestart 08:10:00--timestop 12:00:00 -j DROP
iptables -A FORWARD -s 192.168.1.10/24-m time--timestart 14:30:00--timestop 18:20:00 -j DROP

總結:雖然L7 filter不是對所有的數據包進行模式匹配,只匹配一個流的前面幾個數據包 ,但檢測的層次越深性能必然會下降,如果想把這種功能獨立出去,可以使用Panabit。


Panabit

Panabit 應用層流量分析及控制系統。Panabit 流控是一款真正意義上的應用層級流控產品,基於連接過程和協議特徵識別,對於加密協議採用主動探測引擎,經過一套完整的識別流程,準確識別應用,精確定位具體的軟件客戶端,把寬帶網絡的應用可視化和可管理提高到一個新的階段。Panabit 流控系統能幫助寬帶運營網絡管理人員實時瞭解網絡應用流量狀態及應用概況,通過策略進行靈活可控的流量管理,提升網絡運行效率。

其次有專門的團隊跟蹤研究互聯網應用變化,採用抓包的方法不斷收集分析協議樣本,利用自主開發、描述能力強的“協議特徵描述語言”—PSDL(Protocol Signature Description Language),維護協議特徵庫,快速提供給用戶升級。Panabit流控系統,正常 3 個月升級一次版本,1 個月升級一次協議特徵庫。升級了特徵庫,將有更多的協議被識別,降低未知流量的比例。

Panabit 流控系統,支持透明網橋、旁路監聽兩種工作模式。透明網橋模式同時具備流量分析及控制功能;旁路監聽模式僅具備流量分析功能。如設備具備多個網絡接口,也可同時啓用網橋和旁路監聽,此種模式在實際環境中應用場景不多,不做詳細介紹。以下是最普遍的透明網橋模式的部署拓撲及說明,以一路網橋(一進一出)爲例:

113857246.png


注:Panabit 透明地串接在覈心交換機與路由器之間,內網口接核心交換機,外網口接路由器;網橋上無需配置 IP 地址,僅相當於一條網線,無需改變原有拓撲和網絡設置;內外網線全部連通後,0.5 配置界面圖中的數據接口狀態將顯示爲“正常”,此時網絡恢復暢通。將管理口連接到核心交換機,從內網可以訪問到管理地址,至此 Panabit 流控系統的上線工作完成。

配置過程請參考

http://www.panabit.com/free2/panabit_v1006_manual.pdf

114222776.png

114242721.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章