• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 防火墻軟件Netfilter之NAT技術

    發表于:2007-07-02來源:作者:點擊數: 標簽:
    本文檔主要描述怎樣進行IP偽裝(masquerading)、透明代理(transparent proxying)、端口轉發(port forwarding)和其他形式的 網絡 地址翻譯技術。 1. 什么是網絡地址翻譯NAT(Network Address Translation)? 當一個包在網絡上傳輸時,從它的源地址(例

    本文檔主要描述怎樣進行IP偽裝(masquerading)、透明代理(transparent proxying)、端口轉發(port forwarding)和其他形式的網絡地址翻譯技術。

     

    1. 什么是網絡地址翻譯NAT(Network Address Translation)?

     

    當一個包在網絡上傳輸時,從它的源地址(例如你自己的主機)到達目的地址(例如),中間經過很多節點和網絡。這些節點通常不會改變你的包。他們僅僅轉發你的包。

    如果一個節點執行NAT,他將會修改包的源或目的地址。通常這個節點會記住他怎樣修改了這個包,因此當相應的應答包從另一個方向到達時,他知道如何反向修改這個應答包。

     

    2. 為什么要使用NAT?

     

    l 用modem上網

    大多數的ISPs只給你提供一個IP地址。你可以以任何源地址發出包,但是只有包含這個IP地址的包的應答包才會到達你的網絡。如果你想使用多臺機器(比如有個自己的網絡)利用這個IP地址上網。需要NAT。

    這是NAT使用得最為常見的情況,在linux的世界里稱為IP偽裝(masquerading)。又稱之為SNAT,因為你要改變包的源地址。

    l Multiple Servers

    有時候你想改變到達你的網絡的包的去向。通常因為你只有一個IP地址,但是你又想用戶到達這個真實IP地址之后的各個機器。方法是修改這些包的目的地址,讓他們到達不同的機器。

    還有就是用于負載均衡。這種類型的NAT在linux上叫做端口轉發(port-forwarding)。

    l Transparent Proxying(透明代理)

    透明代理是在你的網絡和外部世界之間的程序,所有的進或出都要經過這個代理。之所以叫做“透明”,因為你的網絡無需考慮他的存在。

    例如,squid軟件能夠配置為透明代理。

     

    3. 兩種類型的NAT

     

    NAT有兩種類型:Source NAT(SNAT)和Destination NAT(DNAT)。

    源NAT是指改變連接的第一個包的源地址。他是在路由之后做,即在包到達網線之前處理。IP偽裝屬于源NAT。

    目的NAT是指改變連接的第一個包的目的地址。他是在路由之前做。端口轉發、負載均衡、透明代理都屬于目的NAT。

     

    4. 僅僅需要IP偽裝

    這是大多數用戶的要求。如果你有一個動態分配IP地址的PPP撥號連接,你僅僅想讓你的內部網絡發出的包發生改變,就像是從這個PPP撥號所分配的IP地址所發出的。如下:

    # Load the NAT module (this pulls in all the others).
    modprobe iptable_nat

     

    # In the NAT table (-t nat), Append a rule (-A) after routing
    # (POSTROUTING) for all packets going out ppp0 (-o ppp0) which says to
    # MASQUERADE the connection (-j MASQUERADE).
    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

     

    # Turn on IP forwarding
    echo 1 > /proc/sys.net/ipv4/ip_forward
    這里假設你沒有做包過濾。

     

    5. 端口轉發

    例如,要將1.2.3.4:8080變為192.168.1.1:80:

    # Append a rule pre-routing (-A PREROUTING) to the NAT table (-t nat) that
    # TCP packets (-p tcp) going to 1.2.3.4 (-d 1.2.3.4) port 8080 (--dport 8080)
    # have their destination mapped (-j DNAT) to 192.168.1.1, port 80
    # (--to 192.168.1.1:80).
    iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080
    -j DNAT --to 192.168.1.1:80
    如果想讓本地網絡的機器適用于上面的規則,例如,本地機telnet 1.2.3.4 8080,就轉變為telnet 192.168.1.1 80??梢栽贠UTPUT chain中插入規則:

    iptables -A OUTPUT -t nat -p tcp -d 1.2.3.4 --dport 8080
    -j DNAT --to 192.168.1.1:80


    6. 控制NAT

    你可以創建NAT規則來告訴內核改變哪些連接,以及怎么改變。同樣,我們使用iptables工具。用選項“-t nat”來表示需要修改NAT表。

    NAT表中包括3個chain:PREROUTING(用于目的NAT)、POSTROUTING(用于源NAT)、OUTPUT(用于本地產生的包的目的NAT)。如下圖:

    _____ _____
    / /
    PREROUTING -->[Routing ]----------------->POSTROUTING----->
    D-NAT/ [Decision] S-NAT/
    | ^
    | __|__
    | /
    | | OUTPUT|
    | D-NAT/
    | ^
    | |
    --------> Local Process ------
    當一個包經過上圖時,檢查它屬于什么樣的連接,如果是新連接,查找NAT表決定做甚。

    7. 使用iptables的簡單選項

    如果iptables作為一個模塊,那么使用前需要insmod ip_tables。

    最重要的選項是“-t”。對于所有的NAT操作,都需要-t nat。第二重要的是“-A”附加一條規則到chain的末尾;或者“-I”在開頭插入一條規則。

    用選項“-s”和“-d”來描述源和目的地址。

    用選項“-i”和“-o”表示in的接口和out的接口。

    用選項“-p”表示協議,例如-p TCP。

    用選項“--sport”和“--dport”表示源和目的端口。

     

    8. 源NAT

    源NAT將連接的源地址改變成不同的地址,他是在POSTROUTING chain中完成。這非常重要,因為路由、包過濾都是在源地址改變之前做的。所以并不影響。

    源NAT用選項“-j SNAT”描述,用“--to-source”來描述IP地址、一個范圍的IP地址或者端口(僅僅用于TCP和UDP)。例如:

    ## Change source addresses to 1.2.3.4.
    # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

     

    ## Change source addresses to 1.2.3.4, 1.2.3.5 or 1.2.3.6
    # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6

     

    ## Change source addresses to 1.2.3.4, ports 1-1023
    # iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023
    特殊情況(IP偽裝):

    有一種特殊的源NAT叫masquerading(前面講過),僅僅用于撥號上網的情況(動態IP)。上面所講的是靜態IP。

    在masquerading中不需要像上面那樣清楚表達,只需要指明正確的網絡接口。例如:

    ## Masquerade everything out ppp0.
    # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

     

    9. 目的NAT

    目的NAT在PREROUTING chain中完成,對于本機的應用程序來說(包括routing、包過濾程序)都忽略目的地址的改變,認為到達真實的目的地址。需要用到“-i”選項。

    目的NAT用“-j DNAT”來表示,用“--to-destination”選項來描述IP地址、IP地址的范圍或者端口。例如:

    ## Change destination addresses to 5.6.7.8
    # iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8

     

    ## Change destination addresses to 5.6.7.8, 5.6.7.9 or 5.6.7.10.
    # iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8-5.6.7.10

     

    ## Change destination addresses of web traffic to 5.6.7.8, port 8080.
    # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1
    -j DNAT --to 5.6.7.8:8080

     

    ## Redirect local packets to 1.2.3.4 to loopback.
    # iptables -t nat -A OUTPUT -d 1.2.3.4 -j DNAT --to 127.0.0.1
    重定向:(Redirection)

    目的地址的一個特例叫做重定向。相當于對進來的包作目的NAT,例如:

    ## Send incoming port-80 web traffic to our squid (transparent) proxy
    # iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80
    -j REDIRECT --to-port 3128


    10.源NAT與路由

    如果你做了源NAT,要注意路由器返回信息時能不能找到你真正的機器。例如,你將自己機器發出的包的源地址改為1.2.3.4,這樣外部路由器將向你發送應答包(目的地址是1.2.3.4)。怎樣到達你的機器?

    如果你變化后的源地址是本地網絡所用的地址,則不需要變化,直接返回到這個地址;

    如果變化后是本地網絡不用的地址,例如,你變成1.2.3.99,一個本地局域網未用的地址,網絡地址1.2.3.0/24,則需要做ARP查詢,有一個簡單的方法是做IP alias,例如:

    # ip address add 1.2.3.99 dev eth0

    如果變成一個完全不同的地址(不屬于本地局域網),必須向路由器發出一條路由信息或者手工加一條路由記錄。

     

    11.目的NAT變目的地址到同一個網絡

    古典的例子內部的職工想訪問你的公共的web server,目的地址從公共地址(1.2.3.4)變成內部地址(192.168.1.1),執行:

    # iptables -t nat -A PREROUTING -d 1.2.3.4
    -p tcp --dport 80 -j DNAT --to 192.168.1.1
    一種方法是運行一個內部的DNS server,他知道公共web server的地址,并且將其他的request請求轉發到外部的DNS server。另一個方法是將源地址映射到自己的連接上,讓web server的返回信息通過他。執行:

    # iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24
    -p tcp --dport 80 -j SNAT --to 192.168.1.250

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>