iptables nat

Linux系統中使用iptables實現nat地址轉換

iptables nat 原理

同filter表一樣,nat表也有三條缺省的"鏈"(chains):

PREROUTING:目的DNAT規則

    把從外來的訪問重定向到其他的機子上,比如內部SERVER,或者DMZ。
    因為路由時只檢查數據包的目的ip地址,所以必須在路由之前就進行目的PREROUTING DNAT;
    系統先PREROUTING DNAT翻譯——>再過濾(FORWARD)——>最后路由。
    路由和過濾(FORWARD)中match 的目的地址,都是針對被PREROUTING DNAT之后的。

POSTROUTING:源SNAT規則

    在路由以后在執行該鏈中的規則。
    系統先路由——>再過濾(FORWARD)——>最后才進行POSTROUTING SNAT地址翻譯
    其match 源地址是翻譯前的。

OUTPUT:定義對本地產生的數據包的目的NAT規則

內網訪問外網 -J SNAT

-j SNAT

    -j SNAT:源網絡地址轉換,SNAT就是重寫包的源IP地址
    SNAT 只能用在nat表的POSTROUTING鏈里
    only valid in the nat table, in the POSTROUTING chain.
    -j SNAT --to-source ipaddr[-ipaddr][:port-port]
    ipaddr:
    a single new source IP address
    range of IP addresses
    or you can add several --to-source options. a simple round-robin takes place between these adresses.
    port range(only valid if the rule also specifies -p tcp or -p udp)
    If no port range is specified, then source ports below 512 will be
    mapped to other ports below 512

-j MASQUERADE

用于外網口public地址是DHCP動態獲取的(如ADSL)
iptables -t nat -A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE MASQUERADE --to-ports port[-port]
only valid if the rule also specifies -p tcp or -p udp.

固定public 地址(外網接口地址)的最基本內訪外SNAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 你的eth0地址 多個內網段SNAT,就是多條SNAT語句即可
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE 非外網口地址為NAT用,必須先要綁定到接口上,如eth0 :1,eth0 :2

外網訪問內網 –J DNAT

    DNAT
    only valid in PREROUTING
    --to-destination ipaddr[-ipaddr][:port-port]
    DNAT:目的網絡地址轉換,重寫包的目的IP地址

典型的DNAT的例子

    外部接口ip:210.83.2.206
    內部接口ip:192.168.1.1 ftp服務器 : ip 192.168.1.3
    web服務器 : ip 192.168.1.4
    iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp --dport 21 -j DNAT --to 192.168.1.3
    iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp --dport 80 -j DNAT --to 192.168.1.4 DNAT靜態映射
IPTABLES沒有CISCO那種static map
DNAT用于內部SERVER的load-balance(即CISCO的rotery)
    iptables –t nat –A PREROUTING –d 219.142.217.161 –j DNAT --to-destination 192.168.1.24-192.168.1.25 DNAT 帶端口映射(改變SERVER的端口)
一個FTP SERVER從內部192.168.100.125:21映射到216.94.87.37:2121的例子
iptables -t nat -A PREROUTING -p tcp -d 216.94.87.37 --dport 2121 -j DNAT --to-destination 192.168.100.125:21 
通常外網DNAT訪問內網SERVER,內網SERV ER回包的源地址是經過另一個單獨的SNAT進程的。而不屬于DNAT STATIC進程的一部分。
這樣對于P-t-P的網絡應用,就必須另設一個和DNAT相適應的SNAT。
對于穿過NAT,被NAT映射改變端口號的應用,也必須用一個單獨的SNAT對回包的端口進行映射
iptables -t nat -A POSTROUTING -p tcp -s 192.168.100.125 --sport 21 -j SNAT --to-source 216.94.87.37:2121 不這樣做的話,FTP SERVER會返回21到外網的客戶機,外網用戶發出一個to 2121的FTP request,收到一個from 21的,會不認

上面的好象不必,做過實驗了:

    /sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22 DNAT照樣要做RULE,DNAT只是翻譯,仍要做ACCEPT。(而且注意是FORWARD,不是INPUT)
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9000 -j ACCEPT
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 22 -j ACCEPT ##########NAT CHAIN###############
    /sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9001 -j DNAT --to-destination 10.4.3.150:9001
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9000 -j DNAT --to-destination 10.4.3.150:9000
    DNAT的FORWARD RULE總是出錯,原來:DNAT RULE是在PREROUTING語句之后執行的,即DNAT RULE要match翻譯過來的新接口號
    一開始按翻譯前的原始接口做RULE,發覺9000和9001都通過,但2022總通不過
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9000 -j ACCEPT
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 2022 -j ACCEPT ##########NAT CHAIN###############
    /sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9001 -j DNAT --to-destination 10.4.3.150:9001
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9000 -j DNAT --to-destination 10.4.3.150:9000
    后來發現原來9000和9001都是端口不變的翻譯,只有2022是由2022到22的翻譯。
    而FORWARD是在PREROUTING執行后執行的,此時2022已經被翻譯成22了,當然不匹配2022那個rule了
    改正:
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9000 -j ACCEPT
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
    /sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 22 -j ACCEPT ==============================NAT troubleshooting===================================

-i ,-o 參數在NAT中的用途

對于PREROUTING鏈,只能用-i,通常是外網口
對于POSTROUTING和OUTPUT,只能用-o,通常也是外網口

linux iptables通常都用外網口地址做NAT public地址
用非外網口的同網段地址做DNAT public地址,失敗
失敗原因是,非外網口地址為DNAT用,必須要綁定到接口上,如eth0 :1,eth0 :2

連續public 地址SNAT (也要先綁定到子接口上eth0:x)

    iptables –t nat –A POSTROUTING –s 192.168.1.0 –j SNAT --to-source 219.142.217.161-219.142.217.166 一段連續的地址,這樣可以實現負載平衡。每個流會被隨機分配一個IP。

不存在所謂的PAT。理由:沒有PAT相關的RFC
PAT是CISCO自己的概念
Linux實現的就是完整的NAT和NAPT(可以進行端口替換,參見RFC3022)
但是端口并沒有bind到本地協議棧上。所以不受本地端口資源65535的限制。

源端口必須>1024

    iptables –t nat –A POSTROUTING -p tcp,udp –s 192.168.1.0 –j SNAT --to-source 219.142.217.161:1024-32000 這樣包的源端口就被限制在1024-32000了

端口轉換限定

iptables –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE --to-ports 1024-30000 只轉換1024以上低于30000的源端口

對于”內網訪問內網SERVER在外網的地址”的特殊處理

    o 網內客戶機10.4.3.119發起一個訪問請求給映射后的地址124.126.86.138(10.4.3.150)
    o 防火墻收到這個向124.126.86.138請求后根據策略表匹配發現是一個對內部服務器10.4.3.150映射,防火墻會通過純路由的方式將數據包轉發給服務器 10.4.3.150
    o 服務器10.4.3.150收到請求后,發現源地址為10.4.3.119的客戶機發來了一個請求,并且這臺主機與自己在同一個網段內,于是直接將回應包SYN+ACK發送給主機10.4.3.119(就不再經過FW)
    o 10.4.3.119收到這個包后會感覺很奇怪,因為它從來就沒有給10.4.3.150發送過連接請求報文(他只給124.126.86.138)發送過,所以就會將回應報文丟棄

解決:增加一個朝向內部網10.4.3.150訪問的POSTROUTING SNAT

    /sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9001 -j DNAT --to-destination 10.4.3.150:9001
    /sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9000 -j DNAT --to-destination 10.4.3.150:9000
    /sbin/iptables -t nat -A POSTROUTING -d 10.4.3.150 -j SNAT --to 10.4.0.198

把發往內部server ip 10.4.3.150的包的源地址改成FW內網口地址10.4.0.198
這樣就能從內部訪問內部SERVER的外部地址 上例的另一種情況:禁止server在內網訪問他自己在外網的公有地址

    iptables -t nat -A PREROUTING -d 219.142.217.161 -j DNAT --to 192.168.1.24
    iptables -t nat -A PREROUTING -d 210.83.2.206 -s ! 192.168.1.24 -p tcp --dport 21 -j DNAT --to 192.168.1.24
    -s !內網SERVER地址 DNAT --to 內網server地址

NAT表刪除 iptables -t nat -F

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容