Linux ARP代理 與 NAT

tycoon1988發表於2014-11-04

Linux系統預設並沒有開啟IP轉發功能,要確認IP轉發功能的狀態,可以檢視/proc檔案系統,使用下面命令:

cat /proc/sys/net/ipv4/ip_forward

如果上述檔案中的值為0,說明禁止進行IP轉發;如果是1,則說明IP轉發功能已經開啟。

要想開啟IP轉發功能,可以直接修改上述檔案:

echo 1 > /proc/sys/net/ipv4/ip_forward

把檔案的內容由0修改為1。禁用IP轉發則把1改為0。

上面的命令並沒有儲存對IP轉發配置的更改,下次系統啟動時仍會使用原來的值,要想永久修改IP轉發,需要修改/etc/sysctl.conf檔案,修改下面一行的值:

net.ipv4.ip_forward = 1

修改後可以重啟系統來使修改生效,也可以執行下面的命令來使修改生效:

sysctl -p /etc/sysctl.conf

進行了上面的配置後,IP轉發功能就永久使能了

有時候我們會在一個已有網路(10.10.10.0/24)內組建一個實驗網路(192.168.1.0/24),網路結構如上圖所示。

假設我們不能控制(修改)A網路內除D主機以外的系統配置,但可以完全控制網路B內的主機。

此時Server D實際上要承擔一個路由的角色(它有兩張網路卡分別在兩個網路A,B內)

所以先開啟其上的核心路由轉發功能,修改/etc/sysctl.conf中的如下配置

net.ipv4.ip_forward = 1

儲存後應用檢視

1
2
# sysctl -p
net.ipv4.ip_forward = 1

另外需要保證Server D上的路由表配置正確,這裡我們假設D上10.10.10.103所在的介面為eth0, 而192.168.1.1所在的介面為eth1

最後將網路B內的主機的預設閘道器都設定為Server D的192.168.1.1地址,到此準備工作已經完成。下面可以採用不同的方法來使得網路B和網路A中的主機實現不同程度的互聯。

SNAT

如果想讓B網路內的所有主機單向訪問A網路內的資源可以在Server D上做一個NAT(SNAT):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

這種方法就是最常用的NAT,內部網路B中的主機可以主動發起請求訪問的外網A中的資源,實現內外網主機通訊,但是外網A內的主機無法主動與內網主機建立連線。內網B中的主機沒有A網內的獨立IP。

如果只想讓某臺B網中的主機訪問A網,則可以限定來源IP,具體可以參考iptables手冊:

iptables -t nat -A POSTROUTING -s 192.168.100.100 -o eth0 -j MASQUERADE

SNAT + DNAT + ARP代理 = 浮動IP

如果我們想為網路B內的Server E分配一個IP如10.10.10.104(A網路的地址),使得網路A內的主機可以直接訪問主機E

此時我們可以在Server D上先做一個SNAT:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.100(E在B網內的地址) -j SNAT --to-source 10.10.10.104

這樣網路A網路收到Server E發出的包時,看到的IP就是10.10.10.104,其響應也會回發給這個地址

然後我們在Server D(閘道器)上做一個DNAT:

iptables -t nat -A PREROUTING -i eth0 -d 10.10.10.104 -j DNAT --to-destination 192.168.1.100

這樣Server D收到目的IP為10.10.10.104的包時就會修改目的IP為網路B內的Server E的IP(192.168.1.100),自然的按照Server D上的路由規則這個包會從介面eth1出去,經過交換機B,到達Server E。

現在還存在一個問題,我們不能修改網路A內的主機配置,怎麼做才能讓IP為10.10.10.104的包發到Server D來(因為主機D自己的IP是10.10.10.103)。如果我們自Server D上再插入一張網路卡,讓後將其地址設為10.10.10.104就可以,不過我們沒有必要這麼做。我們在主機D的eth0介面上加入一個次級地址即可

ip addr add 10.10.10.104/24 dev eth0

這樣網路A內的主機在使用ARP協議查詢10.10.10.104所對應的MAC地址時,Server D就能做出響應,傳送一個虛擬的MAC地址,於是發往10.10.10.104的包就會到達主機D,在進行上述的DNAT步驟,兩邊就可以互通了。

服務埠對映 SNAT + DNAT

浮動IP的方案需要佔用一個網路A的IP,且會完全暴露主機E,有時可以通過埠對映向外部網路A暴露網路B內的服務,如將Server D上的2222埠與Server E上的22埠建立對映,這樣網路A內的主機訪問10.10.10.103:2222實際就是訪問網路B內的主機192.168.100:22。



相關文章