網際網路的公開,我們面臨很多便利,同時也面臨許多安全問題,資料加密,安全通路控制,等等,我們最常見的就是在網絡的進出口進行通路的控制,這時防火牆就出現了,常見的防火牆分為硬體防火牆和軟體防火牆,硬體防火牆在進行資料處理上會較快,控制比較嚴格,但價格都不菲,現在很多中小型企業都會采用軟體防火牆。下面我們就深入介紹linux下iptables的設定。
原理簡介:防火牆工作在網絡邊緣或者主機邊緣,防火牆為了實作通路控制,會包括很多政策(policy),數條規則(rules)就組成了政策,常見的防火牆根據工作的層次不同可以分為工作在三層的網絡層防火牆和七層的代理伺服器(應用型網關),網絡層防火牆根據資料包首部的ip位址或端口進行規則比對,七層防火牆根據資料包的應用協定進行規則比對和處理,安全性更高但效率較低,為了防止防火牆成為瓶頸,我們常會采用分布式防火牆,負載均衡的防火牆,或防火牆關聯系統。
linux下的防火牆:iptables,早期叫ipfirewall,能夠實作對資料包進行檢查并進行過濾的軟體,而tcp/ip協定棧是放在核心(kernel)中,是以要想規則生效,就必須把這些規則放進核心中;當兩個網絡進行通信時,由于網卡的驅動程式都放在核心中,主機會檢查路由表,直接将資料包進行轉發,而我們的防火牆規則則是在使用者空間中,無法對資料進行控制,這是早期ipfirewall遇到的問題。當發展到2.0版本時就變成ipchains,發展到現在就演變成iptables,他們都是工作在使用者空間定義的規則。工作在核心空間的結合iptables的規則叫做netfilter。
1)防火牆的三表五鍊:三表分别是filter,nat,mangle,五鍊分别PREROUTING,INPUT,FORWRAD,OUTPUT,POSTROUTING。
- filter:允許/不允許
- INPUT,FORWARD,OUTPUT
- nat:位址修改
- PREROUTING,OUTPUT,POSTROUTING
- mangle:修改封包資料
- PREROUTING,INPUT,FORWRAD,OUTPUT,POSTROUTING
防火牆政策:通則全通,堵則單堵,自上而下比對規則
2)iptables的規則:
iptables [-t table] COMMAND chain CRETIRIA -j ACTION
COMMAND
鍊管理指令:
- -P 設定預設政策(門是否開)
- # iptables -P INPUT {DROP|ACCECT} 立即生效
- -F 清空規則鍊
- # iptables -t nat -F PREROUTING(表類型必須指定,鍊類型也要指定)
- -N 使用者自定義的新鍊 必須和系統鍊關聯才能生效
- # iptables -N inbound_tcp_web
- -X 删除鍊,之前必須清空鍊
- -E 給自定義的name改名
- -Z 清空鍊預設規則及其他規則的計數器
規則管理指令:
- -A 在鍊的最後追加
- -I num 3 插傳入連結中第幾條
- -R 修改(替換)規則
- # iptables -R -s 172.16.0.0/16 -p udp --dport
- # iptables -R 3 替換第幾行
- -D num 删除第幾行
檢視指令:
- -L
- -n 以數字方式顯示
- -v 顯示詳細資訊 -vv更詳細的 -vvv更詳細的
- -x 檢視計數器的精确值(預設當增加時會換算機關)
- --line-numbers 顯示行号
比對标準:
通用比對:
- -s,--src,--source 源位址比對(必須指定ip/netmask)
- IP,NETWORK/NETMASK,0.0.0.0/0.0.0.0
- -d 目标位址
- -p 協定比對(tcp|udp|icmp)
- -i 資料的流入接口
- -i eth0
- -o 資料流出接口
- -o eth0
- 用在OUTPUT,POSTROUTING,使用的範圍不同
擴充比對:
隐含擴充(指定某種特定端口,協定的擴充)
- -p tcp
- --dport 不能指定間隔端口,隻能21-23
- --sport
- --tcp-flags 參數兩個:檢查的标志位,必須為1的标志位
- SYN,ACK,FIN,PSH,RST,URG tcp的标志位
- 例:--tcp-flags SYN,ACK,FIN,RST syn 相當于--syn 第一次連接配接的資料包
- (比對syn為1,其他為零的資料包)
- -p udp
- --dport 不能指定間隔端口,隻能21-23
- --sport
- -p icmp
- --icmp-type
- echo-request 8 請求回顯
- echo-reply 0 響應
顯式擴充
-m 指定子產品
-p tcp -m multiport --dports 21,23,80 比對多個端口
- l7-filter (應用層子產品)
- connlimit 限制某個服務對于每個ip每次最多發起的最大連接配接數
- --connlimit-above 5 大于5個 拒絕
- !--connlimit-above 5 小于5的 接受
- 例: #iptables -p tcp --syn --dport 23 -m !--connlimit-above 2 -j ACCEPT
iprange
- --src-range
- --dst-range
- 例:#iptables -A FORWARD -m iprange --src-range 172.16.0.1-172.16.0.100 -dst-range 172.16.0.1-172.16.0.2 -p tcp --dport 80 -j ACCEPT
- --limit rate 3/minutes 限制比對資料包的頻率
- --limit-burst number 限制峰值
mac
- --mac-source 比對mac的源位址,和防火牆在同一網段的主機的mac位址
- --source-ports 源端口
- --destination-ports 目标端口 最多一次指定15個端口
- --ports
- --algo 字元串比對算法 bm|kmp
- --from offset
- --to
- --string
- 例:
- #iptables -A FORWARD -m string --string "qq" --algo bm -j REJECT
time
- --timestart HH:MM
- --timestop HH:MM
- --days 周幾
- --datestart YYYY:MM:DD:hh:mm
- --datestop
LOG
- --log-prefix
- 例:
- #iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -j LOG --log-prefix "IPTABLES ..."
ACTION:
-j
- DROP 默默的拒絕
- REJECT 悄悄丢棄
- ACCEPT 接受
- custom_chain 轉向自定義的鍊
- SNAT 源位址轉換
- DNAT 目标位址轉換
- MASQUERADE 源位址僞裝
- REDIRECT 端口重定向
- MARK(mangle)标記
- RETURN 傳回重新比對
- LOG 顯示日志
狀态檢測:防止其他木馬的僞裝(基于tcp)
- NEW 第一次連接配接(SYN為1,其他位為0)
- ESTABLISHED 已經建立的連接配接(ACK為1,其他位為0)
- INVALID 不合法的連接配接(ACK和RST均為1)
- RELATED 相關聯的連接配接(一般是用于ftp)
- 例:#iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.100 -p tcp --dport 22 -m state --state NEW,ESTABLSHED -j ACCEPT
- 放行所有的已建立連接配接的服務出去
- #iptables -A OUTPUT -s 192.168.0.100 -m state --state ESTABLSHED -j ACCEPT
3)iptables的相關配置檔案:
規則的配置檔案:/etc/sysconfig/iptables
- #service iptables save
- #iptables-save > /etc/sysconfig/iptables.2 儲存檔案
- #iptables-restore < /etc/sysconfig/iptables.2 手動生效
4)iptables相關規則的書寫:
允許ssh連入,
- #iptables -t filter -A INOUT -s 192.168.0.0/24 -d 192.168.0.100 -p tcp --dport 22 -j ACCECT
- #iptables -t filter -A INOUT -s 192.168.0.100 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCECT
允許192.168.0.0/24網段ping本主機及本主機ping本主機
- #ipables -R INPUT 2 -s 192.168.0.0/24 -d 192.168.0.100 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- #iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
- #iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
允許172.16.0.0/16網段連接配接192.168.0.100的httpd,samba,sshd服務,但拒絕172.16.0.100:
- #iptables -A INPUT -s 172.16.0.100 -d 192.168.0.100 -m multiport --destination-ports 22,80,139,445,137,139 -j DROP
- #iptables -A INPUT -s 172.16.0.0/16 -d 192.168.0.100 -p tcp -m multiport --destination-ports 22,80,139,445 -m state --state NEW,ESTABLSHED -j ACCEPT
- #iptables -A INPUT -s 172.16.0.0/16 -d 192.168.0.100 -p udp -m multiport --destination-ports 137,138 -m state --state NEW -j ACCEPT
- #iptables -A OUTPUT -m state --state ESTABLSHED -j ACCEPT
- #iptables -P INPUT DROP
- #iptables -P OUTPUT DROP
允許外網172.16.0.100通路内網192.168.10.0/24
- #iptables -A FORWARD -s 172.16.0.0/16 -p icmp --icmp-type 8 ACCEPT
- #iptables -A FORWARD -d 172.16.0.0/16 -p icmp --icmp-type 0 ACCEPT
限制dns:
#iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
源位址轉換:SNAT
- #iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 172.16.100.1
目标位址轉換:DNAT
- #iptables -t nat -A PREROUTING -d 192.168.0.15 -j DNAT --to-destination 172.16.0.50
- 位址僞裝 :MASQUERADE(當通路的外網位址是動态時使用位址僞裝)
- #iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
#########################################################################
5)編譯 l7-filter,擴充iptables,現在由clearfoundation組織接收進行開發
對核心打更新檔
- # tar zxvf linux-2.6.28.10.tar.gz -C /usr/src
- # tar zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src
- # ln –s /usr/src/linux-2.6.28.10/ /usr/src/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> NETMA target support
- <M> REDIRECT target support
注:這裡的其他選項可以根據自己的需要安裝相應的子產品
開始編譯核心
- #make
- #make modules_install
- #make install
- #reboot《-------這裡必須要重新開機并選用編譯的核心
配置iptables:
- # cp /etc/init.d/iptables ~/iptables
- # cp /etc/init.d/iptables-config ~/
- # rpm -e iptables-ipv6 iptables iptstate --nodeps《----解除安裝原來的iptables
- # 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
編譯l7-filter:
- # tar zxvf l7-protocols-2009-05-28.tar.gz
- # cd l7-protocols-2009-05-28
- # make install
- # vim ~/iptables
- 把文中/sbin/$IPTABLES 都改為/usr/sbin/$IPTABLES
- # mv ~/iptables /etc/rc.d/init.d/
- # cp ~/iptables-config /etc/sysconfig/
- # service iptables start
- # hash -r
這裡您就可以使用l7的擴充功能了,可以基于各種應用層協定進行控制。
- 控制192.168.0.0/24網段的主機不能通路qq:
- #iptables -t filter -A FORWARD -s 192.168.0.0/24 -m layer7 --l7proto qq -j REJECT