2-7-配置iptables防火墻增加服務器安全
阿新 • • 發佈:2017-05-16
我們 公網ip 為我 介紹 1-1 5% family 方式 man 本節所講內容:
? iptables常見概念
? iptables服務器安裝及相關配置文件
? 實戰:iptables使用方法
? 例1:使用iptables防火墻保護公司web服務器
? 例2:使用iptables搭建路由器,通過SNAT使用內網機器上網
? 例3:限制某些IP地址訪問服務器
? 例4:使用DNAT功能把內網web服務器端口映射到路由器外網
? selinux概述-狀態切換
iptables服務端:xuegod63.cn IP:192.168.1.63
iptables 客戶端:xuegod64.cn IP:192.168.1.64
iptables概述:
netfilter/iptables : IP信息包過濾系統,它實際上由兩個組件netfilter 和 iptables 組成。
netfilter/iptables 關系:
netfilter 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
netfilter/iptables 後期簡稱為:iptables。 iptables是基於內核的防火墻,功能非常強大,iptables內置了filter,nat和mangle三張表。所有規則配置後,立即生效,不需要重啟服務。
三張表介紹:
filter負責過濾數據包,包括的規則鏈有,input,output和forward;
nat則涉及到網絡地址轉換,包括的規則鏈有,prerouting,postrouting和output;
mangle表則主要應用在修改數據包內容上,用來做流量整形的,給數據包打個標識,默認的規則鏈有:INPUT,OUTPUT、 forward,POSTROUTING,PREROUTING;
這些狀態可以一起使用,以便匹配數據包。這可以使我們的防火墻非常強壯和有效。以前,我們經常打 開1024以上的所有端口來放行應答的數據。現在,有了狀態機制,就不需再這樣了。因為我們可以只開放那些有應答數據的端口,其他的都可以關閉。這樣就安全多了。
按來源 MAC 匹配(mac)
-m mac --mac-source MAC
匹配某個 MAC 地址
例如:
iptables -A FORWARD -m mac --mac-sourcexx:xx:xx:xx:xx:xx -j DROP
阻斷來自某 MAC 地址的數據包,通過本機
註意:
報文經過路由後,數據包中原有的 mac 信息會被替換,所以在路由後的 iptables 中使用 mac 模塊是沒有意義的
五個鏈: input匹配目標IP是本機的數據包, output 出口數據包 , 一般不在此鏈上做配置 forward匹配流經本機的數據包, prerouting用來修改目的地址,用來做DNAT 。如:把內網中的80端口映射到路由器外網端口上 postrouting用來修改源地址用來做SNAT。 如:內網通過路由器NAT轉換功能實現內網PC機通過一個公網IP地址上網。 總結:iptables三個表,5個鏈接,結構如圖:
Raw [r?:]表:用於處理異常,包括的規則鏈有,prerouting,output; 一般使用不到。 例:查看raw表中的內容:
- [[email protected] ~]# iptables -t raw -L
- Chain PREROUTING (policy ACCEPT)
- target prot opt source destination
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
表->鏈->規則
Iptables過濾封包流程
-->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING--> mangle | mangle ^mangle nat | filter | nat | | | | v | INPUT OUTPUT | mangle ^ mangle | filter | nat v ---------------->local------------>|filter
總結: 整體數據包分兩類: 1、發給防火墻本身的數據包;2、需要經過防火墻的數據包 ① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。 ② 如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。 本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。 ③ 如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
安裝
- [[email protected] ~]# rpm -qf `which iptables`
- iptables-1.4.7-4.el6.x86_64
- [[email protected] ~]# rpm -ivh /mnt/Packages/iptables-1.4.7-4.el6.x86_64.rpm
配置文件位置:
- [[email protected] ~]# ls /etc/sysconfig/iptables
- /etc/sysconfig/iptables
啟動服務
- [[email protected] ~]# /etc/init.d/iptables start
- [[email protected] ~]# chkconfig --list iptables
- iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
例1:iptables命令使用方法 £ iptables [-t 要操作的表] <操作命令> [要操作的鏈] [規則號碼] [匹配條件] [-j 匹配到以後的動作] £ 操作命令(-A、-I、-D、-P、-F) £ 查看命令(-[vnx]L) -A <鏈名> APPEND,追加一條規則(放到最後) 例如: iptables -t filter -A INPUT-j DROP #拒絕所有人訪問服務器 在 filter表的 INPUT 鏈裏追加一條規則(作為最後一條規則) 匹配所有訪問本機 IP 的數據包,匹配到的丟棄
-I <鏈名> [規則號碼] INSERT,插入一條規則 例如: iptables -I INPUT -j DROP 在 filter表的 INPUT 鏈裏插入一條規則(插入成第 1 條) iptables -I INPUT 3 -j DROP 在 filter表的 INPUT 鏈裏插入一條規則(插入成第 3 條) 註意: 1、-t filter 可不寫,不寫則自動默認是 filter 表 2、-I 鏈名 [規則號碼],如果不寫規則號碼,則默認是 1 3、確保規則號碼 ≤ (已有規則數 + 1),否則報錯 -R num:Replays替換/修改第幾條規則 格式:iptables –t filter -R INPUT 3 ………… 修改filter的INPUT鏈第三條規則
-D <鏈名> <規則號碼 | 具體規則內容> DELETE,刪除一條規則 例如:
- [[email protected] ~]# iptables -L
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- DROP all -- anywhere anywhere
iptables -D INPUT1(按號碼匹配)
刪除 filter 表 INPUT 鏈中的第1條規則(不管它的內容是什麽)
- [[email protected] ~]# iptables -L
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
iptables -D INPUT-s 192.168.0.1 -j DROP(按內容匹配)
刪除 filter 表 INPUT 鏈中內容為“-s 192.168.0.1 -j DROP”的規則 (不管其位置在哪裏) 註意: 1、若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條 2、按號碼匹配刪除時,確保規則號碼 ≤ 已有規則數,否則報錯 3、按內容匹配刪除時,確保規則存在,否則報錯
-P <鏈名> <動作> POLICY,設置某個鏈的默認規則
例如:
- [[email protected] ~]# iptables -L #查看默認規則是ACCEPT [?k?sept]
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
iptables -P INPUTDROP 設置 filter表 INPUT 鏈的默認規則是 DROP
- [[email protected] ~]# iptables -L #查看已經變為DROP
- Chain INPUT (policy DROP)
- target prot opt source destination
註意: 當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動作前面不能加 –j,這也是唯一一種匹配動作前面不加 –j 的情況。
-F [鏈名] FLUSH,清空規則 例如: 添加規則:
- [[email protected] ~]# iptables -t filter -A INPUT -j DROP
- [[email protected] ~]# iptables -F INPUT #清除INPUT鏈上的規則
- [[email protected] ~]# iptables -F #清除filter表中所有鏈上的規則
- [[email protected] ~]# iptables -t nat -F #清空NAT表中 所有鏈上的規則
- [[email protected] ~]# iptables -t nat -F PREROUTING #清空NAT表中 PREROUTING鏈上的規則
- [[email protected] ~]# iptables -P INPUT ACCEPT
3、如果不寫鏈名,默認清空某表裏所有鏈裏的所有規則
-Z 將封包計數器歸零 iptables -Z INPUT
-L [鏈名] LIST,列出規則 v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數 x:在 v 的基礎上,禁止自動單位換算(K、M) n:只顯示 IP 地址和端口號碼,不顯示域名和服務名稱 --line-number 可以查看到規則號
例如: iptables -L 粗略列出 filter 表所有鏈及所有規則 iptables -t nat -vnL 用詳細方式列出 nat 表所有鏈的所有規則,只顯示 IP 地址和端口號 iptables -t nat -vxnLPREROUTING 用詳細方式列出 nat 表 PREROUTING 鏈的所有規則以及詳細數字,不反解 互動: iptables -L -n 可以執行成功 iptables -Ln 是否可以執行成功? 匹配條件 ? 流入、流出接口(-i、-o) ? 來源、目的地址(-s、-d) ? 協議類型 (-p) ? 來源、目的端口(--sport、--dport) 按網絡接口匹配 -i <匹配數據進入的網絡接口> #此參數主要應用於nat表,例如目標地址轉換 例如: -i eth0 匹配是否從網絡接口 eth0 進來 -i ppp0 匹配是否從網絡接口 ppp0 進來 -o 匹配數據流出的網絡接口 例如: -o eth0 -o ppp0 按來源目的地址匹配 -s <匹配來源地址> 可以是 IP、 網段、域名,也可空(任何地址) 例如: -s 192.168.0.1 匹配來自 192.168.0.1 的數據包 -s 192.168.1.0/24 匹配來自 192.168.1.0/24 網絡的數據包 -s 192.168.0.0/16 匹配來自 192.168.0.0/16 網絡的數據包 -d <匹配目的地址> 可以是 IP、 網段、域名,也可以空 例如: -d 202.106.0.20 匹配去往 202.106.0.20 的數據包 -d 202.106.0.0/16 匹配去往 202.106.0.0/16 網絡的數據包 -d www.abc.com 匹配去往域名 www.abc.com 的數據包 按協議類型匹配 -p <匹配協議類型> 可以是 TCP、UDP、ICMP 等,也可為空 例如: -p tcp -p udp -p icmp --icmp-type 類型 ping: type 8 pong: type 0 按來源目的端口匹配 --sport <匹配源端口> 可以是個別端口,可以是端口範圍 例如: --sport 1000 匹配源端口是 1000 的數據包 --sport 1000:3000 匹配源端口是 1000-3000 的數據包(含1000、3000) --sport :3000 匹配源端口是 3000 以下的數據包(含 3000) --sport 1000: 匹配源端口是 1000 以上的數據包(含 1000) --dport <匹配目的端口> 可以是個別端口,可以是端口範圍 例如: --dport 80 匹配目的端口是 80 的數據包 --dport 6000:8000 匹配目的端口是 6000-8000 的數據包(含6000、8000) --dport :3000 匹配目的端口是 3000 以下的數據包(含 3000) --dport 1000: 匹配目的端口是 1000 以上的數據包(含 1000) 註意:--sport 和 --dport必須配合 -p 參數使用 匹配應用舉例 1、端口匹配 -p udp --dport 53 匹配網絡中目的端口是 53 的 UDP 協議數據包 2、地址匹配 -s 10.1.0.0/24 -d172.17.0.0/16 匹配來自 10.1.0.0/24 去往 172.17.0.0/16 的所有數據包 3、端口和地址聯合匹配 -s 192.168.0.1 -dwww.abc.com -p tcp --dport 80
匹配來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協議數據包
註意: 1、--sport、--dport必須聯合 -p 使用,必須指明協議類型是什麽 2、條件寫的越多,匹配越細致,匹配範圍越小 4 動作(處理方式) ? ACCEPT ? DROP ? SNAT ? DNAT ? MASQUERADE
-j ACCEPT 通過,允許數據包通過本鏈而不攔截它 例如: iptables -A INPUT -j ACCEPT 允許所有訪問本機 IP 的數據包通過 -j DROP 丟棄,阻止數據包通過本鏈而丟棄它 例如: iptables -A FORWARD -s192.168.80.39 -j DROP 阻止來源地址為 192.168.80.39 的數據包通過本機 -j SNAT --toIP[-IP][:端口-端口](nat 表的 POSTROUTING 鏈) 源地址轉換,SNAT 支持轉換為單 IP,也支持轉換到 IP 地址池(一組連續的 IP 地址) 例如:
- [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
#將內網 192.168.0.0/24 的原地址修改為 1.1.1.1,用於 NAT
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
- [[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
- [[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 192.168.0.1:81
- [[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10
- [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
附加模塊 £ 按包狀態匹配 (state) £ 按來源 MAC 匹配(mac) £ 按包速率匹配 (limit) £ 多端口匹配 (multiport) 按包狀態匹配 (state) -m state --state 狀態 狀態:NEW、RELATED、ESTABLISHED、INVALID NEW:有別於 tcp 的 syn #如果我們發送一個流的初始化包,狀態就會在OUTPUT鏈 裏被設置為NEW,當我們收到回應的包時,狀態就會在PREROUTING鏈裏被設置為ESTABLISHED。如果第一個包不是本地產生的,那就會在PREROUTING鏈裏被設置為NEW狀 態。 ESTABLISHED:連接態 RELATED:衍生態,與 conntrack 關聯(FTP) INVALID:不能被識別屬於哪個連接或沒有任何狀態 例如: iptables -A INPUT -m state --stateRELATED,ESTABLISHED -j ACCEPT 四個狀態:
[td]
State(狀態) | Explanation(註釋) |
NEW | NEW說明這個包是我們看到的第一個 包。意思就是,這是conntrack模塊看到的某個連接第一個包,它即將被匹配了。比如,我們看到一個SYN 包,是我們所留意的連接的第一個包,就要匹配它。第一個包也可能不是SYN包,但它仍會被認為是NEW狀態。這樣做有時會導致一些問題,但對某些情況是有非常大的幫助的。例如,在 我們想恢復某條從其他的防火墻丟失的連接時,或者某個連接已經超時,但實際上並未關閉時。 |
ESTABLISHED | ESTABLISHED已經註意到兩個方向上 的數據傳輸,而且會繼續匹配這個連接的包。處於ESTABLISHED狀態的連接是非常容 易理解的。只要發送並接到應答,連接就是ESTABLISHED的了。一個連接要從NEW變 為ESTABLISHED,只需要接到應答包即可,不管這個包是發往防火墻的,還是要由防 火墻轉發的。ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我 們所發出的信息的應答。 |
RELATED | RELATED是個比較麻煩的狀態。當一 個連接和某個已處於ESTABLISHED狀態的連接有關系時,就被認為是RELATED的了。換句話說,一個連接要想 是RELATED的,首先要有一個ESTABLISHED的連接。這個ESTABLISHED連接再產生一個主連接之外的連接,這 個新的連接就是RELATED的了,當然前提是conntrack模塊要能理解RELATED。ftp是個很好的例子,FTP-data 連接就是和FTP-control有RELATED的。還有其他的例子,比如,通過IRC的DCC連接。有了這個狀態,ICMP應 答、FTP傳輸、DCC等才能穿過防火墻正常工作。註意,大部分還有一些UDP協議都依賴這個機制。這些協議 是很復雜的,它們把連接信息放在數據包裏,並且要求這些信息能被正確理解。 |
INVALID | INVALID說明數據包不能被識別屬於 哪個連接或沒有任何狀態。有幾個原因可以產生這種情況,比如,內存溢出,收到不知屬於哪個連接的ICMP 錯誤信息。一般地,我們DROP這個狀態的任何東西。 |
2-7-配置iptables防火墻增加服務器安全