iptables詳解

Iptables防火牆介紹:


Iptables是管理Netfilter的唯一工具,Netfilter直接嵌入在Linux內核。他可以爲個人工作站創建一個防火牆,也可以爲一個子網創建防火牆,以保護其他的系統平臺(市場上有很大一部分硬件防火牆也是使用iptables系統的)。
Netfilter在內核中過濾,沒有守護進程,在OSI模型的第2、3、4層插入策略。過濾的速度非常快,因爲他只讀取數據包頭,不會給信息流量增加負擔,也無需進行驗證。
Netfilter提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規則(rules)組成。

實際上netfilter是表的容器,表是鏈的容器,而鏈又是規則的容器。


Netfilter
表和Netfilter鏈:

表說明:
Filter這個表主要執行數據包過濾。
Nat主要進行網絡地址轉換。
Managle用於修改一些特殊的規則。
鏈說明:
PREROUTING路由之前,剛到達的數據包。(nat)
INPUT通過路由,目的地爲本機的數據包。(filter)
FORWARD需要通過本地系統進行轉發的數據包。(filter)
OUTPUT由本機產生,向外轉發,處於POSTROUTING之前的數據包。(nat和filter)
POSTROUTIONG通過路由後,即將離開系統的數據包。(nat)
Netfilter的數據包流程:
Iptables 基本語法:
iptables 內置了filter、nat 和mangle 三張表,我們可以使用-t 參數來設置對哪張表生效,也可以省略-t 參數,則默認對filter 表進行操作。

圖中:這句的意思就是:來自(源地址)192.168.0.1的INPUT鏈的數據包直接丟棄。
Iptables進程服務命令:
service iptables save 保存iptables設置,對iptables規則編輯後一定要保存。
service iptables restart 保存設置以後不重啓則設置不生效,要設置生效請重啓。
service iptables status 檢查iptables的設置。類似於iptable –L命令。
Iptables基本的鏈操作命令:
-L 列出某個鏈或者表中的規則: service iptables status 把這個命令和-L比較下
iptables –L顯示filter表中的規則等同於iptables –t filter -L

iptables –t nat –L 顯示nat表的中的設置:
-F 刪除某個鏈或者表中的規則:
iptables –F (iptables –t filter –F) 刪除filter表中的所有規則;
iptables –t nat –F 刪除nat表中的所有規則;
iptables –t nat –F POSTROUTING 刪除nat表中POSTROUTING鏈的所有規則;

-A添加一條規則(在當前的規則後添加,也就是排在所有規則後):
iptables -A INPUT –s 192.168.0.1 –j DROP
和實例圖中的功能相同,丟棄來自192.168.0.1的數據包,這裏省略了-t filter。
添加該語句後,保存設置並重新啓動iptalbes 服務,並通過-L的命令查看,就會發現剛添加的這條規則排列在所有規則後。
-----------iptables的匹配規則是按順序排列的。
-I在指定位置插入一條規則:
(如果有迴環規則(iptables –A INPUT –I lo –j ACCEPT,則迴環永遠是第一條)
iptables –I <CHAIN> 作爲第一條規則插入。
iptables <CHAIN> X 作爲第X條規則插入,X這裏代表規則順序號。
iptables –A INPUT –p tcp –s 192.168.0.1/24 --dport 22 –jACCEPT大家把這條寫法記住,以後經常會用到。

允許192.168.0.1 通過22端口訪問該主機,把它作爲第一條規則插入iptables規則列表。

-----------iptables的匹配規則是按順序排列的。
-P <CHAIN TARGET>
分配連接策略。
iptables –P INPUT DROP 禁止任何輸入的數據包。這句慎用。
iptables –P OUTPUT ACCEPT 允許所有輸出的數據包。
-D刪除某一條規則:
Iptables –D <CHAIN> X 刪除某個鏈的第幾條規則
iptables –D INPUT 3 刪除INPUT鏈上的第3條規則。
iptables –P INPUT DROP 這個不能使用刪除語句刪除,只能到本機輸入iptables –P INPUT ACCEPT
Iptables中的匹配:
iptables –A INPUT –p tcp –s 192.168.0.1 --dport 22 –jACCEPT
這個命令我們在上面已經看過了,我們來看下其他的一些匹配參數。
-p protocol 匹配網絡協議,例子中匹配tcp協議。
-s IP地址或者網段 匹配源IP地址或者網段
例子中匹配一個IP的,如果要匹配一個網段則如下
-s 192.168.0.0/24
如果是除這個網段之外的所有則爲:! -s 192.168.0.1/24
如果是除這個IP之外的所有則爲! -s 192.168.0.1

--dport X 匹配目的端口號,X代表具體端口號。
--sport X 匹配源端口號,X代表具體端口號。
Iptables中的目的:
我們已經在前面看到過-j 後面跟的就是目的。
ACCEPT允許數據包通過。
DROP直接丟棄數據包。
REJECT丟棄數據包,同時發送響應報文通知對方。
設置Iptables預設規則(本地機防火牆):
1、清除iptables設置:iptables –F
2、設置迴環允許規則,沒有這個規則好多服務不能啓動:
iptables –A INPUT –i lo –j ACCETP允許本地迴環接口
iptables –A INPUT –p tcp --dport 20:21 –j ACCEPT 開放FTP的20、21端口。還記得我們將FTP的時候,如果開啓防火牆。注意!!
iptables –A INPUT –P tcp --dport 80 –j ACCEPT開放http的80端口。
iptables –I INPUT –p tcp –dport 22 –j ACCEPT開放SSH服務的22端口。

4、iptables -A INPUT –j REJECT 禁止進入數據包----慎用該句。
5、iptables -P FORWARD DROP 禁止轉發數據包
6、iptables -P OUTPUT ACCEPT允許外發數據包


設置Iptables FORWORD規則:
一般情況FORWORD鏈式DROP的,但是當用來做NAT的時候我們就需要設置他了。
首先要開啓轉發功能:編輯/etc/sysctl.conf文件
sysctl -p來使修改生效


丟棄壞的TCP包。
#iptables -A FORWARD -p TCP ! --syn -m state --stateNEW -j DROP
處理IP碎片數量,防止***,允許每秒100個。
#iptables -A FORWARD -f -m limit --limit 100/s--limit-burst 100 -j ACCEPT
設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包。
#iptables -A FORWARD -p icmp -m limit --limit 1/s--limit-burst 10 -j ACCEPT
我在前面只所以允許ICMP包通過,就是因爲我在這裏有限制。


NAT服務

(一).什麼是私有地址

私有地址(Private address)屬於非註冊地址,是專門爲組織機構內部使用而劃定的。使用私有IP地址是無法直接連接到Internet的,但是能夠用在公司內部的 Intranet的IP地址上 。

(二).什麼是NAT

NAT是將一個地址域(如專用Intranet)映射到另一個地址域(如Internet)的標準方法。它是一個根據RFC 1631開發的IETF標準,允許一個IP地址域以一個公有IP地址出現在Internet上。NAT可以將內部網絡中的所有節點的地址轉換成一個IP地 址,反之亦然。它也可以應用到防火牆技術裏,把個別IP地址隱藏起來不被外部發現,使外部無法直接訪問內部網絡設備。

NAT的工作原理


1.靜態網絡地址轉換

① 在NAT服務器上建立靜態NAT映射表。

② 當內部主機(IP地址爲192.168.16.10)需要建立一條到Internet的會話連接時,首先將請求發送到NAT服務器上。NAT服務器接收到請求後,會根據接收到的請求數據包檢查NAT映射表。

③ 如果已經爲該地址配置了靜態地址轉換,NAT服務器就使用相對應的公有IP地址,並轉發數據包,否則NAT服務器不對地址進行轉換,直接將數據包丟棄。 NAT服務器使用202.96.128.2來替換內部私有IP(192.168.16.10)

④ Internet上的主機接收到數據包後進行應答(這時主機接收到202.96.128.2的請求)。

⑤ 當NAT服務器接收到來自Internet上的主機的數據包後,檢查NAT映射表。如果NAT映射表存在匹配的映射項,則使用內部私有IP替換數據包的目IP地址,並將數據包轉發給內部主機。如果不存在匹配映射項則將數據包丟棄。

動態網絡地址轉換

① 當內部主機(IP地址爲192.168.16.10)需要建立一條到Internet的會話連接時,首先將請求發送到NAT服務器上。NAT服務器接收到 請求後,根據接收到的請求數據包檢查NAT映射表。

② 如果還沒有爲該內部主機建立地址轉換映射項,NAT服務器就會決定對該地址進行轉換(建立 192.168.16.10:2320←→202.96.128.2:2320的映射項,並記錄會話狀態)。如果已經存在該映射項,則NAT服務器使用該 記錄進行地址轉換,並記錄會話狀態。然後NAT服務器利用轉換後的地址發送數據包到Internet主機上。

③ Internet主機接收到信息後,進行應答,並將應答信息回傳給NAT服務器。

④ 當NAT服務器接收到應答信息後,檢查NAT映射表。如果NAT映射表存在匹配的映射項,則使用內部公有IP替換數據包的目的IP地址,並將數據包轉發給 內部主機。如果不存在匹配映射項則將數據包丟棄。

網絡地址端口轉換

① 當內部主機(IP地址爲192.168.16.10,使用端口1235)需要與Internet上的某主機(IP地址爲202.18.4.6,端口爲 2350)建立連接時,首先將請求發送到NAPT服務器上。NAPT服務器接收到請求後,會根據接收到的請求數據包檢查NAPT映射表。

②如果還沒有爲該內部主機建立地址轉換映射項,NAPT服務器就會爲這個傳輸創建一個Session,並且給這個Session分配一個端口3200,然 後改變這個數據包的源端口爲3200。所以原來的192.168.16.10:1235→202.18.4.6:2350數據包經過轉換後變爲了 202.96.128.2:3200→202.18.4.6:2350。

③ Internet主機接收到信息後進行應答,並將應答信息回傳給NAPT服務器。

④ 當NAPT服務器接收到應答信息後,檢查NAPT映射表。如果NAPT映射表存在匹配的映射項,則使用內部公有IP替換數據包的目的IP地址,並將數據包 轉發給內部主機。如果不存在匹配映射項則將數據包丟棄。

NAT網絡地址轉換:將一個IP轉換成另一個 IP(輸入和輸出)
網絡地址轉換類型:
目的地 NAT(DNAT):DNAT修改包的目的地位址的時機,必須在包即將被送到本機行程之前,或是要被轉送其它電腦之前;所以,使用DNAT爲目標的規則,必須設置於nat表格的PREROUTING鏈結。
源 NAT(SNAT,MASQUERADE):SNAT必須在封包即將離開核心的前一刻,即時修改其來源位址(或通訊端口),所以SNAT規則的設置地點必須是在nat表格的POSTROUTING鏈結。


NAT實例:


1.打開IP轉發

現在我們的IP包已經可以出到廣域網了,但是廣域網上的路由器會丟棄我們內網的IP地址, 所以我們要做nat

好了,開始說到iptables了,要做nat就需要用到iptables的nat表

我們是從裏面到外面的包,所以要修改源IP,就叫做源NAT

我們要出去,就是postrouting


首先需要打開ip_forward


現在我們來配置這條命令

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.8.0/24-j MASQUERADE

或者直接定義到兩個接口

/sbin/iptables -t nat -A POSTROUTING -o "外網卡" -s "內網卡" -jMASQUERADE

我們來講解這條命令

iptables 是命令本身

-t 是執行表,iptables有兩個表,一個是filter:過濾的表

一個是nat,就是NAT表,Network Address Translator

然後-A,-A的意思就是添加一條鏈

這裏添加的鏈是POSTROUTING鏈,就是源NAT

-o 是出去的網卡設備,我們使用的是eth1網卡

-s 是源地址,我們設置內網的192.168.8.0/24網段

-j是動作,MASQUERADE 動態源地址轉換(動態IP的情況下使用)


如果我們使用的靜態外網地址,就可以這樣寫

iptables -t nat -A POSTROUTING -o eth1-jSNAT --to1.1.1.1把出去的地址都轉換成1.1.1.1


好了,現在內網用戶可以通過linux網關上網了


端口重定向

把要進入eth1(eth1連接外網)80端口的數據包,重新定向到192.168.1.3的8080端口。配置squid的時候用到。

iptables -t nat -A PREROUTING -i ethl -p tcp --dport 80 -j DNAT - - to -destination 192.168.1.3:8080

端口映射

那麼內網的WEB服務器如何將數據傳出去呢?這個時候要通過SNAT來實現了。我們用端口映射來實現。

/sbin/iptables -t nat -A PREROUTING -p tcp -d 210.42.201.180 --dport 80 -j DNAT --to 192.168.1.181:80

/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.181 -p tcp --dport 80 -j SNAT--to 192.168.1.1

注:210.42.201.180爲公網IP地址。192.168.1.1是內網的網關。192.168.1.181是內網的web服務器


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章