Iptables原理
現(xiàn)在防火墻主要分以下三種類型:包過(guò)濾、應(yīng)用代理、狀態(tài)檢測(cè)
包過(guò)濾防火墻:現(xiàn)在靜態(tài)包過(guò)濾防火墻市面上已經(jīng)看不到了,取而代之的是動(dòng)態(tài)包過(guò)濾技術(shù)的防火墻哈~
代理防火墻:因一些特殊的報(bào)文攻擊可以輕松突破包過(guò)濾防火墻的保護(hù),比如大家知道的SYN攻擊、ICMP洪水攻擊,所以以代理服務(wù)器作為專門(mén)為用戶保密或者突破訪問(wèn)限制的數(shù)據(jù)轉(zhuǎn)發(fā)通道的應(yīng)用代理防火墻出現(xiàn)了哈~其使用了一種應(yīng)用協(xié)議分析的新技術(shù)。
狀態(tài)檢測(cè)防火墻:其基于動(dòng)態(tài)包過(guò)濾技術(shù)發(fā)展而來(lái),加入了一種狀態(tài)檢測(cè)的模塊,進(jìn)一點(diǎn)發(fā)展了會(huì)話過(guò)濾功能,會(huì)話狀態(tài)的保留是有時(shí)間限制的,此防火墻還可以對(duì)包的內(nèi)容進(jìn)行分析,從而避免開(kāi)放過(guò)多的端口。
netfilter/iptables IP數(shù)據(jù)包過(guò)濾系統(tǒng)實(shí)際上由netfilter和iptables兩個(gè)組件構(gòu)成。netfilter是集成在內(nèi)核中的一部分,其作用是定義、保存相應(yīng)的規(guī)則,而iptables是一種工具,用來(lái)修改信息的過(guò)濾規(guī)則及其他配置,我們可以通過(guò)iptables來(lái)設(shè)置一些適合我們企業(yè)需求環(huán)境的規(guī)則哈~,而這些規(guī)則會(huì)保存在內(nèi)核空間之中。
netfilter是Linux核心中的一個(gè)通用架構(gòu),其提供了一系列的表(tables),每個(gè)表由若干個(gè)鏈(chains)組成,而每條鏈可以由一條或若干條規(guī)則(rules)組成。實(shí)際上netfilter是表的容器,表是鏈的容器,而鏈又是規(guī)則的容器。
filter表
nat表
mangle表
iptables內(nèi)置鏈
PREROUTING:數(shù)據(jù)包進(jìn)入路由表之前
INPUT:通過(guò)路由表后目的地為本機(jī)
FORWARDING:通過(guò)路由表后,目的地不為本機(jī)
OUTPUT:由本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)
POSTROUTIONG:發(fā)送到網(wǎng)卡接口之前
netfilter五條鏈相互關(guān)系,即iptables數(shù)據(jù)包轉(zhuǎn)發(fā)流程圖
Iptables工作流程圖
iptables擁有三個(gè)表和五條鏈組成
NAT工作原理
Iptables詳細(xì)參數(shù)表
Iptables基本語(yǔ)法
iptables [-t 表名] -命令 -匹配 -j 動(dòng)作/目標(biāo)
iptables內(nèi)置了filter、nat和mangle三張表,我們可以使用-t參數(shù)來(lái)設(shè)置對(duì)哪張表生效哈~也可以省略-t參數(shù),則默認(rèn)對(duì)filter表進(jìn)行操作。
具體命令參數(shù)可以通過(guò)man iptables查詢哈~
配置SNAT命令基本語(yǔ)法
iptables -t nat -A POSTROUTING -o 網(wǎng)絡(luò)接口 -j SNAT --to-source IP地址
配置DNAT命令基本語(yǔ)法
iptables -t nat -A PREROUTING -i 網(wǎng)絡(luò)接口 -p 協(xié)議 --dport 端口 -j DNAT --to-destination IP地址
企業(yè)環(huán)境及需求
1、企業(yè)環(huán)境
230臺(tái)客戶機(jī),IP地址范圍為192.168.0.1~192.168.0.254,子網(wǎng)掩碼為255.255.255.0
Mail服務(wù)器:IP地址為192.168.0.1 子網(wǎng)掩碼為255.255.255.0
FTP服務(wù)器:IP地址為192.168.0.2 子網(wǎng)掩碼為255.255.255.0
WEB服務(wù)器:IP地址為192.168.0.3 子網(wǎng)掩碼為255.255.255.0
公司網(wǎng)絡(luò)拓?fù)鋱D如下:
2、配置默認(rèn)策略
所有內(nèi)網(wǎng)計(jì)算機(jī)需要經(jīng)常訪問(wèn)互聯(lián)網(wǎng),并且員工會(huì)使用即時(shí)通信工具與客戶進(jìn)行溝通,企業(yè)網(wǎng)絡(luò)DMZ隔離區(qū)搭建有Mail、FTP和Web服務(wù)器,其中Mail和FTP服務(wù)器對(duì)內(nèi)部員工開(kāi)放,僅需要對(duì)外發(fā)布Web站點(diǎn),并且管理員會(huì)通過(guò)外網(wǎng)進(jìn)行遠(yuǎn)程管理,為了保證整個(gè)網(wǎng)絡(luò)的安全性,需要添加iptables防火墻并配置相應(yīng)的策略
需求分析
企業(yè)的內(nèi)部網(wǎng)絡(luò)為了保證安全性,需要首先刪除所有規(guī)則設(shè)置,并將默認(rèn)規(guī)則設(shè)置為DROP,然后開(kāi)啟防火墻對(duì)于客戶端的訪問(wèn)限制,打開(kāi)WEB、MSN、QQ及MAIL的相應(yīng)端口,并允許外部客戶端登錄WEB服務(wù)器的80、22端口。
解決方案
1、配置默認(rèn)策略
默認(rèn)iptables已經(jīng)被安裝好了
(1)刪除策略
iptables -F:清空所選鏈中的規(guī)則,如果沒(méi)有指定鏈則清空指定表中所有鏈的規(guī)則
iptables -X:清除預(yù)設(shè)表filter中使用者自定鏈中的規(guī)則
iptables -Z:清除預(yù)設(shè)表filter中使用者自定鏈中的規(guī)則
(2)設(shè)置默認(rèn)策略
設(shè)置默認(rèn)策略為關(guān)閉filter表的INPPUT及FORWARD鏈開(kāi)啟OUTPUT鏈,nat表的三個(gè)鏈PREROUTING、OUTPUT、POSTROUTING全部開(kāi)啟哈~默認(rèn)全部鏈都是開(kāi)啟的,所以有些命令可以不操作,另外mangle表本文沒(méi)用到,所以不做處理,mangle主要用在數(shù)據(jù)包的特殊變更處理上,比如修改TOS等特性。
2、設(shè)置回環(huán)地址
iptables -A INPUT -i lo -j ACCEPT
3、連接狀態(tài)設(shè)置
為了簡(jiǎn)化防火墻的配置操作,并提高檢查的效率,需要添加連接狀態(tài)設(shè)置
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
連接跟蹤存在四種數(shù)據(jù)包狀態(tài)
NEW:想要新建連接的數(shù)據(jù)包
INVALID:無(wú)效的數(shù)據(jù)包,例如損壞或者不完整的數(shù)據(jù)包
ESTABLISHED:已經(jīng)建立連接的數(shù)據(jù)包
RELATED:與已經(jīng)發(fā)送的數(shù)據(jù)包有關(guān)的數(shù)據(jù)包
4、設(shè)置80端口轉(zhuǎn)發(fā)
公司網(wǎng)站需要對(duì)外開(kāi)放,所以我們需要開(kāi)放80端口
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
5、DNS相關(guān)設(shè)置
為了客戶端能夠正常使用域名訪問(wèn)互聯(lián)網(wǎng),我們還需要允許內(nèi)網(wǎng)計(jì)算機(jī)與外部DNS服務(wù)器的數(shù)據(jù)轉(zhuǎn)發(fā)。
開(kāi)啟DNS使用UDP、TCP的53端口
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
6、允許訪問(wèn)服務(wù)器的SSH
管理員會(huì)通過(guò)外網(wǎng)進(jìn)行遠(yuǎn)程管理,所以我們要開(kāi)啟SSH使用的TCP協(xié)議22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
7、允許內(nèi)網(wǎng)主機(jī)登錄MSN和QQ相關(guān)設(shè)置
QQ能夠使用TCP80、8000、443及UDP8000、4000登錄,而MSN通過(guò)TCP1863、443驗(yàn)證。因此只需要允許這些端口的FORWARD轉(zhuǎn)發(fā)即可以正常登錄。
iptables -A FORWARD -p tcp --dport 1863 -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -p tcp --dport 8000 -j ACCEPT
iptables -A FORWARD -p udp --dport 8000 -j ACCEPT
iptables -A FORWARD -p udp --dport 4000 -j ACCEPT
注意:當(dāng)然,如果公司要限制這樣即時(shí)通信工具的使用,只要禁止這些端口的轉(zhuǎn)發(fā)就可以了哈~特別注意,馬化騰這家伙忒壞~嘿嘿~,端口不固定,QQVIP會(huì)員專用通道什么的,代理登錄等等哈~,所以我們?nèi)绻枰鈿⒕鸵占卿浂丝诩癚Q服務(wù)器地址,根據(jù)本人總結(jié),最好在企業(yè)實(shí)際配置中技術(shù)與行政管理相結(jié)合,這樣達(dá)到的效果最好~0(^_^)0
8、允許內(nèi)網(wǎng)主機(jī)收發(fā)郵件
客戶端發(fā)送郵件時(shí)訪問(wèn)郵件服務(wù)器的TCP25端口。接收郵件時(shí)訪問(wèn),可能使用的端口則較多,UDP協(xié)議以及TCP協(xié)議的端口:110、143、993及995
smtp:
[root@rhel5 ~]# iptables -A FORWARD -p tcp --dport 25 -j ACCEPT
pop3:
[root@rhel5 ~]# iptables -A FORWARD -p tcp --dport 110 -j ACCEPT
[root@rhel5 ~]# iptables -A FORWARD -p udp --dport 110 -j ACCEPT
imap:
[root@rhel5 ~]# iptables -A FORWARD -p tcp --dport 143 -j ACCEPT
[root@rhel5 ~]# iptables -A FORWARD -p udp --dport 143 -j ACCEPT
imaps:
[root@rhel5 ~]# iptables -A FORWARD -p tcp --dport 993 -j ACCEPT
[root@rhel5 ~]# iptables -A FORWARD -p udp --dport 993 -j ACCEPT
pop3s:
[root@rhel5 ~]# iptables -A FORWARD -p tcp --dport 995 -j ACCEPT
[root@rhel5 ~]# iptables -A FORWARD -p udp --dport 995 -j ACCEPT
9、NAT端口映射設(shè)置
由于局域網(wǎng)的地址為私網(wǎng)地址,在公網(wǎng)上不合法哈~所以必須將私網(wǎng)地址轉(zhuǎn)為服務(wù)器的外部地址進(jìn)行地址映射哈~連接外網(wǎng)接口為ppp0
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
MASQUERADE和SNAT作用一樣哈~相樣是提供源地址轉(zhuǎn)換的操作,但是MASQUERADE是針對(duì)外部接口為動(dòng)態(tài)IP地址來(lái)設(shè)置滴,不需要使用--to-source指定轉(zhuǎn)換的IP地址。如果網(wǎng)絡(luò)采用的是撥號(hào)方式接入互聯(lián)網(wǎng),而沒(méi)有對(duì)外的靜態(tài)IP地址(主要用在動(dòng)態(tài)獲取IP地址的連接,比如ADSL撥號(hào)、DHCP連接等等),那么建議使用MASQUERADE哈~
注意:MASQUERADE是特殊的過(guò)濾規(guī)則,其只可以映射從一個(gè)接口到另一個(gè)接口的數(shù)據(jù)哈~
10、內(nèi)網(wǎng)機(jī)器對(duì)外發(fā)布WEB網(wǎng)站
內(nèi)網(wǎng)WEB服務(wù)器IP地址為192.168.0.3,我們需要進(jìn)行如下配置哈~,當(dāng)公網(wǎng)客戶端訪問(wèn)服務(wù)器時(shí),防火墻將請(qǐng)求映射到內(nèi)網(wǎng)的192.168.0.3的80端口
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80
11、保存與恢復(fù)iptables配置
保存:iptables-save
iptables-save [-c] [-t 表名]
-c:保存包和字節(jié)計(jì)數(shù)器的值??梢允乖谥貑⒎阑饓蟛粊G失對(duì)包和字節(jié)的統(tǒng)計(jì)
-t:用來(lái)保存哪張表的規(guī)則,如果不跟-t參數(shù)則保存所有的表
可以使用重定向命令來(lái)保存這些規(guī)則集
iptables-save > /etc/iptables-save
恢復(fù):iptables-restore
iptables-restore [-c] [-n]
-c:如果加上-c參數(shù)則表示要求裝入包和字節(jié)計(jì)數(shù)器
-n:表示不覆蓋己有的表或表內(nèi)的規(guī)則,默認(rèn)情況下是清除所有己存在的規(guī)則
使用重定向來(lái)恢復(fù)由iptables-save保存的規(guī)則集
iptables-restore > /etc/iptables-save
如果要在服務(wù)或系統(tǒng)重啟后依然生效
service iptables save
12、最終iptables配置如下
[root@rhel5 ~]# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:msnp ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:irdmi ACCEPT udp -- anywhere anywhere udp dpt:irdmi ACCEPT udp -- anywhere anywhere udp dpt:terabase ACCEPT tcp -- anywhere anywhere tcp dpt:smtp ACCEPT tcp -- anywhere anywhere tcp dpt:pop3 ACCEPT udp -- anywhere anywhere udp dpt:pop3 ACCEPT tcp -- anywhere anywhere tcp dpt:imap ACCEPT udp -- anywhere anywhere udp dpt:imap ACCEPT tcp -- anywhere anywhere tcp dpt:imaps ACCEPT udp -- anywhere anywhere udp dpt:imaps ACCEPT tcp -- anywhere anywhere tcp dpt:pop3s ACCEPT udp -- anywhere anywhere udp dpt:pop3s Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@rhel5 ~]# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere anywhere tcp dpt:http to:192.168.0.3:80 Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 192.168.0.0/24 anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@rhel5 ~]# |
注意:
SNAT將源網(wǎng)絡(luò)地址進(jìn)行轉(zhuǎn)換,只能用在nat表的POSTROUTING鏈中,只要連接的第一個(gè)符合條件的包被SNAT了哈~,那么這個(gè)連接的其他所有的數(shù)據(jù)包都會(huì)自動(dòng)地被SNAT。與SNAT對(duì)應(yīng),DNAT將目的地址進(jìn)行轉(zhuǎn)換,只能用在nat表的PREROUTIONG和OUTPUT鏈中,或者是被這兩條鏈調(diào)用的鏈里面。包含DNAT的鏈不能被除此之外的其他鏈調(diào)用,比如POSTROUTING鏈。
附:
我們可以通過(guò)設(shè)置禁止訪問(wèn)具體域名和IP地址哈~
禁止訪問(wèn)QQ主頁(yè):
禁止訪問(wèn)指定IP地址:
[root@rhel5 ~]# iptables -A FORWARD -d 119.147.15.17 -j DROP
我們可以通過(guò)查找QQ的安裝目錄來(lái)獲取QQ服務(wù)器的地址和端口號(hào)哈~