|
Linux包過濾防火墻 1,什么是包過濾防火墻 2,包過濾的工作層 工作在網(wǎng)絡(luò)層 3,工作原理 數(shù)據(jù)包過濾通過對數(shù)據(jù)包的IP頭和TCP或UDP頭的檢查來實(shí)現(xiàn)的主要有: IP源地址 IP目標(biāo)地址 協(xié)議(tcp包,udp包,和icmp包) tcp或udp的源端口 imcp消息類型 tcp包頭中的ack位 數(shù)據(jù)包到達(dá)的端口 數(shù)據(jù)包出去的端口 包過濾技術(shù)的優(yōu)缺點(diǎn) 使用iptables實(shí)現(xiàn)包過濾 相關(guān)的TCP/IP支持 假如A要和B通信 1,(SYN) B要和A通信時(shí),B首先向A發(fā)一個(gè)SYN標(biāo)記的包,告訴 A請求建立連接 2,(SYN/ACK) A收到后回發(fā)送一對SYN包的確認(rèn)包(SYN/ACK)回去,表示對第一個(gè)SYN包的確認(rèn),并繼續(xù)握手操作 3,(ACK) B收到SYN/ACK包后,B發(fā)一個(gè)確認(rèn)包ACK,通知 A連接已建立。三次握手完成,一個(gè)TCP連接完成 TCP連接的每個(gè)包都會(huì)設(shè)置ACK位,這就是連接跟蹤的重要意義,放火墻將無法判斷收到的ACK屬于一個(gè)已經(jīng)建立的連接 結(jié)束TCP連接 iptables語法 一條iptables規(guī)則基本上因該包含5個(gè)要素 指定表 table 分別是 filter,nat和mangle 指定操作命令 command 包括添加,刪除,更新 指定鏈 chains 對于包過濾防火墻可操作filter表中的INPUT鏈,OUTPUT鏈和 FORWARD鏈 指定規(guī)則匹配器 mather 可以指定各種規(guī)則匹配,如IP地址,端口,包類型 指定目標(biāo)動(dòng)作 target 當(dāng)規(guī)則匹配一個(gè)包時(shí),真正要執(zhí)行的任務(wù)用目標(biāo)標(biāo)識(shí)。最常目標(biāo) 為ACCEPT,DROP,REJECT表示拒絕,丟棄包的同時(shí)給發(fā)送沒有接 受的通知,LOG表示包的有關(guān)信息被記錄日志,TOS表示改寫包的TOS值 語法: iptables [-t table] CMD [chain] [rule-matcher] [-j target] table為表名,CMD為操作命令,chain為鏈名,rule-matcher為規(guī)則匹配器,target為目標(biāo)動(dòng)作 iptables的常用操作命令 -A 或 --append 在所有的鏈的結(jié)尾加入一條或多條規(guī)則 -D 或 --delete 在所有的鏈刪除 -R 或 --replace 替換一條匹配的規(guī)則 -I 或 --insert 以給出的規(guī)則號(hào)在所選鏈中插入一條或多條規(guī)則。如果規(guī)則號(hào)是1,插入的規(guī)則的鏈的頭部 -L 或 --list 列出指定鏈的所有規(guī)則,如果沒有指定鏈,將列出所有鏈中的所有規(guī)則 -F 或 --flush 清除指定鏈和表中的所有規(guī)則,假如不指定,將全部刪除 -N 或 --new-chain 以給定的名字創(chuàng)建一條新的用戶自定義鏈。不能與已有的鏈同名 -X 或 --delete-chain 刪除指定的用戶定義鏈 -P 或 --policy(n政策,方針) 為永久鏈指定默認(rèn)規(guī)則。用戶定義鏈沒有默認(rèn)規(guī)則。缺剩 規(guī)則也是規(guī)則鏈中的最后一條規(guī)則用-L命令顯示時(shí)它在第一 行顯示 -C 或 --check 檢測給定的包是否與指定鏈的規(guī)則相匹配 -X 或 --zero 將指定鏈中所有規(guī)則的包字節(jié)(byte)計(jì)數(shù)器清零 -h 顯示幫助信息 iptables常用的規(guī)則匹配器 -p,[!]protocol 指出要匹配的協(xié)議,可以是tcp,udp,icmp,all.協(xié)議名前綴"!", 為邏輯非 -s[!]address[/mask] 根據(jù)源地址或地址范圍確定是否允許或拒絕數(shù)據(jù)包通過過濾器 --sport[!]port[:port] 指定匹配規(guī)則的源端口或端口范圍??梢杂枚丝谔?hào) -d[!]address[/mask] 根據(jù)目的地址或地址范圍確定是否允許或拒絕數(shù)據(jù)包通過過濾器 -dport[!]port[:port] 指定匹配規(guī)則的目的端口或端口范圍,可以用端口號(hào),也可以 用/etc/services文件中的名字 --icmp-type[!]typename 指定匹配規(guī)則的ICMP信息類(可以使用iptables -p icmp -h 查看有效的icmp類型名) -i[!]interface name[+] 匹配單獨(dú)的接口或某種類型的接口設(shè)置過濾規(guī)則。此參數(shù)忽略 時(shí),默認(rèn)符合所有接口。接口可以使用否定符"!"來匹配不是指 定接口來包.參數(shù)interfacename是接口名,如eth0,eth1,ppp0 等。指定一個(gè)目前不存在的接口是完全合法的。規(guī)則直到接口時(shí) 才起作用,這種指定對于PPP及該選項(xiàng)只有對INPUT,FROWARD和 PREROUTING鏈?zhǔn)呛戏ǖ?o:p> -o[!]interface name[+] 僅僅匹配設(shè)置了SYN位,清除了ACK,FIN位的TCP包.這些包表示請求初始化的TCP連接。阻止從接口來的這樣的包將會(huì)組織外來的TCP連接請求。但輸出的TCP連接請求將不受影響。這個(gè)參數(shù)僅僅當(dāng)協(xié)議類型設(shè)置為TCP時(shí)才能用 -m --match -m選項(xiàng)引出了iptables的state擴(kuò)展模塊,比如mac擴(kuò)展模塊,它實(shí)現(xiàn)根據(jù)主機(jī)網(wǎng)卡的MAC地址進(jìn)行權(quán)限控制的規(guī)則: iptables -A INPUT -p tcp -m mac --mac-source 01:02:03:04:05:06 -j ACCEPT 擴(kuò)展模塊是iptables體系中的特色,它使得iptables成為一個(gè)可擴(kuò)展的安全體系結(jié)構(gòu)。你可以從這里了解更多關(guān)于iptables擴(kuò)展模塊的知識(shí):http://www./document ... tensions-HOWTO.html [!]-syn 僅僅匹配設(shè)置了SYN位,清除 --state state,state... 狀態(tài)匹配 這里,state是一個(gè)用逗號(hào)分割的列表,表示要匹配的連接狀態(tài)。有效的狀態(tài)選項(xiàng)包括:INVAILD,表示分組對應(yīng)的連接是未知的;ESTABLISHED,表示分組對應(yīng)的連接已經(jīng)進(jìn)行了雙向的分組傳輸,也就是說連接已經(jīng)建立;NEW,表示這個(gè)分組需要發(fā)起一個(gè)連接,或者說,分組對應(yīng)的連接在兩個(gè)方向上都沒有進(jìn)行過分組傳輸;RELATED,表示分組要發(fā)起一個(gè)新的連接,但是這個(gè)連接和一個(gè)現(xiàn)有的連接有關(guān),例如:FTP的數(shù)據(jù)傳輸連接和控制連接之間就是RELATED關(guān)系。 對于本地產(chǎn)生分組,在PREROUTING或者OUTPUT鏈中都可以對連接的狀態(tài)進(jìn)行跟蹤。在進(jìn)行狀態(tài)檢測之前,需要重組分組的分片。這就是為什么在iptables中不再使用ipchains的ip_always_defrag開關(guān)。UDP和TCP連接的狀態(tài)表由/proc/net/ip_conntrack進(jìn)行維護(hù)。稍后我們再介紹它的內(nèi)容。狀態(tài)表能夠保存的最大連接數(shù)保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取決于硬件的物理內(nèi)存。 分組是否匹配狀態(tài)表中的一個(gè)已經(jīng)實(shí)現(xiàn)(ESTABLISHED)的連接。 它是否是和狀態(tài)表中某個(gè)UDP/TCP連接相關(guān)(RELATED)的一個(gè)ICMP分組。 這個(gè)分組是否要發(fā)起一個(gè)新(NEW)的連接。 如果分組和任何連接無關(guān),就被認(rèn)為是無效(INVALID)的。 iptables -A INPUT -i eth0 -m state --state NEW -j DROP //禁止從eth0進(jìn)來的NEW狀態(tài),也就是禁止來自eth0的新的訪問請求 指定永久性規(guī)則 /sbin/iptables-save > /usr/local/iptables_bat 導(dǎo)出 /sbin/iptables-restore < /usr/local/iptables_bat 導(dǎo)入 service iptables save iptalbe命令使用舉例 1,鏈的基本操作 要清除所有的配置 iptables -F iptables -X 清除 iptables -Z 將指定鏈中所有規(guī)則的包字節(jié)計(jì)數(shù)器清零 (2)設(shè)置鏈的默認(rèn)策略.一般地 有兩種方法 首先允許所有的包,然后在禁止有危險(xiǎn)的包通過防火墻。即沒有被決絕的都允許,這種方法對用戶而言比較靈活方便, 但對系統(tǒng)而言,容易引起嚴(yán)重的安全問題 iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT 首先禁止所有的包 iptalbes -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP 列出表/鏈中的所有規(guī)則 包過濾防火墻只使用filter表,它是默認(rèn)表 因此會(huì)顯示filter表中所有規(guī)則 iptables -L iptables -L -n 參數(shù)用于顯示數(shù)字化的地址和端口 向鏈中添加規(guī)則。下面的語句用于開放網(wǎng)絡(luò)接口. iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -i eth1 -j ACCEPT iptables -A OUTPUT -o eht1 -j ACCEPT iptables -A FORWARD -o eth1 -j ACCEPT 本地進(jìn)程不會(huì)經(jīng)過FORWARD鏈,因此lo只有INPUT和OUTPUT兩個(gè)鏈上作用 用戶自定義鏈 iptables -N custom(n習(xí)俗,風(fēng)俗v定值) //新建coustom定義鏈 iptables -A coutom -s 0/0 -p icmp -j DROP //丟棄全部ICMP包 iptables -A INPUT -s 0/0 -d 0/0 -j custom //INPUT鏈中加入一條規(guī)則,使所有的包都由custom子定義鏈處理.結(jié)果全部的ICMP包都被丟棄 包的處理方式: DROP,ACCEPT,REIECT(彈回),LOG iptables -A INPUT -p icmp -j DORP iptables -A INPUT -p tcp -d 219.237.206.200 --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp -s iptables -p INPUT DROP 改變防火墻默認(rèn)策略 iptables -p ACCEPT DROP iptables -p OUTPUT DROP iptables -A INPUT -p tcp -d iptables -A OUTPUT -p tcp -s iptables -A OUTPUT -p udp --dport 53 -j ACCEPT //允許DNS通過 iptables -A INPUT -p udp --sport 53 -j ACCEPT iptables -A INPUT -p ud iptables -A OUTPUT -p udp --sport 53 -j ACCEPT iptables -D INPUT 5 //刪除INPUT 5個(gè)編號(hào) 如果自己是某種客戶機(jī)和服務(wù)器的話,需要在連上加兩個(gè)條件 還需要開通本機(jī)的服務(wù)器 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -d 127.0.0.1 -s 127.0.0.1 -j ACCEPT 可以設(shè)置本機(jī)的包,不能從本機(jī)的22端口自動(dòng)的出去,因?yàn)闆]有驗(yàn)證過 下面表示跟本機(jī)建立過連接的包,才能從22端口出去,防止本機(jī)自從動(dòng)從22端口出去 iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 現(xiàn)在就可以刪除原來的包了 iptables -D OUTPUT 1 下面是不允許本地產(chǎn)生包主動(dòng)從80端口發(fā)送給別人! iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 刪除原來的設(shè)置 上面是作為服務(wù)器有這個(gè)問題,做為客戶機(jī)也會(huì)產(chǎn)生這個(gè)問題 iptables -A INPUT -p tcp --sport 22 -m state --state ESTABALIASHAED -j ACCEPT LOG目標(biāo) iptables-save > /etc/sysconfig/iptalbes 保存 2,設(shè)置基本的規(guī)則匹配 指定協(xié)議匹配 iptables -A INPUT -p tcp // 匹配指定的協(xié)議 iptables -A INPUT -p !tcp // 匹配指定協(xié)議之外的所有協(xié)議 指定地址匹配 iptables -A INPUT -s 192.168.1.11 // 指定匹配的主機(jī) iptables -A INPUT -s 192.168.10.0/24 iptables -A FORWARD -s ! 192.168.0.1 iptables -A FORWARD -s ! 192.168.0.0/24 //指定網(wǎng)絡(luò)之外的網(wǎng)絡(luò) 指定網(wǎng)絡(luò)接口匹配 指定單一的網(wǎng)絡(luò)接口匹配 iptables -A INPUT -i eth0 iptables -A FORWARD -o eth0 指定同類型的網(wǎng)絡(luò)接口匹配 iptables -A FORWARD -o ppp+ 指定單一的端口匹配 iptables -A INPUT -p tcp --sport www iptables -A INPUT -p tcp --sport 80 iptables -A INPUT -p udp --sport 53 iptables -A INPUT -p udp --dport 53 匹配指定端口之外的端口 iptables -A INPUT -p tcp --dport ! 22 匹配指定的端口范圍 iptables -A INPUT -p tcp --sport 22:80 匹配ICMP端口和ICMP類型 iptables -A INPUT -p icmp --icmp-type 8 指定ip碎片 在TCP/IP通信過程中,每一個(gè)網(wǎng)絡(luò)接口都有嚴(yán)格最大傳輸單元(MTU),這個(gè)參數(shù)定義可以通過的數(shù)據(jù)包的最大尺寸。如果一個(gè)數(shù)據(jù)包大于這個(gè)參數(shù)值時(shí),系統(tǒng)會(huì)將其劃分成更小的數(shù)的數(shù)個(gè)數(shù)據(jù)包(成為IP歲片) .................... 設(shè)置擴(kuò)展的規(guī)則匹配 包過濾防火墻配置舉例 包過濾防火墻配置舉例 touch /etc/rc.d/filter-firewall chmod u+x /etc/rc.d/filter-firewall echo "/etc/rc.d/filter-firewall" >> /etc/rc.d/rc.local vi /etc/rc.d/filter-firewall #!/bin/sh echo "String iptables rules..." echo "1" /proc/sys/net/ipv4/ip_forward ipt=/sbin/iptables www-server=192.168.0.100 ftp-server=192.168.0.200 email-server=192.168.0.210 ip_range="198.168.80.0/24" ########################################################################## 刷新所有的鏈的規(guī)則 iptables -F 首先禁止轉(zhuǎn)發(fā)任何包,然后再一步步設(shè)置允許通過的包 所有首先設(shè)置防火墻FORWARD鏈的策略為DROP iptables -P FORWARD DROP 下面設(shè)置關(guān)于服務(wù)器的包過濾規(guī)則 由于服務(wù)器/客戶機(jī)交互是雙向的,所有不僅僅要設(shè)置數(shù)據(jù)包 NAT與代理服務(wù)器 echo "1" > /proc/sys/net/ipv4/ip_forware NAT表也有三個(gè)缺省的鏈 prerouting: 可以在這里面定義進(jìn)行目的nat的規(guī)則,因?yàn)槁酚善鬟M(jìn)行路由時(shí)檢查數(shù)據(jù)包的目的ip地址,所以為了使數(shù)據(jù)包得以正確路由,我們必須在路由之前就進(jìn)行目的nat postrouteing 可以在這里定義進(jìn)行源nat的規(guī)則,系統(tǒng)在決定了數(shù)據(jù)包的路由以后在執(zhí)行該鏈中的規(guī)則。 output: 定義對本地產(chǎn)生的數(shù)據(jù)包的目的的nat規(guī)則 Netfilter的Nat表 prerouting 和 postrouting表 SNAT原地址轉(zhuǎn)換 destination: DNAT目標(biāo)地址轉(zhuǎn)換 iptables -t nat -A POSTROUTING -s 把源的 內(nèi)網(wǎng)翻譯成外網(wǎng)地址 net nat FORWARD PREROUTING ----+--------------#########------+----------- POSTROUTING |(routing) | INPUT OUTPUT 兩個(gè)特殊的轉(zhuǎn)發(fā)點(diǎn) 源地址轉(zhuǎn)換(SNAT) 在POSTROUTING點(diǎn)不能發(fā)生在PREROUTING 和目標(biāo)地址轉(zhuǎn)換(DNAT)只能在PREROUTING iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 219.237.206.200 把源地址翻譯成外網(wǎng)地址 如果需要偽裝或不知道要影射成什么地址,可以偽裝,他支持動(dòng)態(tài)地址 初始化工作 iptables -F iptables -X iptables -t nat -F iptables -t nat -X 添加規(guī)則 iptables -A INPUT -i ! ppp0 -j ACCEPT //棘手接受所有的,來源不是網(wǎng)絡(luò)接口ppp0的數(shù)據(jù) nat配置 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 219.237.206.200 //偽裝局域網(wǎng)機(jī)器的ip地址進(jìn)入互聯(lián)網(wǎng) //把目的ip 219.237.206.200端口為21影射到內(nèi)網(wǎng)192.168.0.1的機(jī)器上 iptables -t nat -A PREROUTING -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80 iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.1 --sport 80 -j SNAT --to-source 219.237.206.200:80 iptables -t nat -A PREROUTING -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80 //把目的 219.237.206.200端口為80(web服務(wù))影射到內(nèi)網(wǎng)192.168.0.1上 iptables -t nat -A POSTROUTING -p tcp --dst 219.237.206.200 --dport 80 -j SNAT --to-source 192.168.0.1 iptables -t nat -A PREROUTING --dst 192.168.0.1 -p tcp --dport 80 -j DNAT --to-destination 219.237.206.200 配置舉例 iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1 iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 21 -j DNAT --to-destination 192.168.0.1 iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 3306 -j DNAT --to-destination 192.168.0.1 iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 80 -j SNAT --to-source 192.168.0.168 iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 21 -j SNAT --to-source 192.168.0.168 iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 3306 -j SNAT --to-source 192.168.0.168 iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 22 -j SNAT --to-source 192.168.0.168 iptables -t nat -A PREROUTING --dst 219.237.206.201 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.1 iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80 iptables -t nat -A POSTROUTING -p tcp --dst 219.237.206.200 --dport 80 -j SNAT --to-source 192.168.0.1 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASAQUERADE iptables -t nat -A PREROUTING -i eth0 -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80 iptables -t nat -A POSTROUTING -s 219.237.206.202/32 -j SNAT --to-source 192.168.0.1 iptables 配置例子帶vpn #添加模塊 modporbe ipt_MASQUERADE modporbe ip_conntrack_ftp modporbe ip_nat_ftp ############################################################# iptables -F iptables -t nat -F iptables -X iptables -t nat -X ############################################################# iptables -p INPUT DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 110,80,25 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT #允許內(nèi)網(wǎng)samba,smtp,pop3連接 iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT #允許dns連接 iptables -A INPUT -p tcp --dport 1723 -j ACCEPT //vpn端口 iptables -A INPUT -p gre -j ACCEPT #允許外網(wǎng)連接vpn iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP #為了防止dos太多連接近來,那么可以允許最多15個(gè)出始連接,超過則丟棄 iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP iptables -I INPUT -s 192.168.0.12 -j ACCEPT iptables -I FORWARD -s 192.168.0.12 -j ACCEPT #192.168.0.12是我的機(jī)子,全部放行 iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT iptables的狀態(tài)檢測機(jī)制 Iptables 綜合例子 #!/bin/sh echo "String iptables rules..." echo "1" /proc/sys/net/ipv4/ip_forward Out_ip=219.237.206.200 In_ip=192.168.0.1 network_gateway=192.168.0.168 ip_range="198.168.80.0/24" //先初始化工作 iptables -F iptables -X iptables -t nat -F iptables -t nat -X //禁止所有的包通過 iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT |
|
|