寬頻分享器另類接線法之狗尾續貂篇



贊助商連結


頁 : [1] 2 3

FYI
2010-08-16, 06:28 AM
這篇討論的目的在於延伸antion 兄的 "寬頻分享器(DI-701)另類接線法--方便取得其餘IP (http://www.pczone.com.tw/thread/16/13611/)", 小弟目前尚在研究階段, 雖明知應該可以用iptables 達成, 但尚未找到簡單可行的方法, 請各方高手一起集思廣益, 在此先說明欲達成的目標和條件:
僅針對PPPoE 用戶
數據機具有四個網路埠
路由器採用開放韌體, 例如OpenWrt, DD-WRT & Tomato
其實這是個老問題了, 有些網友買了AP 之後, 發現網路埠仍然不夠用, 雖然僅缺少1-2 個埠, 但還是得花錢添購交換器或無線網卡, 然而數據機可能還有2-3 個網路埠空著沒用, 用了的話, 網芳又成問題:

M LAN4─PC7/MOD?
o LAN3─PC6?
d LAN2─PC5?
e LAN1═╗
m    ║
  WAN ═╝
  LAN1─PC1
A LAN2─PC2
P LAN3─PC3
  LAN4─PC4
針對PPPoE 用戶, 小弟通常會建議採用antion 兄所提的方法, 增加一條網路線連接數據機和路由器:

M LAN4─PC5
o LAN3─PC4
d LAN2──┐
e LAN1─┐│
m    ││
  WAN ─┘│
  LAN1──┘
A LAN2─PC1
P LAN3─PC2
  LAN4─PC3
以下適用於Modem 和AP 之間只有一條網路線:

M LAN4─PC5
o LAN3─PC4
d LAN2─PC3
e LAN1──┐
m     │
  WAN ─┐│
  LAN1─┘│
A LAN2──┘
P LAN3─PC1
  LAN4─PC2
然而從以上可看出, 多一條網路線就得浪費兩個網路埠, 導致最多只能多出一個網路埠, 若用戶有申請MOD, 那就等於做白工, 此外並非每一種路由器都可以如此連接, 因此以上方法就變得非常不切實際

另一個應用則是針對只有一個網路埠的AP 而言, 例如La Fonera, ASUS WL-330gE, WL-HDD2.5 等, 按照過去的做法, 如果網路埠已經連接數據機的話, 那麼這幾種路由器就只能透過無線連接, 但是如果新的做法可行的話, 那麼不需額外設備就可以多出三個網路埠以供運用:

M LAN4─PC3/MOD?
o LAN3─PC2?
d LAN2─PC1?
e LAN1═╗
m    ║
AP WAN ═╝
在此必須特別提出的是即使新的做法可行, 那麼傳輸瓶頸將會發生於Modem 到AP 之間 (雙線框代表PPPoE Frame & IPv4/IPv6 Frame), 例如從連接Modem 的PC 大量存取AP 上的網芳, 此時可能會影響網際網路的連線, 因為原先AP 的WAN Port 不但要連線網際網路, 也要橋接內部區域網路, 而橋接是屬於硬體式的, 所以無法以AP 的QoS 控管

在繼續討論之前, 小弟先就自己很粗淺的瞭解, 簡要說明一下技術可行的原理, PPPoE 是把PPP 協定封裝於Ethernet II Frame 之中, 而Linux 把PPP 視為一個虛擬的介面, 有別於一般所熟知的WAN/LAN/VLAN 等實體介面, 因此以iptables 處理et0/br0/vlan0/ppp0 等實體和虛擬介面就變成非常容易, 另一個關鍵是IPv4/IPv6 Frame 和PPPoE Frame 可以並存於同一個實體介面 (例如WAN), 不會混淆, 舉例來說如同Windows PPPoE 連線和區域連線並存一樣, 只需要一片網路卡, PPPoE 連線所取得的IP 不同於區域連線的IP, 兩者各自獨立, 互不影響, 既然Windows 可以辦到, 當然Linux 更沒有問題, 但問題在於路由器的韌體雖然也是基於Linux, 但設計上並未考慮到單一網路埠既可以跑PPPoE, 又可以連接區域網路, 這也是小弟以DD-WRT 實驗所遇到的困境, 對於DD-WRT 來說, PPPoE 和WAN Port 相關, 而WAN Port 又和實體網路埠相關, 小弟懷疑WAN Port 決定之後, LAN Port 也就被決定, 而DD-WRT 不允許WAN & LAN 共用同一實體網路埠 (例如vlan0), 所以小弟目前卡在明知應該把實體WAN & LAN1-4 結合成為一個VLAN (vlan0), 但卻不知道該把WAN 指定為什麼介面 (WAN Port Assignment), 才不會導致無法連線DD-WRT?

從以下敘述看來:

Iptables command - DD-WRT Wiki (http://www.dd-wrt.com/wiki/index.php/Iptables_command)

vlan1 is the WAN port (ppp0 is the WAN interface when PPPoE is used)
vlan1 (WAN) 唯一的作用可能只有pppd 的設定檔會參考到, 所以在vlan1 上面應該只會有PPPoE 封包, 而沒有IPv4 封包, 而且執行 "iptables -vnL" 可以確定ppp0/br0 分別代表WAN/LAN, 實際上是不需要vlan1 的, 所以重點也許是如何讓pppd 連接vlan0:

root@DD-WRT:~# ps
PID USER VSZ STAT COMMAND
279 root 1596 S pppd file /tmp/ppp/options.pppoe
280 root 1184 S /tmp/ppp/redial 30

root@DD-WRT:~# cat /tmp/ppp/options.pppoe
plugin /usr/lib/rp-pppoe.so
nic-vlan1
有一個也許可行的變通辦法是把vlan1 (WAN) 加入br0 (LAN+WIFI), 但br0 是一個虛擬的橋接器, 到時候Modem 上的PC 存取AP 上的網芳都必須經過br0, 是否會造成AP's CPU 的負擔? 小弟對此還不是很有把握

暫時先談到這裡, 等有進一步的結果再來報告

Point-to-Point Protocol over Ethernet - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/Point-to-Point_Protocol_over_Ethernet)
EtherType - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/EtherType)

贊助商連結


FYI
2010-08-17, 12:50 PM
以下以Belkin F5D7230-4 v1444 刷DD-WRT v24-preSP2 micro-plus 版 (http://www.pczone.com.tw/thread/44/143252/)實做, 文章寫於實做成功之後, 以下指令目的在於調整VLAN:

root@DD-WRT:~# nvram show | grep vlan | sort
size: 19323 bytes (13445 left)
dtag_vlan8=0
lan_ifnames=vlan0 eth1 eth2 eth3
port0vlans=1 (PS: VLANs -> Port W = Physical WAN Port)
port1vlans=0
port2vlans=0
port3vlans=0
port4vlans=0
port5vlans=0 1 16 (PS: 包含vlan0 & vlan1)
pppoe_ifname=vlan1
pppoe_wan_ifname=vlan1
vlan0_bridged=1
vlan0hwname=et0
vlan0ports=0 1 2 3 5* (PS: vlan0 = LAN)
vlan1hwname=et0
vlan1ports=4 5 (PS: vlan1 = WAN)
vlans=0
wan_default=vlan1
wan_ifname2=vlan1
wan_ifname=vlan1
wan_ifnames=vlan1
wl0_vlan_prio_mode=off
root@DD-WRT:~# nvram set vlan0ports="0 1 2 3 4 5*"
root@DD-WRT:~# nvram set vlan1ports=5
root@DD-WRT:~# nvram set port0vlans=0
root@DD-WRT:~# nvram set port5vlans=0 16
root@DD-WRT:~# nvram commit
然後開啟DD-WRT Setup -> Networking (http://192.168.1.1/Networking.asp) -> Port Setup -> WAN Port Assignment -> br0 -> Apply Settings -> 請重新啟動DD-WRT

root@DD-WRT:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
1xx.xx.xx.xxx * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
169.254.0.0 * 255.255.0.0 U 0 0 0 br0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default hxxx.sxx.xx.xxx 0.0.0.0 UG 0 0 0 ppp0
root@DD-WRT:~# cat /tmp/ppp/options.pppoe
plugin /usr/lib/rp-pppoe.so
nic-br0
請留意網路線可任意連接, 由於已經把路由器的WAN & LAN1-4 合併成為一個 "5-port Switch", 所以不限定只能連接路由器的WAN Port, 唯一要注意的是路由器的LAN IP 請避開192.168.1.1, 因為很有可能被數據機佔用

嚴格來說WAN Port 應該改為vlan0 (有線網路) 較佳, 然而由於會導致vlan0 脫離br0 (可能和DD-WRT 的設計邏輯有關), 不得已只好選擇br0, 小弟測試時並未啟用無線, 所以不知有何影響, 或許有高手知道如何替vlan0 建立一個別名

以上把WAN & LAN1-4 合併成為一個VLAN (vlan0), 而vlan1 則廢棄不用, DD-WRT WebGUI 無法刪除vlan1, 但從ifconfig 來看, vlan1 已經不存在, 小弟原先一直往VLAN Trunking 方向尋找答案, 實際上是不瞭解VLAN Trunking 所需條件, 因而浪費不少時間, 其實#1 已經分析出WAN (PPPoE) & LAN (IPv4/IPv6) 各跑不同協定, 所以不需要以VLAN 切割, 也不需要802.1q, 剩下的問題就是如何以DD-WRT WebGUI 完成小弟所要達到的功能, 由於DD-WRT 的VLANs 網頁還有一些臭蟲, 所以部份工作還是得靠下指令完成, 此外並非每一種DD-WRT 所支援的路由器都可以支援VLAN, 而OpenWrt Kamikaze 以後也已經不再使用NVRAM, 有興趣者請自行研究

VLAN Detached Networks (Separate Networks With Internet) - DD-WRT Wiki (http://www.dd-wrt.com/wiki/index.php/VLAN_Detached_Networks_%28Separate_Networks_With_Internet%29)
Switched Ports - DD-WRT Wiki (http://www.dd-wrt.com/wiki/index.php/Switched_Ports)
DD-WRT Forum :: View topic - HOWTO: Two networks on single port (FON, w/o VLANs) (http://www.dd-wrt.com/phpBB2/viewtopic.php?t=38087)
VLAN and bridging concepts - OpenWrt Wiki (http://wiki.openwrt.org/oldwiki/OpenWrtDocs/NetworkInterfaces)
Network configuration - OpenWrt Wiki (http://wiki.openwrt.org/doc/uci/network)
OpenWrt / Mixed tagged untagged packets in VLAN trunk (https://forum.openwrt.org/viewtopic.php?id=5087)
OpenWrt / Several VLans one one port?! (https://forum.openwrt.org/viewtopic.php?id=4904)
WHR-G54S & DD-WRT - TipsterNet (http://www.tipsternet.com/articles/dd-wrt_buffalo.html)

tvirus
2010-08-17, 02:26 PM
訂閱ing

雖然我只有Fon PLUS...

FYI
2010-08-17, 03:13 PM
雖然我只有Fon PLUS...
你嘛休息夠久了吧! 小弟的Fonera+ 已經改刷OpenWrt, 所以DD-WRT 就交給你, 而小弟繼續研究OpenWrt, 這樣夠意思了吧!

話說這麼一來也就順便解決了少數網友把PC 接於數據機, 結果和路由器之下的PC 不在同一網段的問題

tvirus
2010-08-17, 03:34 PM
你嘛休息夠久了吧! 小弟的Fonera+ 已經改刷OpenWrt, 所以DD-WRT 就交給你, 而小弟繼續研究OpenWrt, 這樣夠意思了吧!

話說這麼一來也就順便解決了少數網友把PC 接於數據機, 結果和路由器之下的PC 不在同一網段的問題
我的Fonera+只拿來當成無線Switch Hub在用而已(Bridge)
反正Seednet有DHCP可用

tvirus
2010-08-18, 12:31 PM
其實
我印象中
之前FON改DD-WRT有出現個很怪的狀況...
單Port的FON,改了DD-WRT後,某次實驗無意中發現
在小烏龜下的電腦,竟然查得到DD-WRT這個DHCP Server...
明明DHCP應該只對br0,竟然WAN端的電腦也拿得到NAT的IP...
也就是...這個很怪的狀況,偏偏是你想要的結果 :Q
So?
通通歸成br0,管它WAN,LAN,WLAN :P

dmwc
2010-08-18, 01:16 PM
在小烏龜下的電腦,竟然查得到DD-WRT這個DHCP Server...
明明DHCP應該只對br0,竟然WAN端的電腦也拿得到NAT的IP...
也就是...這個很怪的狀況,偏偏是你想要的結果 :Q
So?
通通歸成br0,管它WAN,LAN,WLAN :P
我也有遇到,他的網路孔同時當 WAN 和 LAN

FYI
2010-08-21, 03:51 AM
Fonera+ 刷Gargoyle v1.3.4 (OpenWrt Backfire 10.03) 的初步測試結果, 內建ppp-mod-pppoe 似乎無法任意選擇ifname, 預設為eth0.2 (Kamikaze 為eth0.1), 改成br-lan 則無法建立連線 (pppoe-wan), 有可能小弟沒能搞懂br-lan 和pppoe-wan 的先後順序, 如果先照預設建立pppoe-wan, 再把eth0.2 加入br-lan, 則會導致pppoe-wan 中斷, 比較理想的方式是先建立br-lan 橋接eth0.1 & eth0.2, 再執行/usr/sbin/pppd, 可是小弟尚未弄懂pppd 參數是否如下:

/usr/sbin/pppd plugin rp-pppoe.so mtu 1492 mru 1492 nic-eth0.2
其後安裝rp-pppoe-client 套件, 修改/etc/ppp/pppoe.conf & /etc/ppp/pap-secrets (格式 = 帳號 * 密碼 *), 成功建立連線ppp0 並且可以選擇br-lan, 但必須自行修改Firewall Script, 或自行設法把pppoe-wan 都置換成ppp0, 小弟功力尚淺, 所以只能當作參考, 下一步還是回頭研究pppd 指令參數

root@OpenWrt:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
xxx.xx.xx.xxx * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 br-lan
default * 0.0.0.0 U 0 0 0 ppp0

Fonera+ 網路介面:

LAN : eth0.1 (Kamikaze eth0.0)
WAN : eth0.2 (Kamikaze eth0.1)
WLAN: ath0
br-lan: ath0 & eth0.1

FYI
2010-08-22, 07:04 AM
終於搞定Gargoyle v1.3.4 on Fonera+, 以下文章完成於實做成功之後, 但還不是很完美, 只能算是Work-around

稍微把ppp-mod-pppoe 和rp-pppoe-client 的行為差異搞懂了, 不過以下只是小弟瞎猜的, ppp-mod-pppoe 會把綁定網路埠的IP 移除, 若該網路埠屬於橋接器之一, 則從橋接器中移除, 而rp-pppoe-client 只會把新的IP 指定給ppp0, 以下是執行 "ifup wan" 和 "logread | grep ppp" 的結果:

Aug 22 04:00:29 OpenWrt daemon.info pppd[1560]: Plugin rp-pppoe.so loaded.
Aug 22 04:00:29 OpenWrt daemon.notice pppd[1560]: pppd 2.4.4 started by root, uid 0
Aug 22 04:00:29 OpenWrt daemon.info pppd[1560]: PPP session is 10069
Aug 22 04:00:29 OpenWrt daemon.info pppd[1560]: Renamed ppp0 to pppoe-wan
Aug 22 04:00:29 OpenWrt daemon.info pppd[1560]: Using interface pppoe-wan
Aug 22 04:00:29 OpenWrt daemon.notice pppd[1560]: Connect: pppoe-wan <--> br-lan
Aug 22 04:00:30 OpenWrt daemon.notice pppd[1560]: PAP authentication succeeded
以下是執行 "/etc/init.d/pppoe-client start" 和 "logread | grep ppp" 的結果:

Aug 22 04:03:56 OpenWrt daemon.notice pppd[1662]: pppd 2.4.4 started by root, uid 0
Aug 22 04:03:56 OpenWrt daemon.info pppd[1662]: Using interface ppp0
Aug 22 04:03:16 OpenWrt daemon.notice pppd[1627]: Connect: ppp0 <--> /dev/pts/0
Aug 22 04:03:56 OpenWrt daemon.debug pppoe[1667]: PADS: Service-Name: ''
Aug 22 04:03:56 OpenWrt daemon.info pppoe[1667]: PPP session is 6482 (0x1952)
Aug 22 04:03:57 OpenWrt daemon.warn pppd[1662]: Warning - secret file /etc/ppp/pap-secrets has world and/or group access
Aug 22 04:03:57 OpenWrt daemon.warn pppd[1662]: Warning - secret file /etc/ppp/pap-secrets has world and/or group access
Aug 22 04:03:58 OpenWrt daemon.notice pppd[1662]: PAP authentication succeeded
既然知道ppp-mod-pppoe 會把綁定網路埠的IP 移除, 那就加回來就是了, 以下是Fonera+ (FON2201) 的 /etc/config/network:

config 'interface' 'loopback'
option 'ifname' 'lo'
option 'proto' 'static'
option 'ipaddr' '127.0.0.1'
option 'netmask' '255.0.0.0'

config 'interface' 'lan'
option 'type' 'bridge'
option 'ifname' 'eth0.1 eth0.2'
option 'proto' 'static'
option 'netmask' '255.255.255.0'
option 'ipaddr' '192.168.1.254'

config 'interface' 'wan'
option 'ifname' 'br-lan'
option 'proto' 'pppoe'
option 'username' '[email protected]'
option 'password' 'PASSWORD'
option 'keepalive' '3'
option 'ppp_redial' 'persist'
option 'persist'
先於重啟之後執行 "route"

root@OpenWrt:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 br-lan
可見pppd 並未執行, 於是執行 "ifup wan ; route"

root@OpenWrt:/# ifup wan ; route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
xxx.xx.xx.xxx * 255.255.255.255 UH 0 0 0 pppoe-wan
default * 0.0.0.0 U 0 0 0 pppoe-wan
pppd 終於成功, 但br-lan 卻不見了, 於是再執行 "ifconfig br-lan 192.168.1.254 netmask 255.255.255.0 ; route"

root@OpenWrt:/# ifconfig br-lan 192.168.1.254 netmask 255.255.255.0 ; route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
xxx.xx.xx.xxx * 255.255.255.255 UH 0 0 0 pppoe-wan
192.168.1.0 * 255.255.255.0 U 0 0 0 br-lan
default * 0.0.0.0 U 0 0 0 pppoe-wan
最後檢查橋接器是否正確, 以免功虧一簣:

root@OpenWrt:/# brctl show
bridge name bridge id STP enabled interfaces
br-lan 8000.001884aabbcc no ath0
eth0.1
eth0.2
既然看起來都沒問題了, 剩下的就是找個地方存放Startup Script, 例如 /etc/init.d/custom-user-startup:

#!/bin/sh /etc/rc.common
START=98
start() {
ifup wan
ifconfig br-lan 192.168.1.254 netmask 255.255.255.0
}
輸入完畢請執行:

chmod +x /etc/init.d/custom-user-startup
/etc/init.d/custom-user-startup enable
/etc/init.d/custom-user-startup start
以上指令會產生 /etc/rc.d/S98custom-user-startup

La Fonera (FON2100 & FON2200) 應該只需把以上 "eth0.1 eth0.2" 改成 "eth0" 即可套用

此外pppd 指令應該看起來像是:

/usr/sbin/pppd plugin rp-pppoe.so mtu 1492 mru 1492 nic-br-lan persist usepeerdns defaultroute replacedefaultroute user [email protected] password PASSWORD unit 0 linkname wan ipparam wan

OpenWrt / pppoe with kamikaze (https://forum.openwrt.org/viewtopic.php?id=16173)
OpenWrt / lan and wan on one ethernet port with vlan (https://forum.openwrt.org/viewtopic.php?id=24717)
pppd(8): Point-to-Point Protocol Daemon - Linux man page (http://linux.die.net/man/8/pppd)

FYI
2010-08-23, 04:01 AM
稍微把ppp-mod-pppoe 和rp-pppoe-client 的行為差異搞懂了, 不過以下只是小弟瞎猜的, ppp-mod-pppoe 會把綁定網路埠的IP 移除
從以下dmesg 或許可以看出ifup wan 的影響:

br-lan: port 3(ath0) entering disabled state
br-lan: port 2(eth0.2) entering disabled state
br-lan: port 1(eth0.1) entering disabled state
br-lan: port 3(ath0) entering forwarding state
br-lan: port 2(eth0.2) entering forwarding state
br-lan: port 1(eth0.1) entering forwarding state
由於把wan 的網路埠設為br-lan, 所以啟用wan 就會先停止br-lan, 再啟用br-lan, 可能就在最後一個網路埠 (eth0.1) 被停用時, br-lan 完全被移除, 所以IP 也被清除, 因此基於wan 和br-lan 的相互影響, 才必須要以旁門左道解決, 而另一個更保險, 避免Fonera 變磚的做法就是在 /etc/config/network 增加:

#In case you brick your router
config 'alias'
option 'interface' 'wan'
option 'proto' 'static'
option 'ipaddr' '169.254.255.254'
option 'netmask' '255.255.0.0'
不管原先wan 設於哪個網路埠, wan alias 都會於wan 啟用之後生效, 那麼至少就多一個方法登入分享器, 這尤其對於ASUS WL-HDD2.5 等缺少RS232 介面的路由器更是至為重要, 由於小弟剛才把ASUS WL-HDD2.5 變磚了, 又沒有預留任何退路, 不得已才想出這個自保的方法, 但現在為時已晚, 只剩下Firmware Restoration 一途了

請留意小弟把wan alias IP 設為 "169.254.0.0/16", 這是被保留的IP, 所以可以安全地使用於wan, 此外事實上wan 所對應的介面是br-lan:

root@OpenWrt:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
xxx.xx.xx.xxx * 255.255.255.255 UH 0 0 0 pppoe-wan
192.168.1.0 * 255.255.255.0 U 0 0 0 br-lan
169.254.0.0 * 255.255.0.0 U 0 0 0 br-lan
default * 0.0.0.0 U 0 0 0 pppoe-wan
因此從網際網路是無法存取wan alias 的, 請放心設定

不過正規解決之道應該還是找出為何啟動時ppp-mod-pppoe 沒作用的原因, 可能得另找時間研究 "sh -x /etc/init.d/network restart" 和 "sh -x /sbin/ifup wan" 兩者之間的差異

最後請留意 "169.254.0.0/16" 的設定, 如果區網內有DD-WRT 路由器的話, DD-WRT 預設也會建立br0:0 IP 169.254.255.1, 小弟不確定最後一位數是否和DD-WRT's 預設LAN IP 192.168.1.1 對應, 所以保險起見, 小弟會把這兩個IP 的最後一位數設為相同, 以免重複