有時候,你僅僅有一個IP位址,然而卻有多台裝置,比如公司配發的電腦,自己的筆記本電腦,手機,iPad等,顯然公司配發的電腦将是你的這個IP的第一優先占有者,其它的裝置将無法接入。如果你手上有一個帶有WIFI子產品的Linux BOX,你可能會想到建立二級路由,然而此時你的那台公司配發的機器就會被隐藏在這個BOX後面,如果你的BOX在WAN口做了基于狀态的MASQURADE位址轉換,那麼所有針對你的被隐藏的工作機的主動通路都将不可能,除非你配置複雜的DNAT規則或者路由規則。
現在,事情不同了,你可以将這個唯一的IP位址配置在你的工作機上的同時,也可以讓所有的其它裝置使用。
現在假設你的BOX有三個網口,分别是兩個以太口:eth0,eth1以及一個WIFI口:wlan0,下面是一系列的操作:
你擁有的唯一IP及其配套配置:
位址:192.168.10.79/24
網關:192.168.10.1
1.橋接所有這些口
brctl addbf br0
brctl addif br0 eth0
brctl addif br0 eth1
brctl addif br0 wlan0
2.為br0配置一個IP位址供WIFI使用(省略DHCP POOL以及DNS的配置過程)
接入裝置數量限制一下:
ifconfig br0 172.20.1.1/28
3.可選1:為br0增加一個Secondary IP以便成功增加預設路由
ifconfig br0:0 192.168.10.255/23
注意,以上的prefix 23值得說明一下,原始的子網的掩碼是255.255.255.0,現将prefix減少1位,此時你就可以使用原始網絡中的broadcast位址作為一個IP位址了,這個位址不會和任何位址沖突。
route add default gw 192.168.10.1
4.可選2:使用force-onlink路由直接強制增加路由
ip route add 0.0.0.0/0 via 192.168.10.1 dev br0 onlink
5.增加位址轉換規則,凡是WIFI包的源位址都轉換成你唯一的那個IP位址
iptables -t mangle -A PREROUTING -m physdev --physdev-in wlan0 -j MARK --set-mark 100
iptables -t nat -A POSTROUTING -m mark --mark 100 -j SNAT --to-source 192.168.10.79
6.可選2的情況下增加arp
由于使用了force-onlink路由,意味着你的BOX上沒有和192.168.10.0/24處于同網段的IP位址,那麼當往192.168.10.1這個預設網關發包的時候,ARP請求将可能得不到回複,這涉及到預設網關的arp_filter或者等價配置的配置情況,因為arp請求的源是唯一的172.20.1.1這個位址,請求的是位址和它不在一個網段!
是以需要一條arptables規則:
arptables -t mangle -A OUTPUT -d 192.168.10.1 -j mangle --mangle-ip-s 192.168.10.79
事實上在可選1的情況下,你配置了一個192.168.10.255這個位址,對于原始網段來講,它是一個廣播,但是對于BOX來講,它是一個正常IP,是以ARP請求可以發出,封裝的源就是192.168.10.255,也可以正常回來,因為請求中的源是192.168.10.255,到達預設網關192.168.10.1後,與其掩碼255.255.255.0相與得到192.168.10.0/24,顯然屬于同一個網段,檢查通過,REPLY傳回!
整個BOX對于你的工作機就是一個HUB,它的工作毫不受到影響!另外BOX上的WIFI獨自引出了一個子網,可以讓多個裝置接入,當這些裝置發出的資料包外出時,BOX會将其源IP位址轉換為你那唯一的IP位址,ip_conntrack機制可以保證所有的這些裝置相關的流的五元組不會重複。
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1268835