天天看點

static stateless 2-way NAT on Linux with iptables的應用執行個體

前面幾天,我完成了一個static stateless 2-way NAT,寫了幾篇文章,但是着重于理論分析,本文來展示一個應用執行個體。在具體展示執行個體之前,先說一個static stateless 2-way NAT和Linux原生conntrack NAT的差別,static stateless 2-way NAT并不會限制連接配接的數量,因為它不用維護連接配接狀态,也就沒有了最大值的限制,其次,如果static stateless 2-way NAT的算法更好些,它的效率會更高。在哈爾濱長春旅遊的那些天,我曾經想過,能不能用這種stateless的方式實作一個NAPT呢?後來覺得很難, 因為在TCP/IP協定層面,一個特定的連接配接中的5元組是不能發生變化的(UDP協定視情況而定),這就要求NAPT在完成5元組唯一性映射的時候需要識 别出一個連接配接,這就不再是stateless了,而是stateful了,一個例子就可以說明這種情況,假設連接配接A的資料包a的5元組被映射到了 {sip-1,dip-1,tcp,sport-1,dport-1},此後這個連接配接斷開了,問題是如果過去很久以後又有相同5元組的TCP連接配接來到怎麼 辦呢?解決這個問題的辦法就是為一個entry維護一個timer,這樣...這樣還不如直接用conntrack NAT呢....

       首先給出一個簡單的拓撲圖:

<client>eth0:192.168.10.1

|

eth0:192.168.10.254

<FWD>[NAT BOX]

eth1:192.168.184.254

eth0:192.168.184.1

<FWD>                            

eth1:192.168.1.1

<server>eth0:192.168.1.8

在上面簡單的拓撲中,我希望的是在client可以拉取1.2.1.2上的網頁,而1.2.1.2是映射到server上的,此外,端口由12345映射到80。這個映射是完全無狀态的,用我的static stateless 2-way NAT來完成。

       在我還沒有做好iptables接口之前,我使用procfs檔案系統接口,那個時候還沒有dev支援,指令如下:

echo '+1.2.1.2 192.168.1.8 dst tcp port-map 12345 80 ' >/proc/net/static_nat 

echo '+192.168.184.250 192.168.184.154 src tcp' >/proc/net/static_nat

後來有了更為友善的iptables接口,事情起了變化,我可以用熟悉的iptables指令來配置了,依然在nat表配置規則:

root@abcd:~# iptables-save 

# Generated by iptables-save v1.4.21 on Sun Dec 28 03:23:22 2014

*nat

:PREROUTING ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [1484:204554]

-A PREROUTING -j STATIC-2-WAY-NAT --mapaddr 192.168.184.250-192.168.184.154 --type src --proto all --mapport 0-0 --dev eth1

-A POSTROUTING -j STATIC-2-WAY-NAT --mapaddr 1.2.1.2-192.168.1.8 --type dst --proto tcp --mapport 12345-80 --dev eth0

COMMIT

# Completed on Sun Dec 28 03:23:22 2014

root@abcd:~# 

除了可以完成配置之外,我保留了一個統計資訊,可以看出有多少個資料包以及多少個位元組經曆了NAT。統計資訊的檢視方式如下:

root@abcd:~# cat /proc/net/static_nat Source trans table:

From:192.168.184.250 To:192.168.184.154    [ALL STATIC] [eth1] [Bytes:1080  Packet:23]

From:192.168.1.8     To:1.2.1.2            [TCP AUTO] Port map[From:80    To:12345] [eth0] [Bytes:124  Packet:3]

Destination trans table:

From:1.2.1.2         To:192.168.1.8        [TCP STATIC] Port map[From:12345 To:80   ] [eth0] [Bytes:180  Packet:4]

From:192.168.184.154 To:192.168.184.250    [ALL AUTO] [eth1] [Bytes:5348  Packet:90]

展示統計資訊的粒度是很重要的,當然,如果能表示都有哪些資料包經曆了NAT并可以列印資料包的超級詳細資訊,那是再好不過的了,但是那樣會損失大量的時間和空間,是以隻能求取舍了。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1598622

繼續閱讀