#####################################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
優先級次序爲
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的本職工做不是對數據流進行過濾而是對數據流進行分類。它使用模式匹配算法把進入設備的數據包應用層內容與事先定義好的協議規則進行比對,若是匹配成功就說明這個數據包屬於某種協議。
一、給內核打補丁,並從新編譯內核
# 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 流控系統,支持透明網橋、旁路監聽兩種工做模式。透明網橋模式同時具有流量分析及控制功能;旁路監聽模式僅具有流量分析功能。如設備具有多個網絡接口,也可同時啓用網橋和旁路監聽,此種模式在實際環境中應用場景很少,不作詳細介紹。如下是最廣泛的透明網橋模式的部署拓撲及說明,以一路網橋(一進一出)爲例:
注:Panabit 透明地串接在覈心交換機與路由器之間,內網口接核心交換機,外網口接路由器;網橋上無需配置 IP 地址,僅至關於一條網線,無需改變原有拓撲和網絡設置;內外網線所有連通後,0.5 配置界面圖中的數據接口狀態將顯示爲「正常」,此時網絡恢復暢通。將管理口鏈接到核心交換機,從內網能夠訪問到管理地址,至此 Panabit 流控系統的上線工做完成。
配置過程請參考