天天看點

防火牆基礎及iptables應用

 對于Internet上的系統,不管是什麼情況都要明确一點:網絡是不安全的。是以,雖然建立一個防火牆并不能保證系統100%安全,但卻是絕對必要的。

防火牆定義:

所謂防火牆是工作在網絡或主機的邊緣,對進出的資料包根據定義的規則進行檢查,并做出相應處理的一套元件。

防火牆類型:

根據工作的層次來劃分,常見的防火牆工作在OSI模型的第三層,稱為網絡層防火牆,工作在OSI第七層的稱為應用層防火牆。

    網絡層防火牆又稱為包過濾型防火牆,它内置于linux系統的核心,在網絡層或傳輸層對經過的資料包進行篩選,篩選的依據是系統内設定的過濾規則。通過檢查資料流中每個資料包的源位址、目的位址、所有的協定、端口号等因素,來決定是否允許該資料包通過。

    應用層防火牆又稱為代理伺服器型防火牆,代理伺服器實際上是運作在防火牆上的一種伺服器程式。伺服器監聽客戶機的請求,當内網的客戶機請求與外網的真實伺服器連接配接時,用戶端首先連接配接代理伺服器,然後再由代理伺服器與外網的真實伺服器連接配接,取得客戶想要的資訊,然後再把資訊傳回給客戶。

防火牆工作模式:

防火牆基礎及iptables應用

   在Linux系統中提供了一個非常優秀的包過濾型防火牆工具—netfilter/iptables。它功能強大、使用靈活、可以對流入和流出的資訊進行細化控制,且可以在一台低配置機器上很好地運作。這裡我們詳細介紹下iptables的規則及其用法。

    Netfilter/iptables最早是與2.4核心版本的Linux系統內建的IP資訊包過濾系統。它由Netfilter和iptables兩個元件組成。

    Netfilter元件稱為核心空間,它內建在Linux的核心中。主要由資訊包過濾表(tables)組成,而表由若幹個鍊組成,每條鍊中可以由一條或者多條規則組成。總的來說,Netfilter是表的容器,表是鍊的容器,而鍊又是規則的容器。

    Netfilter本身并不對資料包進行過濾,而iptables就是在Netfilter之上建立了防火牆功能,iptables就是由一組有序的規則建立起來的,這些規則與包含共同特征的資料包進行比對,根據規則來判定是放行或丢棄。

表(table):主要包含四種表,filter,nat,mangle,raw.

鍊(chain):主要有5種鍊,PREROUTING,INPUT,OUTPUT,FORWORD,POSTROUTING

filter表是iptables預設的表,主要用于資料包的過濾。

它包含的鍊有:

INPUT:處理進入的資料包

FORWORD:處理轉發的資料包

OUTPUT:處理本地生成的資料包

nat表主要用于網絡位址轉換。

它包含的鍊:

PREROUTING:修改即将到來的資料包

OUTPUT:修改在路由之前本地生成的資料包

POSTROUTING:修改即将出去的資料包

mangle表主要用于對指定的包進行修改。

在linux核心2.4.18之後包含了所有的鍊。

獨立于netfilter連接配接跟蹤子系統起作用的規則應用于raw表。

PREROUTING和OUTPUT

具體比對流程如圖:

防火牆基礎及iptables應用

iptables指令的格式:

iptables [-t 表名] -指令 [鍊名] 比對條件 目标動作

iptables [-t table] command CHAIN [NUM ]   match criteria -j TARGET

對鍊(CHAIN)的操作:

-N:建立一條鍊

-X: 删除一條使用者自定義的鍊

-F: 清空一條鍊,預設清空filter中的鍊

-Z:清空計數器,iptables中的每條規則預設有兩個計數器,用于記錄本條規則多比對到的資料包的個數和大小

-P:定義鍊的預設處理政策

-E:重命名一條鍊

對規則的操作:

-A:追加,在鍊的最後追加一條規則

-I:插入,一般使用-I CHAIN num 指插入哪一條

-R:替換某條規則,-R CHAIN num 替換哪一條

-D:删除一條規則,可以指定num來指定删除哪條規則。

檢視規則:

-L:列對外連結中所有的規則

-L還有許多輔助的子指令,可以和它一起使用

-n: 不要對位址和端口做反解,即隻顯示數字位址

-v:顯示詳細資訊,-vv -vvv  v表示詳細程度

-x:顯示計數器的精确值

--line-numbers 顯示規則的行号

比對條件:分2種

1、通用比對

-s  --src,--source 指定比對的源位址

-d  --dst,--destination 指定比對的目标位址

位址的格式:

IP

NETWORK/MASK

位址前加!可以表示取反

-p  {icmp| tcp|udp} 指定協定

-i  資料包的流入接口(INPUT,FORWORD,PREROUTING)

-o   資料包的流出接口(OUTPUT,FORWORD,POSTROUTING)

2、擴充比對:擴充比對中又分為隐式擴充和顯示擴充

1),隐式擴充:是對協定的擴充

-p tcp

--sport PORT[-PORT2] 指定源端口

--dport PORT[-PORT2] 指定目标端口

--tcp-flags {SYN,ACK,URG,RST,PSH,FIN}指定要檢查的位(需要跟2個标志位清單,中用空格隔開)

eg:--tcp-fiags SYN,ACK,RST,FIN  SYN

第一個清單表示要檢查的位,第二個清單該标志位必須為1

--syn :專門比對第一次握手。

-p udp

--sport 指定源端口

--dport 指定位址端口

-p icmp

--icmp-type 指icmp類型

0:echo-reply 指給予回應

8:echo-request 指請求回應

2),顯式擴充:由netfilter擴充子產品引入的擴充,用于比對條件

-m :指定子產品 (隻引用子產品的名稱),子產品在/lib/iptables下

-m state  :用于實作連接配接的狀态檢測

--state 

NEW,通信者發送新的請求狀态

ESTABLISHED,建立連接配接的狀态

RELATED相關聯的,指一個完整的連接配接,需要依賴另一個完整的連接配接

INVALID,非法的,無效的連接配接狀态

-m multiport  

--source-ports port1,port2.. 指定多個源端口

--destination-ports  port1,port2.. 指定多個目标端口

--ports 無論是源還是目标都予以比對

-m limit 用一令牌桶過濾器限定速率(每時間多少個)

--limit 後接速率 (3/second)

--limit-burst num  最大峰值

-m connlimit  限定連接配接并發速率

[!] --connlimit-above num  指定多于num才滿足條件将被拒絕

-m iprange 用于指定連續的位址比對

--src-range ip-ip 源IP的網段

--dst-range ip-ip 目标IP的網段

eg: -m iprange --src-range 172.16.100.1-172.16.100.100

-m mac mac位址的比對

--mac-source XX:XX:XX:XX:XX:XX

隻能用在PREROUTING,INPUT,FORWORD鍊中

-m string 根據一定的模式和一定的政策來比對字元串

--algo bm|kmp 比對算法

--string “pattern” 比對模式

-m recent 動态指定一個ip位址清單,不讓它們比對

--name NAME

--set 把資料包源位址加到指定清單中

--rcheck 同常和--set 一起用

--remove 從清單中釋放

--second 限定時間 和--rcheck/--update一起使用

--hitcount hits 

-m time 基于時間的比對

--datestart 開始日期

--datestop 結束日期

--timestart 開始時間

--timestop 結束時間

--weekdays 周幾

目标動作都有哪些:(TARGET)

ACCEPT 接收

DROP 丢棄

REJECT 拒絕(給予拒絕回應)

REDIRECT 端口重定向

LOG 記錄通路日志

SNAT:

源位址轉換

隐藏内部網絡及其主機

使得衆多内網用戶端能夠使用有限IP位址通路網際網路工作在nat表中的POSTROUTING

-j SNAT

--to-source

DNAT:

目标位址轉換,将内部私有的服務公開給外部,工作在nat表中的PREROUTING 

-j DNAT

--to-destination

PNAT: 端口轉換,在DNAT中将使用者通路的目标端口映射為内網伺服器上的一個不同端口,實作方法隻需要為--to-destination 的目标端口的主機添加':8080'式的端口即可。

PNAT本身并不是一個TARGET

下面舉幾個示例來具體看下iptables的用法:

例1:用iptables指令寫一條規則,限制主機172.16.9.2對外部網絡不能通路,别人也不可以通路該主機 

自己也ping不出去的

在這裡會檢測到别人ping進來的比對的包

例2、從172.16.9.2這台主機出去的已經建立連接配接的資料包都予以放行

例3、在INPUT鍊中插入第一條規則,表示建立立tcp和已經建立tcp連接配接的主機遠端連接配接以及通路172.16.9.2的網頁的都予以放行

例4、從接口eth0請求通路172.16.9.2的主機5分鐘内不超過3次請求的都予以放行,超過3次的都丢棄

例5、在OUTPUT鍊中新增一條規則,表示從172.16.9.2的80端口出去的裡面包含"sex"字元串的資料包予以丢棄

iptables還可以限制很多功能的,可以自己摸索下哦。

下面我們來示範源位址轉換功能:

假設這樣一種場景,假設192.168.10.2是外網的一台WEB伺服器,中間的那台是NAT伺服器,假設有2塊網卡不再同一位址段内,我們在其上面添加iptables規則,可以實作位址轉換的功能,以使172.16.0.2的pc機能夠連接配接通過該伺服器通路到WEB伺服器上來。

防火牆基礎及iptables應用

1、搭建的環境:172.16.9.0 網段使用虛拟網卡的僅主機功能

192.168.10.0網段使用橋接功能

2、設定:PC機的網關設為192.168.10.1,WEB伺服器的網關設為172.16.9.1,打開中間NAT伺服器的轉發功能,PC機就可以通路web伺服器了。

防火牆基礎及iptables應用
防火牆基礎及iptables應用
防火牆基礎及iptables應用
防火牆基礎及iptables應用

這時看下http的通路日志,源位址即是pc機的位址:

tail /var/log/httpd/accecc_log

防火牆基礎及iptables應用

我們在NAT伺服器上添加一條iptables轉換規則:

防火牆基礎及iptables應用

再去通過192.168.10.2通路該WEB伺服器(規則會自動生效的,不用重新開機服務)

防火牆基礎及iptables應用

再次打開通路日志,源位址就會改變的哦:

防火牆基礎及iptables應用

規則裡面就會有通路該伺服器所比對到的包了:

防火牆基礎及iptables應用

我們還可以通過遠端通路下WEB伺服器看下源位址是否改變了。

防火牆基礎及iptables應用

再來看下web伺服器登入的效果:

防火牆基礎及iptables應用

源位址已經改變了~~

這就是我們所說的源位址轉換了,隻需要一條規則即可,很簡單吧。

由于我的電腦性能不好,開了3台虛拟機已經卡的不能工作了,暫時隻給大家提供源位址轉換的操作,目标位址轉換原理和源位址轉換是一樣的,您可以自己動手操作下哦。^_^

 補充:

iptables規則在電腦重新開機後就會消失不見的,如果想要永久儲存規則的話,可以使用 service iptables save 指令,規則就會被儲存在/etc/sysconfig/iptables 檔案中了。

再次用到的時候可以用指令直接恢複即可:

iptables-restore < /etc/sysconfig/iptables

儲存時還可以儲存到指定的檔案中:

iptables-save > /PATH/TO/FILE

iptables-restore < /PATH/TO/FILE

繼續閱讀