Linux包過濾防火墻
1,什么是包過濾防火墻
2,包過濾的工作層
工作在網(wǎng)絡(luò)層
3,工作原理
數(shù)據(jù)包過濾通過對數(shù)據(jù)包的IP頭和TCP或UDP頭的檢查來實現(xiàn)的主要有:
IP源地址
IP目標(biāo)地址
協(xié)議(tcp包,udp包,和icmp包)
tcp或udp的源端口
imcp消息類型
tcp包頭中的ack位
數(shù)據(jù)包到達(dá)的端口
數(shù)據(jù)包出去的端口
包過濾技術(shù)的優(yōu)缺點
使用iptables實現(xiàn)包過濾
相關(guān)的TCP/IP支持
假如A要和B通信
1,(SYN) B要和A通信時,B首先向A發(fā)一個SYN標(biāo)記的包,告訴 A請求建立連接
2,(SYN/ACK) A收到后回發(fā)送一對SYN包的確認(rèn)包(SYN/ACK)回去,表示對第一個SYN包的確認(rèn),并繼續(xù)握手操作
3,(ACK) B收到SYN/ACK包后,B發(fā)一個確認(rèn)包ACK,通知 A連接已建立。三次握手完成,一個TCP連接完成
TCP連接的每個包都會設(shè)置ACK位,這就是連接跟蹤的重要意義,放火墻將無法判斷收到的ACK屬于一個已經(jīng)建立的連接
結(jié)束TCP連接
iptables語法
一條iptables規(guī)則基本上因該包含5個要素
指定表 table 分別是 filter,nat和mangle
指定操作命令 command 包括添加,刪除,更新
指定鏈 chains 對于包過濾防火墻可操作filter表中的INPUT鏈,OUTPUT鏈和 FORWARD鏈
指定規(guī)則匹配器 mather 可以指定各種規(guī)則匹配,如IP地址,端口,包類型
指定目標(biāo)動作 target 當(dāng)規(guī)則匹配一個包時,真正要執(zhí)行的任務(wù)用目標(biāo)標(biāo)識。最常目標(biāo) 為ACCEPT,DROP,REJECT表示拒絕,丟棄包的同時給發(fā)送沒有接 受的通知,LOG表示包的有關(guān)信息被記錄日志,TOS表示改寫包的TOS值
語法:
iptables [-t table] CMD [chain] [rule-matcher] [-j target]
table為表名,CMD為操作命令,chain為鏈名,rule-matcher為規(guī)則匹配器,target為目標(biāo)動作
iptables的常用操作命令
-A 或 --append 在所有的鏈的結(jié)尾加入一條或多條規(guī)則
-D 或 --delete 在所有的鏈刪除
-R 或 --replace 替換一條匹配的規(guī)則
-I 或 --insert 以給出的規(guī)則號在所選鏈中插入一條或多條規(guī)則。如果規(guī)則號是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命令顯示時它在第一 行顯示
-C 或 --check 檢測給定的包是否與指定鏈的規(guī)則相匹配
-X 或 --zero 將指定鏈中所有規(guī)則的包字節(jié)(byte)計數(shù)器清零
-h 顯示幫助信息
iptables常用的規(guī)則匹配器
-p,[!]protocol 指出要匹配的協(xié)議,可以是tcp,udp,icmp,all.協(xié)議名前綴"!", 為邏輯非
-s[!]address[/mask] 根據(jù)源地址或地址范圍確定是否允許或拒絕數(shù)據(jù)包通過過濾器
--sport[!]port[:port] 指定匹配規(guī)則的源端口或端口范圍??梢杂枚丝谔?span style="mso-tab-count: 1">
-d[!]address[/mask] 根據(jù)目的地址或地址范圍確定是否允許或拒絕數(shù)據(jù)包通過過濾器
-dport[!]port[:port] 指定匹配規(guī)則的目的端口或端口范圍,可以用端口號,也可以 用/etc/services文件中的名字
--icmp-type[!]typename 指定匹配規(guī)則的ICMP信息類(可以使用iptables -p icmp -h 查看有效的icmp類型名)
-i[!]interface name[+] 匹配單獨的接口或某種類型的接口設(shè)置過濾規(guī)則。此參數(shù)忽略 時,默認(rèn)符合所有接口。接口可以使用否定符"!"來匹配不是指 定接口來包.參數(shù)interfacename是接口名,如eth0,eth1,ppp0 等。指定一個目前不存在的接口是完全合法的。規(guī)則直到接口時 才起作用,這種指定對于PPP及該選項只有對INPUT,FROWARD和 PREROUTING鏈?zhǔn)呛戏ǖ?o:p>
-o[!]interface name[+] 僅僅匹配設(shè)置了SYN位,清除了ACK,FIN位的TCP包.這些包表示請求初始化的TCP連接。阻止從接口來的這樣的包將會組織外來的TCP連接請求。但輸出的TCP連接請求將不受影響。這個參數(shù)僅僅當(dāng)協(xié)議類型設(shè)置為TCP時才能用
-m --match -m選項引出了iptables的state擴展模塊,比如mac擴展模塊,它實現(xiàn)根據(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
擴展模塊是iptables體系中的特色,它使得iptables成為一個可擴展的安全體系結(jié)構(gòu)。你可以從這里了解更多關(guān)于iptables擴展模塊的知識:http://www.iptables.org/document ... tensions-HOWTO.html
[!]-syn 僅僅匹配設(shè)置了SYN位,清除
--state state,state... 狀態(tài)匹配
這里,state是一個用逗號分割的列表,表示要匹配的連接狀態(tài)。有效的狀態(tài)選項包括:INVAILD,表示分組對應(yīng)的連接是未知的;ESTABLISHED,表示分組對應(yīng)的連接已經(jīng)進(jìn)行了雙向的分組傳輸,也就是說連接已經(jīng)建立;NEW,表示這個分組需要發(fā)起一個連接,或者說,分組對應(yīng)的連接在兩個方向上都沒有進(jìn)行過分組傳輸;RELATED,表示分組要發(fā)起一個新的連接,但是這個連接和一個現(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)行維護。稍后我們再介紹它的內(nèi)容。狀態(tài)表能夠保存的最大連接數(shù)保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取決于硬件的物理內(nèi)存。
分組是否匹配狀態(tài)表中的一個已經(jīng)實現(xiàn)(ESTABLISHED)的連接。
它是否是和狀態(tài)表中某個UDP/TCP連接相關(guān)(RELATED)的一個ICMP分組。
這個分組是否要發(fā)起一個新(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é)計數(shù)器清零
(2)設(shè)置鏈的默認(rè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)表 因此會顯示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)程不會經(jīng)過FORWARD鏈,因此lo只有INPUT和OUTPUT兩個鏈上作用
用戶自定義鏈
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個編號
如果自己是某種客戶機和服務(wù)器的話,需要在連上加兩個條件
還需要開通本機的服務(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è)置本機的包,不能從本機的22端口自動的出去,因為沒有驗證過
下面表示跟本機建立過連接的包,才能從22端口出去,防止本機自從動從22端口出去
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
現(xiàn)在就可以刪除原來的包了
iptables -D OUTPUT 1
下面是不允許本地產(chǎn)生包主動從80端口發(fā)送給別人!
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
刪除原來的設(shè)置
上面是作為服務(wù)器有這個問題,做為客戶機也會產(chǎn)生這個問題
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 // 指定匹配的主機
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通信過程中,每一個網(wǎng)絡(luò)接口都有嚴(yán)格最大傳輸單元(MTU),這個參數(shù)定義可以通過的數(shù)據(jù)包的最大尺寸。如果一個數(shù)據(jù)包大于這個參數(shù)值時,系統(tǒng)會將其劃分成更小的數(shù)的數(shù)個數(shù)據(jù)包(成為IP歲片)
....................
設(shè)置擴展的規(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ù)器/客戶機交互是雙向的,所有不僅僅要設(shè)置數(shù)據(jù)包
NAT與代理服務(wù)器
echo "1" > /proc/sys/net/ipv4/ip_forware
NAT表也有三個缺省的鏈
prerouting: 可以在這里面定義進(jìn)行目的nat的規(guī)則,因為路由器進(jìn)行路由時檢查數(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
兩個特殊的轉(zhuǎn)發(fā)點
源地址轉(zhuǎn)換(SNAT) 在POSTROUTING點不能發(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)地址
如果需要偽裝或不知道要影射成什么地址,可以偽裝,他支持動態(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)機器的ip地址進(jìn)入互聯(lián)網(wǎng)
//把目的ip 219.237.206.200端口為21影射到內(nèi)網(wǎng)192.168.0.1的機器上
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個出始連接,超過則丟棄
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是我的機子,全部放行
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT
iptables的狀態(tài)檢測機制
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
聯(lián)系客服