① 用一個實例深入理解iptables的SNAT/DNAT
文中對於數據包的分析,是本文的核心中的核心, 望讀者細讀!
這是我前幾天遇到的一個實際問題:
我在實驗室的伺服器(物理機)上啟動了一個虛擬機, 虛擬機通過網橋連接了伺服器的一個網卡從加入到伺服器所在的 內部互連網段 .
這個時候我希望通過訪問伺服器的指定埠, 來連接虛擬機, 注意我們訪問伺服器使用的是另一個網卡, 與虛擬機並不在同一個網段!
顯然這需要配置DNAT, 但是配置後連接被拒絕, 百思不得解之後在知乎提問:
iptables 配置DNAT連接ssh ,為什麼仍然提示埠拒絕
非常感謝
@Virtual @gongjunhe @染紅了的楓葉林 三位同志的指點, 現將所學奉上.
我的個人主機, IP為:
物理機伺服器, IP為:
虛擬機, IP為:
可以看到H1和H2的em2在同一網段, H3和H2的em1在同一網段
即:
注意:
在下面的截圖中,
filter表的默認Target都是Accept;
nat表沒有建立任何規則;
Linux的路由轉發確保是打開狀態.
我們的目標是, 通過H2的11122埠訪問H3的22埠,即:
配置如下規則:
此時我們在H2上進行測試:
此時在H1上進行測試:
一個是拒絕連接, 一個是超時,這是為什麼呢?
我們看下面這個圖, 如果數據從H2上發送, 那麼將會經過OUTPUT和POSTROUTING兩個鏈,但是我們的DNAT規則其實是配置在PREOUTING中的,因此我們從H2上訪問,實際上並沒有進行地址轉換,因此連接被拒絕!
因此我們在OUTPUT中再配置一個看看:
再嘗試ssh連接:
我們發現和H1一樣, 超時了,很好! WHY?
我們分別列印,H2和H1連接H3的時候, H3上的抓包情況:
H2鏈接時:
H1連接時:
說明H3的的確收到了來自H1和H2的連接請求.
這是因為什麼呢?
因為H1和H2的數據包發送到H3, H3想返回數據,但是發現數據發不出去,因為源地址不可達!
以H1為例:
經過上述過程, 就完成了一次通訊!
但是問題出在了第三步,那就是H3沒辦法將數據包發送到H2中, 因為目的地址其實是
也即,這是H1的地址,因此即使是H3可以路由到H1(在我的機器上的確是這樣的),那麼也無法完成上述的環路!
怎麼辦呢?
我們需要將包的源地址,進行SNAT轉化,將其修改為H2的地址從而幫助完成環路:
看看,此時是否成功:
H1:
[圖片上傳失敗...(image-eb2b58-1636597174011)]
H2:
解決問題!
那麼此時完整的環路是怎樣的呢?
還是以H1為例:
上述過程, 用梁耀湘的話說,那就是: 暢通無阻
我們來分析一下, 為什麼H2不做SNAT, 也無法成功呢?
前面提到, 想要完成迴路,H2必須要接收到來自H3的包, 雖然我上面的拓撲沒有畫, 但是其實H3是可以訪問到H2.
但是依然不行, 這個是因為H3回到H2的包源地址和目標地址必須是確定的,這樣才能根據DNAT的記錄去恢復原來的地址.
但是H3訪問H2其實也是通過SNAT轉發, 這樣回到H2的時候, 源地址其實已經改變了,因此依然無法完成迴路.
那麼如果H3可以直接把數據給到H2,是不是就不用SNAT了呢?是的!
但是我們要用H2另一個網段, 即
我們分析下環路:
這個關鍵的過程由於兩者在同一網段,是可以輕松實現的.
那麼這種情況下是不需要進行SNAT的.當然了,這種配置是沒有價值的!
② iptables參數詳解
iptables [-t table] COMMAND chain CRETIRIA -j ACTION
處理動作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些處理動作不會中斷過濾程序,某些處理動作則會中斷同一規則鏈的過濾,並依照前述流程繼續進行下一個規則鏈的過濾,一直到堆棧中的規則檢查完畢為止。透過這種機制所帶來的好處是,我們可以進行復雜、多重的封包過濾,簡單的說,iptables 可以進行縱橫交錯式的過濾(tables)而非鏈狀過濾(chains)。
③ 基礎知識Iptables
鏈是放在表中的,總共有四個表,每個表有不同的優化級:raw>mangle >nat> filter
是自1.2.9以後版本的iptables新增的表,主要用於決定數據包是否被狀態跟蹤機制處理,一般在高並發時有可能會用到,來設置一些連接不跟蹤狀態,防止ip_conntrack文件被撐爆
很少用
主要用於修改數據包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存周期)指以及為數據包設置Mark標記,可以實現分流功能
很少用
主要用於修改數據包的IP地址、埠號等信息(網路地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT),一般在作為網關伺服器上會用到,搭建過openvpn的話,肯定會用到。
主要用於對數據包進行過濾,有DROP、ACCEPT、REJECT、LOG等,默認的規則是添加到filter表
當數據包到達這些位置的時候會調用這些函數,在這些位置上我們可以對數據包的內容進行修改,達到控制的目的,這5個掛載點分別是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。也就是我們常說的五條鏈。
每個表中都有對應的鏈,因此有個優先順序,會以高優先順序為准
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [ -j 控制類型]
命令格式
iptables [-t 表名 ] [-A |-I |-R] <鏈名><控制類型>
命令格式
iptables [-t 表名 ] -D <鏈名><控制類型> 或者 iptables [-t 表名 ] -D <鏈名> [id]
命令格式 iptlables [-t 表名 ] -P <鏈名><控制類型>
一般不會設置
iptables [-t 表名] -F [鏈名]
在vpn搭建過程中要替換掉虛擬ip的網段,就要用到SNAT,因為安全組中會校驗ip,所以這個是關鍵
條件
demo
④ iptables的簡單使用方法
mangle表的主要功能是根據規則修改數據包的一些標志位,以便其他規則或程序可以利用這種標志對數據包進行過濾或策略路由。
定義允許或者不允許的
iptables -t filter -A INPUT -j DROP -p tcp --dport 8081
過濾發往本機的8081埠的所有包被丟棄
用途:網路地址轉換;修改目的埠或目的地址以及原地址
iptables -t nat -A PREROUTING -p tcp --dport 7788 -j DNAT --to 192.168.0.11:7799
iptables -t nat -A POSTROUTE -p tcp -d 192.168.0.11 --dport 7799 -j SNAT --to 192.168.0.12
1. 「四表」 是指,iptables的功能——filter, nat, mangle, raw.
filter, 控制數據包是否允許進出及轉發(INPUT、OUTPUT、FORWARD),可以控制的鏈路有input, forward, output
nat, 控制數據包中地址轉換,可以控制的鏈路有prerouting, input, output, postrouting
mangle,修改數據包中的原數據,可以控制的鏈路有prerouting, input, forward, output, postrouting
raw,控制nat表中連接追蹤機制的啟用狀況,可以控制的鏈路有prerouting, output
註:在centos7中,還有security表,不過這里不作介紹
2. 「五鏈」 是指內核中控制網路的NetFilter定義的五個規則鏈,分別為
PREROUTING, 路由前
INPUT, 數據包流入口
FORWARD, 轉發管卡
OUTPUT, 數據包出口
POSTROUTING, 路由後
3 .堵通策略 是指對數據包所做的操作,一般有兩種操作——「通(ACCEPT)」、「堵(DROP)」,還有一種操作很常見REJECT.
談談REJECT和DROP之間的區別,Ming寫了一封信,向Rose示愛。Rose如果不願意接受,她可以不回應Ming,這個時候Ming不確定Rose是否接到了信;Rose也可以同樣寫一封信,在信中明確地拒絕Ming。前一種操作就如同執行了DROP操作,而後一種操作就如同REJECT操作。
4.iptables命令的語法規則
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
-t table,是指操作的表,filter、nat、mangle或raw, 默認使用filter
COMMAND,子命令,定義對規則的管理
chain, 指明鏈路
CRETIRIA, 匹配的條件或標准
ACTION,操作動作
例如,不允許10.8.0.0/16網路對80/tcp埠進行訪問,
iptables -t filter -A INPUT -s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 -j DROP
查看iptables列表
iptables -nL
5.鏈管理
-N, --new-chain chain:新建一個自定義的規則鏈;
-X, --delete-chain [chain]:刪除用戶自定義的引用計數為0的空鏈;
-F, --flush [chain]:清空指定的規則鏈上的規則;
-E, --rename-chain old-chain new-chain:重命名鏈;
-Z, --zero [chain [rulenum]]:置零計數器;
-P, --policy chain target, 設置鏈路的默認策略
6.規則管理
-A, --append chain rule-specification:追加新規則於指定鏈的尾部;
-I, --insert chain [rulenum] rule-specification:插入新規則於指定鏈的指定位置,默認為首部;
-R, --replace chain rulenum rule-specification:替換指定的規則為新的規則;
-D, --delete chain rulenum:根據規則編號刪除規則;
7.查看規則
-L, --list [chain]:列出規則;
-v, --verbose:詳細信息;
-vv, -vvv 更加詳細的信息
-n, --numeric:數字格式顯示主機地址和埠號;
-x, --exact:顯示計數器的精確值;
--line-numbers:列出規則時,顯示其在鏈上的相應的編號;
-S, --list-rules [chain]:顯示指定鏈的所有規則;
查看規則的一般內容:
⑤ iptables(一)鏈、表的簡介和表的基本操作
PREROUTING鏈——對數據包作路由選擇前應用此鏈中的規則(所有的數據包進來的時侯都先由這個鏈處理)
INPUT鏈——進來的數據包應用此規則鏈中的策略
OUTPUT鏈——外出的數據包應用此規則鏈中的策略
FORWARD鏈——轉發數據包時應用此規則鏈中的策略
POSTROUTING鏈——對數據包作路由選擇後應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
filter表——用於存放所有與防火牆相關操作的默認表。通常用於過濾數據包。
nat表——用於網路地址轉換
mangle表——用於處理數據包
raw表——用於配置數據包,raw 中的數據包不會被系統跟蹤。
PREROUTING: raw -> mangle -> nat
INPUT: mangle -> filter
FORWARD: mangle -> filter
OUTPUT: raw -> mangle -> nat -> filter
POSTROUTING: mangle -> nat
raw 表:PREROUTING,OUTPUT
mangle表:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表:PREROUTING,OUTPUT,POSTROUTING
filter 表:INPUT,FORWARD,OUTPUT
ACCEPT: 允許數據包通過
DROP:直接丟棄數據包,不給任何回應信息
REJECT:拒絕數據包通過,需要時會給數據發送端一個相應信息
SNAT:原地址轉換,解決內網用戶用同一個公網地址上網的問題
MASQUERADE:是 SNAT 的一種特殊形式,適用於動態的、臨時會變的 ip 上
DNAT:目標地址轉換
REDIRECT:在本機做埠映射
LOG:在/var/log/messages 文件中記錄日誌信息。然後將數據包傳遞給下一條規則。也就是只記錄不做任何操作。
示例:
比如,我想要將主動連接22號埠的報文的相關信息都記錄到日誌中,並且把這類記錄命名為"want-in-from-port-22",則可以使用如下命令
如果公網IP是動態獲取的,不是固定的,則可以使用MASQUERADE進行動態的SNAT操作。
查看錶中規則 iptables -t table_name -L [chain_name]
示例:
上面示例可以看到有哪些鏈是支持過濾的
在不指定表時默認查詢 filter 表 iptables -L [chain_name] (注意大小寫)
示例:
示例:
這個時候在192.168.55.132這個主機上 ping 測試機是不通的。此時在表的首部在添加一個允許的操作
這個時候在192.168.55.132這個主機上 ping 測試機發現可以 ping 通
所以規則的順序很重要
示例:
示例:
關於鏈默認規則說明
不能省略 -s 如果省略效果如下
source 變為0.0.0.0/0 表示所有網段都被 ACCEPT
示例
默認情況下添加的規則都是臨時的,當重啟 iptables 或者重啟系統時規則將丟失
示例:
⑥ 哪位大哥知道iptables -t 是干什麼的 謝謝
iptables -t 這個是指定表的,
默認你要是不加這個選項的話是用的 filter這張表
如iptables -A INPUT -p tcp --dport 22 -j ACCEPT默認就加到filter這個表裡
如iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 202.96.134.130:80 這個就是載入到nat這張表內
iptables的4個表,5個鏈:
4個表:filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)。表的處理優先順序:raw>mangle>nat>filter。
filter:一般的過濾功能
nat:用於nat功能(埠映射,地址映射等)
mangle:用於對特定數據包的修改
raw:有限級最高,設置raw時一般是為了不再讓iptables做數據包的鏈接跟蹤處理,提高性能
5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:數據包進入路由表之前
INPUT:通過路由表後目的地為本機
FORWARDING:通過路由表後,目的地不為本機
OUTPUT:由本機產生,向外轉發
POSTROUTIONG:發送到網卡介面之前。
⑦ IPTABLES 詳解
引言
先來看一條常用的iptables命令:
Iptables(-t filter) -I INPUT -p tcp --dport ssh/22 -j ACCEPT
這一條命令,生成了一條規則。允許所有22埠的TCP連接。
這條規則作用表是filter表,即iptables默認表。作用鏈是INPUT鏈。
規則就是網路管理員預定義的條件,規則一般的定義為「如果數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作就是添加、修改和刪除這些規則。
原理
Iptables通過對數據包的控制實現防火牆功能,看下圖:
數據包進入機器後,要根據數據包信息對數據包進行相關處理
(1) 一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉發出去。
(2) 如果數據包就是進入本機的,它就會沿著圖方向移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經 過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
(3)如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示方向移動,經過 FORWARD鏈,然後到達POSTROUTING鏈輸出。
鏈(chains)是規則校驗序列及數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。
iptables -P INPUT (DROP|ACCEPT)默認是關的/默認是開的
該命令設置鏈的默認目標,即策略。所有與鏈中任何規則都不匹配的信息包都將被強制使用此鏈的策略
表(tables)是相同規則集合,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網路地址轉換、包重構(修改)和數據跟蹤處理四種不同的功能。
3、規則表之間的優先順序:
Raw——mangle——nat——filter
每個表包含的數據鏈不同,在進行處理的時候注意需求,要在哪一鏈上操作。
(1)RAW表
只使用在PREROUTING鏈和OUTPUT鏈上,因為優先順序最高,從而可以對收到的數據包在連接跟蹤前進行處理。一但用戶使用了RAW表,在 某個鏈上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即不再做地址轉換和數據包的鏈接跟蹤處理了.
RAW表可以應用在那些不需要做nat的情況下,以提高性能。如大量訪問的web伺服器,可以讓80埠不再讓iptables做數據包的鏈接跟蹤處理,以提高用戶的訪問速度。
(2)mangle表
主要用於對指定數據包進行更改,在內核版本2.4.18 後的linux版本中該表包含的鏈為:INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),PREROUTING鏈(修改即將到來的數據包)
(3)nat表
主要用於網路地址轉換NAT,該表可以實現一對一,一對多,多對多等NAT 工作,iptables就是使用該表實現共享上網的,由於轉換的特性,需進行目的地網址轉換的數據包,就不需要進行來源網址轉換,反之亦然,因此為了提升改寫封包的效率,在防火牆運作時,每個封包只會經過這個規則表一次。如果我們把數據包過濾的規則定義在這個數據表裡,將會造成無法對同一包進行多次比對,因此這個規則表除了作網址轉換外,請不要做其它用途。NAT表包含了PREROUTING鏈(修改即將到來的數據包),POSTROUTING鏈(修改即將出去的數據包),OUTPUT鏈(修改路由之前本地生成的數據包)
(4)filter表
主要用於過濾數據包,該表根據系統管理員預定義的一組規則過濾符合條件的數據包。對於防火牆而言,主要利用在filter表中指定的規則來實現對數據包的過濾。Filter表是默認的表,如果沒有指定哪個表,iptables 就默認使用filter表來執行所有命令,filter表包含了INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)在filter表中只能允許對數據包進行接受,丟棄的操作,而無法對數據包進行更改
命令
iptables [-t 表] -命令 匹配 操作
-A是append命令,添加的規則在最後
-D是刪除命令,刪除第幾條規則
-I是插入命令,添加的規則在第一條
!是取反操作
Sport 是源埠
Dport 是目的埠
列出各個表的規則命令:
iptables -nvL
iptables -t nat -nvL
iptables -t mangle -nvL
iptables -t raw -nvL
iptables -t filter -nvL
iptables -t raw -A PREROUTING -s 182.50.124.75 -j ACCEPT
REJECT 攔阻該數據包,並返回數據包通知對方,可以返回的數據包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個數據包包會要求對方關閉聯機),進行完此處理動作後,將不再比對其它規則,直接中斷過濾程序。 範例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
DROP 丟棄數據包不予處理,進行完此處理動作後,將不再比對其它規則,直接中斷過濾程序。
REDIRECT 將封包重新導向到另一個埠(PNAT),進行完此處理動作後,將會繼續比對其它規則。這個功能可以用來實作透明代理 或用來保護web 伺服器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
MASQUERADE 改寫封包來源IP為防火牆的IP,可以指定port 對應的范圍,進行完此處理動作後,直接跳往下一個規則鏈(mangle:postrouting)。這個功能與 SNAT 略有不同,當進行IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網卡直接讀取,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP伺服器指派的,這個時候 MASQUERADE 特別有用。範例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
LOG 將數據包相關信息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 配置文件,進行完此處理動作後,將會繼續比對其它規則。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
SNAT 改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作後,將直接跳往下一個規則煉(mangle:postrouting)。範例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT 改寫數據包包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作後,將會直接跳往下一個規則鏈(filter:input 或 filter:forward)。範例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR 鏡像數據包,也就是將來源 IP與目的地IP對調後,將數據包返回,進行完此處理動作後,將會中斷過濾程序。
QUEUE 中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發的處理程序,可以進行其它應用,例如:計算聯機費用.......等。
RETURN 結束在目前規則鏈中的過濾程序,返回主規則鏈繼續過濾,如果把自訂規則煉看成是一個子程序,那麼這個動作,就相當於提早結束子程序並返回到主程序中。
MARK 將封包標上某個代號,以便提供作為後續過濾的條件判斷依據,進行完此處理動作後,將會繼續比對其它規則。範例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
保存規則
使用iptables程序建立的規則只會保存在內存中,通常我們在修改了iptables的規則重啟 iptables 後,之前修改的規則又消失了。那麼如何保存新建立的規則呢?
方法1、對於RHEL和ceontos系統可以使用service iptables save將當前內存中的規則保存到 /etc/sysconfig/iptables 文件中
[root@lampbo ~]# service iptables save
方法2、修改/etc/sysconfig/iptables-config 將裡面的IPTABLES_SAVE_ON_STOP="no", 這一句的"no"改為"yes"這樣每次服務在停止之前會自動將現有的規則保存在 /etc/sysconfig/iptables 這個文件中去。
加入開機啟動項
chkconfig --level 345 iptables on
UBUNTU系統
沒有上述東西,只能使用保存命令保存當前規則。
重啟的就用自啟動腳本載入已經保存的規則。
/etc/network/interfaces腳本自動應用
auto eth0 iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules post-down iptables-save > /etc/iptables.up.rules
iptables --save
https://wangchujiang.com/linux-command/c/iptables.html#%E5%90%AF%E5%8A%A8%E7%BD%91%E7%BB%9C%E8%BD%AC%E5%8F%91%E8%A7%84%E5%88%99
其他問題
ip_conntrack: table full, dropping packet的問題
在啟用了iptables web伺服器上,流量高的時候經常會出現下面的錯誤:
ip_conntrack: table full, dropping packet
這個問題的原因是由於web伺服器收到了大量的連接,在啟用了iptables的情況下,iptables會把所有的連接都做鏈接跟蹤處理,這樣iptables就會有一個鏈接跟蹤表,當這個表滿的時候,就會出現上面的錯誤。iptables的鏈接跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,鏈接碰到各種狀態的超時後就會從表中刪除。所以解決方法一般有兩個:(1)加大 ip_conntrack_max 值vi /etc/sysctl.confnet.ipv4.ip_conntrack_max = 393216net.ipv4.netfilter.ip_conntrack_max = 393216(2):降低 ip_conntrack timeout時間vi /etc/sysctl.confnet.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120上面兩種方法打個比喻就是燒水水開的時候,換一個大鍋。一般情況下都可以解決問題,但是在極端情況下,還是不夠用,怎麼辦?這樣就得反其道而行,用釜底抽薪的辦法。iptables的raw表是不做數據包的鏈接跟蹤處理的,我們就把那些連接量非常大的鏈接加入到iptables raw表。如一台web伺服器可以這樣:iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACKiptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
使用注意事項
在默認鏈規則是accept的情況下,規則最後要加drop或reject,否則相當於沒加規則
一般先添加允許自己IP的所有數據包的規則,否則添加drop規則後會被屏蔽
⑧ linux下iptables的nat關於SNAT和DNAT轉發實驗
一、概述 1. 什麼是NAT 在傳統的標準的TCP/IP通信過程中,所有的路由器僅僅是充當一個中間人的角色,也就是通常所說的存儲轉發,路由器並不會對轉發的數據包進行修改,更為確切的說,除了將源MAC學校換成自己的MAC學校以外,路由器不會對轉發的數據包做任何修改。NAT(Network Address Translation中國絡學校翻譯)恰恰是出於某種特殊需要而對數據包的源ip學校、目的ip學校、源埠、目的埠進行改寫的操作。 2. 為什麼要進行NAT 我們來看看再什麼情況下我們需要做NAT。 假設有一家ISP提供園區Internet接入服務,為了方便管理,該ISP分配給園區用戶的IP學校都是偽IP,但是部分用戶要求建立自己的WWW伺服器對外發布信息,這時候我們就可以通過NAT來提供這種服務了。我們可以在防火牆的外部中國卡上綁定多個合法IP學校,然後通過NAT技術使發給其中某一個IP學校的包轉發至內部某一用戶的WWW伺服器上,然後再將該內部WWW伺服器響應包偽裝成該合法IP發出的包。 再比如使用撥號上中國的中國吧,因為只有一個合法的IP學校,必須採用某種手段讓其他機器也可以上中國,通常是採用 中國伺服器的方式,但是中國伺服器,尤其是應用層中國伺服器,只能支持有限的協議,如果過了一段時間後又有新的服務出來,則只能等待中國伺服器支持該新應用的升級版本。如果採用NAT來解決這個問題, 因為是在應用層以下進行處理,NAT不但可以獲得很高的訪問速度,而且可以無縫的支持任何新的服務或應用。 還有一個方面的應用就是重定向,也就是當接收到一個包後,不是轉發這個包,而是將其重定向到系統上的某一個應用程序。最常見的應用就是和squid配合使用成為透明中國,在對http流量進行緩存的同時,可以提供對Internet的無縫訪問。 3. NAT的類型 在linux2.4的NAT-HOWTO中,作者從原理的角度將NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是改變轉發數據包的源學校,所謂DNAT就是改變轉發數據包的目的學校。 二、原理 在「用iptales實現包過慮型防火牆」一文中我們說過,netfilter是Linux 核心中一個通用架構,它提供了一系列的"表"(tables),每個表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數條規則(rule)組成。並且系統預設的表是"filter"。但是在使用NAT的時候,我們所使用的表不再是"filter",而是"nat"表,所以我們必須使用"-t nat"選項來顯式地指明這一點。因為系統預設的表是"filter",所以在使用filter功能時,我們沒有必要顯式的指明"-t filter"。 同filter表一樣,nat表也有三條預設的"鏈"(chains),這三條鏈也是規則的容器,它們分別是: PREROUTING:可以在這里定義進行目的NAT的規則,因為路由器進行路由時只檢查數據包的目的ip學校,所以為了使數據包得以正確路由,我們必須在路由之前就進行目的NAT; POSTROUTING:可以在這里定義進行源NAT的規則,系統在決定了數據包的路由以後在執行該鏈中的規則。 OUTPUT:定義對本地產生的數據包的目的NAT規則。 三、操作語法 如前所述,在使用iptables的NAT功能時,我們必須在每一條規則中使用"-t nat"顯示的指明使用nat表。然後使用以下的選項: 1. 對規則的操作 加入(append) 一個新規則到一個鏈 (-A)的最後。 在鏈內某個位置插入(insert) 一個新規則(-I),通常是插在最前面。 在鏈內某個位置替換(replace) 一條規則 (-R)。 在鏈內某個位置刪除(delete) 一條規則 (-D)。 刪除(delete) 鏈內第一條規則 (-D)。 2. 指定源學校和目的學校 通過--source/--src/-s來指定源學校(這里的/表示或者的意思,下同),通過--destination/--dst/-s來指定目的學校。可以使用以下四中方法來指定ip學校: a. 使用完整的域名,如「至美.linuxaid中國中國」; b. 使用ip學校,如「192.168.1.1」; c. 用x.x.x.x/x.x.x.x指定一個中國絡學校,如「192.168.1.0/255.255.255.0」; d. 用x.x.x.x/x指定一個中國絡學校,如「192.168.1.0/24」這里的24表明了子中國掩碼的有效位數,這是 UNIX環境中通常使用的表示方法。 預設的子中國掩碼數是32,也就是說指定192.168.1.1等效於192.168.1.1/32。 3. 指定中國絡介面 可以使用--in-interface/-i或--out-interface/-o來指定中國絡介面。從NAT的原理可以看出,對於PREROUTING鏈,我們只能用-i指定進來的中國絡介面;而對於POSTROUTING和OUTPUT我們只能用-o指定出去的中國絡介面。 4. 指定協議及埠 可以通過--protocol/-p選項來指定協議,如果是udp和tcp協議,還可--source-port/--sport和 --destination-port/--dport來指明埠。 四、准備工作 1. 編譯內核,編譯時選中以下選項,具體可參看「用iptales實現包過慮型防火牆」一文: Full NAT MASQUERADE target support REDIRECT target support 2. 要使用NAT表時,必須首先載入相關模塊: modprobe ip_tables modprobe ip_nat_ftp iptable_nat 模塊會在運行時自動載入。 五、使用實例 1. 源NAT(SNAT) 比如,更改所有來自192.168.1.0/24的數據包的源ip學校為1.2.3.4: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4 這里需要注意的是,系統在路由及過慮等處理直到數據包要被送出時才進行SNAT。 有一種SNAT的特殊情況是ip欺騙,也就是所謂的Masquerading,通常建議在使用撥號上中國的時候使用,或者說在合法ip學校不固定的情況下使用。比如 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 可以看出,這時候我們沒有必要顯式的指定源ip學校等信息。 2. 目的SNAT(DNAT) 比如,更改所有來自192.168.1.0/24的數據包的目的ip學校為1.2.3.4: iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4 這里需要注意的是,系統是先進行DNAT,然後才進行路由及過慮等操作。 有一種DNAT的特殊情況是重定向,也就是所謂的Redirection,這時候就相當於將符合條件的數據包的目的ip學校改為數據包進入系統時的中國絡介面的ip學校。通常是在與squid配置形成透明中國時使用,假設squid的監聽埠是3128,我們可以通過以下語句來將來自192.168.1.0/24,目的埠為80的數據包重定向到squid監聽 埠: iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-port 3128 六、綜合例子 1. 使用撥號帶動局域中國上中國 小型企業、中國吧等多使用撥號中國絡上中國,通常可能使用中國,但是考慮到成本、對協議的支持等因素,建議使用ip欺騙方式帶動區域中國上中國。 成功升級內核後安裝iptables,然後執行以下腳本: #載入相關模塊 modprobe ip_tables modprobe ip_nat_ftp #進行ip偽裝 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 2. ip映射 假設有一家ISP提供園區Internet接入服務,為了方便管理,該ISP分配給園區用戶的IP學校都是偽IP,但是部分用戶要求建立自己的WWW伺服器對外發布信息。我們可以再防火牆的外部中國卡上綁定多個合法IP學校,然後通過ip映射使發給其中某一個IP學校的包轉發至內部某一用戶的WWW伺服器上,然後再將該內部WWW伺服器響應包偽裝成該合法IP發出的包。 我們假設以下情景: 該ISP分配給A單位至美伺服器的ip為: 偽ip:192.168.1.100 真實ip:202.110.123.100 該ISP分配給B單位至美伺服器的ip為: 偽ip:192.168.1.200 真實ip:202.110.123.200 linux防火牆的ip學校分別為: 內中國介面eth1:192.168.1.1 外中國介面eth0:202.110.123.1 然後我們將分配給A、B單位的真實ip綁定到防火牆的外中國介面,以root許可權執行以下命令: ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0 ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0 成功升級內核後安裝iptables,然後執行以下腳本: #載入相關模塊 modprobe ip_tables modprobe ip_nat_ftp 首先,對防火牆接收到的目的ip為202.110.123.100和202.110.123.200的所有數據包進行目的NAT(DNAT): iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100 iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200 其次,對防火牆接收到的源ip學校為192.168.1.100和192.168.1.200的數據包進行源NAT(SNAT): iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100 iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200 這樣,所有目的ip為202.110.123.100和202.110.123.200的數據包都將分別被轉發給192.168.1.100和192.168.1.200;而所有來自192.168.1.100和192.168.1.200的數據包都將分 別被偽裝成由202.110.123.100和202.110.123.200,從而也就實現了ip映
⑨ 防火牆iptables的包過濾的基本流程
簡單地說來,就是設定一些規則,自對進來和出去的數據包的ip做檢查,符合規則的通行,不符合的做響應的處理,要了解這個流程中的三個表:
nat表,filter表,mangle表,
五條鏈:INPUT鏈,OUTPUT鏈,FORWARD鏈,PREROUTING鏈,POSTROUTING鏈。
1)對於進來的包:經過IP校驗後,經過第一條鏈PREROUTING處理,一般是做DNAT;然後經過路由,決定是到本地的還是需要轉發的包。
a、如果是到本地的,就經過INPUT鏈處理,比如過濾等,經過處理後發往上層協議。
b、如果是需要轉發的,經過FORWARD鏈處理,一般是做過濾,然後經過路由代碼,再經過POSTROUTING鏈處理(主要是做SNAT),再傳輸到網路上。
2)對於本地產生的包:先經過OUTPUT鏈處理,若過濾可以後,進行路由選擇處理,然後經過POSTROUTING做SNAT處理後發送到網路上。
大概的原理就是這樣,啰啰嗦嗦一對不如去看看netfilter網站,講得更清楚一些。