1. 程式人生 > >2-7-配置iptables防火墻增加服務器安全

2-7-配置iptables防火墻增加服務器安全

我們 公網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;

五個鏈: input匹配目標IP是本機的數據包, output 出口數據包 , 一般不在此鏈上做配置 forward匹配流經本機的數據包, prerouting用來修改目的地址,用來做DNAT 。如:把內網中的80端口映射到路由器外網端口上 postrouting用來修改源地址用來做SNAT。 如:內網通過路由器NAT轉換功能實現內網PC機通過一個公網IP地址上網。 總結:iptables三個表,5個鏈接,結構如圖: 技術分享

Raw [r?:]表:用於處理異常,包括的規則鏈有,prerouting,output; 一般使用不到。 例:查看raw表中的內容:
  1. [[email protected] ~]# iptables -t raw -L
  2. Chain PREROUTING (policy ACCEPT)
  3. target prot opt source destination
  4. Chain OUTPUT (policy ACCEPT)
  5. 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鏈輸出。

技術分享


總結: 整體數據包分兩類: 1、發給防火墻本身的數據包 ;2、需要經過防火墻的數據包 註意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的 Iptables部署 Iptables是邏輯性比較強的服務,所以我們一個一個的實驗疏通

安裝
  1. [[email protected] ~]# rpm -qf `which iptables`
  2. iptables-1.4.7-4.el6.x86_64
  3. [[email protected] ~]# rpm -ivh /mnt/Packages/iptables-1.4.7-4.el6.x86_64.rpm

配置文件位置:
  1. [[email protected] ~]# ls /etc/sysconfig/iptables
  2. /etc/sysconfig/iptables

啟動服務
  1. [[email protected] ~]# /etc/init.d/iptables start
  2. [[email protected] ~]# chkconfig --list iptables
  3. iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off


技術分享

iptables語法總結: 技術分享

例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,刪除一條規則 例如:
  1. [[email protected] ~]# iptables -L
  2. Chain INPUT (policy ACCEPT)
  3. target prot opt source destination
  4. DROP all -- anywhere anywhere

iptables -D INPUT1(按號碼匹配)

刪除 filter 表 INPUT 鏈中的第1條規則(不管它的內容是什麽)

  1. [[email protected] ~]# iptables -L
  2. Chain INPUT (policy ACCEPT)
  3. 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,設置某個鏈的默認規則

例如:
  1. [[email protected] ~]# iptables -L #查看默認規則是ACCEPT [?k?sept]
  2. Chain INPUT (policy ACCEPT)
  3. target prot opt source destination

iptables -P INPUTDROP 設置 filter表 INPUT 鏈的默認規則是 DROP
  1. [[email protected] ~]# iptables -L #查看已經變為DROP
  2. Chain INPUT (policy DROP)
  3. target prot opt source destination

註意: 當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動作前面不能加 –j,這也是唯一一種匹配動作前面不加 –j 的情況。

-F [鏈名] FLUSH,清空規則 例如: 添加規則:
  1. [[email protected] ~]# iptables -t filter -A INPUT -j DROP
  2. [[email protected] ~]# iptables -F INPUT #清除INPUT鏈上的規則
  3. [[email protected] ~]# iptables -F #清除filter表中所有鏈上的規則
  4. [[email protected] ~]# iptables -t nat -F #清空NAT表中 所有鏈上的規則
  5. [[email protected] ~]# iptables -t nat -F PREROUTING #清空NAT表中 PREROUTING鏈上的規則
註意: 1、-F 僅僅是清空鏈中規則,並不影響 -P 設置的默認規則。 需要手動改:

  1. [[email protected] ~]# iptables -P INPUT ACCEPT
2、-P 設置了 DROP 後,使用 -F 一定要小心!!! ##在生產環境中,使用-P DROP 這條規則,一定要小心,設置之前最好配置下面兩個任務計劃,否則容易把自己drop掉,鏈接不上遠程主機。 配置crontab : */15 * * * * iptables -P INPUT ACCEPT */15 * * * * iptables –F

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 <匹配協議類型> 可以是 TCPUDPICMP 等,也可為空 例如: -p tcp -p udp -p icmp --icmp-type 類型 ping: type 8 pong: type 0 按來源目的端口匹配 --sport <匹配源端口> 可以是個別端口,可以是端口範圍 例如: --sport 1000 匹配源端口是 1000 的數據包 --sport 1000:3000 匹配源端口是 1000-3000 的數據包(含10003000 --sport :3000 匹配源端口是 3000 以下的數據包(含 3000 --sport 1000: 匹配源端口是 1000 以上的數據包(含 1000 --dport <匹配目的端口> 可以是個別端口,可以是端口範圍 例如: --dport 80 匹配目的端口是 80 的數據包 --dport 6000:8000 匹配目的端口是 6000-8000 的數據包(含60008000 --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 地址) 例如:
  1. [[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

  1. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改成一個地址池裏的 IP -j DNAT --to IP[-IP][:端口-端口]nat 表的 PREROUTING鏈) 目的地址轉換DNAT 支持轉換為單 IP,也支持轉換到 IP 地址池 (一組連續的 IP 地址) 例如: 表達方式1:把從eth0 進來的要訪問 TCP/80 的數據包目的地址改為 192.168.0.1.
  1. [[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
表達方式2:
  1. [[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 192.168.0.1:81
表達方式3:把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改為 192.168.0.1-192.169.1.10
  1. [[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10
-j MASQUERADE 偽裝 [?m?sk??re?d] 動態源地址轉換(動態 IP 的情況下使用) 例如:
  1. [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
將源地址是 192.168.0.0/24 的數據包進行地址偽裝,轉換成eth0上的IP地址。eth0為路由器外網出口IP地址

附加模塊 £ 按包狀態匹配 (state) £ 按來源 MAC 匹配(mac) £ 按包速率匹配 (limit) £ 多端口匹配 (multiport) 按包狀態匹配 (state -m state --state 狀態 狀態:NEWRELATEDESTABLISHEDINVALID 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這個狀態的任何東西。
這些狀態可以一起使用,以便匹配數據包。這可以使我們的防火墻非常強壯和有效。以前,我們經常打 開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 模塊是沒有意義的

2-7-配置iptables防火墻增加服務器安全