Iptables

#####################################node

基礎原理linux

實戰練習之隱式規則算法

實戰練習之顯式規則vim

SNATbash

DNAT服務器

iptables七層過濾網絡

Panabit併發

#####################################ssh

基礎原理
tcp

防火牆的定義

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


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所支持的協議以下圖所:

一、給內核打補丁,並從新編譯內核

# 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

二、給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/   還原以前設置

三、安裝l7proto

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

四、利用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

相關文章
相關標籤/搜索