本文將以實例分析的方式簡單介紹iptables實現防火牆,源/目的地址轉換,iptables拓展模塊,以及經過從新編譯內核憑藉l7-filter模塊過濾QQ、迅雷等應用程序通訊等內容。node
iptables是linux中的一款強大的防火牆工具,它經過設置定義規則來實現控制網頁通訊的做用。由其訪問控制的實現,主要是依靠filter表、nat表和mangle表配合五條netfilter鏈的協同做用,下面簡單介紹一下他們做用以及對應關係:linux
filter用於通常的ip數據包過濾,包含input鏈、output鏈和forward鏈;web
nat表的做用轉發ip數據包,包含prerouting鏈、postrouting鏈和output鏈。正則表達式
forward:經過防火牆轉發數據;vim
input:外部訪問本機應用程序;服務器
output:本機應用程序向外部發起的訪問;網絡
prerouting:定義數據包在進入防火牆且在控制規則生效以前;ssh
postrouting:定義數據包進入防火牆在向外轉發以前。tcp
因爲iptables自己帶有強大的說明文檔,命令的具體使用細節這幾就不在贅述,只對幾個經常使用的命令進行介紹:ide
- iptables -t {filter|nat} -L -n
- #查看當前{filter|nat}表
- iptables -t {filter|nat}t -L -n
- #查看當前{filter|nat}表;若後跟--line-number能夠查看行號
- iptables -t {filter|nat} -F
- #清空全部{filter|nat}表規則
- iptables -t {filter|nat} -D num
- #刪除{filter|nat}表中的第num條規則
- iptables -P {INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUING} {DROP|REJECT|ACCEPT}
- #設置5種鏈的的3中策略
- service iptables save
- #保存當前iptables,保存路徑爲/etc/sysconfig/iptables
1、訪問控制簡單實例分析
首先開啓防火牆的路由功能
方法1:
- echo 1 > /pro/sys/net/ipv4/ip_forward
- #此法重啓後失效
方法2:
- vim /etc/sysctl
- net.ipv4.ip_forward = 1
- #將此項值設置成1
- service network restart
- #此法永久生效
實例1:容許192.168.0.0/24訪問防火牆的SSH服務
- iptables -t filter -A INPUT -s 192.168.0.0/24 -d 192.168.0.71 -p tcp --dport 22 -j ACCEPT
- #filter表,INPUT鏈,從192.168.0.0/24網段,到192.168.0.71主機,基於tcp協議,目標端口22,採起動做ACCEPT
- iptables -t filter -A OUTPUT -s 192.168.0.71 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
- #filter表,OUTPUT鏈,從192.168.0.70主機,到192.168.0.0/24網段,基於tcp協議,源端口22,採起動做ACCEPT
- iptables -P INPUT DROP
- #設置INPUT策略:DROP
- iptables -P OUTPUT DROP
- #設置OUTPUT策略:DROP
實例2:容許狀態是new和established的訪問web服務
- iptables -R INPUT 2 -s 192.168.0.0/24 -d 192.168.0.70 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
- #此時改寫鏈使用-R(replace)設置狀態爲established的響應請求所有放行
- intables -R OUTPUT 1 -p tcp -m state --state ESTABLISHED -j ACCEPT
- #響應狀態 -s源地址 -d目的地址 不作限定(即只要是established狀態的包output一概放行)
實例3:拒絕全部192.168.0.0/16網段client來訪問DNS解析服務的用戶
- iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dprot 53 -j DROP
- #filter表,INPUT鏈,來自172.160.0.0/16網段,使用UDP協議,目標端口號53,採起動做 DROP
實例4:讓內網用戶能夠相互發郵件
- iptables -A PREROUTING –p tcp --dport 110 –j ACCEPT
- iptebles -A PREROUTING –p tcp --dport 25 –j ACCEPT
- iptables -A FORWARD –p tcp --dport 110 –j ACCEPT
- iptables -A FORWARD –p tcp --sport 110 –j ACCEPT
- iptables -A FORWARD –p tcp --dport 25 –j ACCEPT
- iptables -A FORWARD –p tcp --sport 25 –j ACCEPT
- #郵件接收使用TCP110接口;郵件發送使用TCP25,放行數據轉發。
2、iptables實現源地址轉換以及目的地址轉換
源地址轉換:
做用:實現多個內網主機共同使用一個公網IP地址與公網通訊。
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 123.1.1.123
- #將192.168.0.0/24網段的地址做爲源地址轉換成123.1.1.123
地址假裝源地址轉換:
做用:使用ADSL撥號上網用戶的IP都是由ISP隨即分配,因此上述固定外網IP的狀況就不在適用了,使用地址假裝可以自動匹配外網ip並實現源地址轉換。
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
- #將192.168.0.0/24 網段的全部地址做爲源地址轉換成公網地址
目的地址轉換:
做用:實現公網用戶經過公網地址,訪問內網服務器。
- iptables -t nat -A PREROUTING -d 123.1.1.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.72
- #將外網的web訪問請求(80端口)經過DNAT轉發至內網web服務器192.168.0.72
- iptables -t nat -A PREROUTING -d 123.1.1.123 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.73
- #將外網的ssh訪問請求(22端口)經過DNAT轉發至內網ssh服務器192.168.0.73
- iptables -t nat -A PREROUTING -d 123.1.1.123 -p udp --dport 53 -j DNAT --to-destination 192.168.0.74
- #將外網的DNS解析請求(53端口)經過DNAT轉發至內網DNS服務器192.168.0.74
- iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
- #轉發全部狀態爲ESTABLISHED的數據包
3、經常使用模塊擴展
iprange:地址範圍匹配
- iptables -A FORWARD -m iprange --src-range 162.168.0.1-192.168.0.100 --dst-range 172.16.0.1-172.16.0.100 -j ACCEPT
- #限制源地址與目的地址的區間
multipoint:多端口匹配
- iptables -A FORWARD -p tcp -m multipoint --destination-ports 22,25,80,110 -m state --state NEW,ESTABLISHED -j ACCEPT
- #凡是目的端口匹配,狀態匹配的就容許傳輸
string:傳輸內容中字符串匹配
- iptableis -A FORWARD -m string --string "xxxx.com" --algo bm -j REJECT
- #屏蔽含有xxxx.com的內容
傳輸日誌功能啓用:日誌的向磁盤的寫入會大大消耗系統資源,建議生產環境中關閉此功能。
- iptables -A INPUT -d 192.168.0.1 -p tcp --dport 22 -j LOG --log-prefix "SSH LOG:"
- #開啓日誌功能,並在每條日誌前加上關機字符串
- iptables -A INPUT -d 192.168.0.1 -p tcp --dport 22 -m limit 6/minute -j LOG --log-prefix "SSH LOG:"
- #限制寫入日誌的頻率每分鐘6個
4、使用l7-filter模塊控制特定的應用程序訪問網絡
下面的內容旨在經過編譯內核加入l7-filter模塊,從而使iptables按照應用程序的特徵來實現控制功能。
1.解壓內核並建立軟鏈接
- tar xvf linux-2.6.28.10.tar.gz -C /usr/src
- cd /usr/src
- ln -vs linux-2.6.28.10 linux
- cd linux
2.給內核打入netfilter補丁
- tar xvf netfilter-layer7-v2.22.tar.gz -C /usr/src
- cd /usr/src/linux
- patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
3.配置內核編譯選項
若您不清楚內核的基本配置選擇策略,建議複製當前系統配置文件,並以此爲藍本完成本次內核編譯。
- cp /boot/config-您當前內核版本 /usr/src/linux/.config
【Networking support】 → 【Networking Options】 → 【Network packet filtering framework】 →【Code 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
編譯安裝完成後,重啓在grub界面會出現新內核Title,選擇並進入新內核系統。
4.備份iptables的配置文件和服務腳本
- cp /etc/init.d/iptables ~/
- cp /etc/sysconfig/iptables-config ~/
- #所有備份到root目錄方便查找
5.卸載原有的iptables軟件包
- rpm -e --nodeps iptables-ipv6 iptables iptstate
- #忽略關聯形式卸載原iptables
6.安裝新的iptables
- tar xvf iptables-1.4.6.tar.gz -C /usr/src
- #解壓iptables文件到指定目錄
- cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/* /usr/src/iptables-1.4.6/extensions/
- #將以前解壓的netfilter中的兩個文件複製到對應iptables的目錄中去
- cd /usr/src/iptables-1.4.6
- ./configure --prefix=/usr --with-ksource=/usr/src/linux
- #編譯iptables
- make
- make install
7.安裝l7-protocol
它用於定義iptables能夠識別哪些應用程序的特徵
- tar xvf l7-protocols.tar.gz
- cd l7-protocols
- make install
- #解壓並安裝
/etc/l7-protocols/protocols定義了全部可以限制的應用程序
8.將備份的服務控制腳本複製回去
- cp /root/iptables /etc/init.d/
- vim /etc/init.d/iptables
- :%s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g
- #全局正則表達式查找替換將原路徑換成新路徑
9.複製iptables的配置文件
- cp /root/iptables-config /etc/sysconfig/
重啓服務
- service iptables restart
添加控制
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto qq -j REJECT
- #禁止內網用戶使用qq通訊
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto edonkey -j REJECT
- #禁止內網用戶使用電驢
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto bittorrent -j REJECT
- #禁止內網用戶使用bt
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto xunlei -j REJECT
- #禁止內網用戶使用迅雷
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto msnmessenger -j REJECT
- #禁止內網用戶使用MSN
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto pplive -j REJECT
- #禁止內網用戶使用pplive
保存iptables
關於iptables的配置和使用就先寫到這裏,以上內容在您實現過程當中出現的任何問題,歡迎在此交流; 並請各位高手前輩大神達人予以批評指正,謝謝!
service iptables save