OpenWRT和DD-WRT一起上,VLAN解決家裡的IPTV問題

寫這篇記錄是因為被DD-WRT的文檔坑了一晚上,把心得寫出來供有類似需要的人參考。

我家裡的網路拓樸是這樣:

(圖是用ditaa.sourceforge.net/生成的,非常方便)

  • 光貓: 電信的華為HG8120C EPON。雙乙太網口,一個供WAN(internet)用,一個供IPTV用
  • Netgear WNDR3700v4: 某東上299特價時入的,刷了DD-WRT,主路由,PPPoE撥號,DHCP server,二樓的wifi接入覆蓋。
    • WAN口連到光貓的internet網口
    • 一個LAN口連到光貓的IPTV網口
    • 一個LAN口連到客廳的TPLink WR1041N
    • 其餘LAN口接PC等等
  • TPLink WR1041N: 刷的OpenWRT,客廳的wifi覆蓋和LAN接入。
    • 一個LAN口接到WNDR3700v4
    • 一個LAN接電信的IPTV機頂盒
    • 其餘LAN口接NAS,電視和小米盒子
    • 數一數是不是有五個LAN口?因為我只需要WR1041N作為純粹的千兆交換機和無線AP,所以在OpenWRT里把WAN口也配置成普通的LAN口了。

關於我家這個略為奇葩的配置,在我另一篇blog《終於解決IPTV影響wifi性能的問題》里有提到過,只是設備稍有變化。IPTV機頂盒本來需要單獨一根網線連光貓,但從光貓到客廳只有一條千兆網線,我又不想用無線橋接或者電力貓,所以IPTV和客廳的其他網路設備必須共用一條網線。

因為我們這裡電信的IPTV使用PPPoE認證,所以我這樣的拓樸事實上能夠基本正常工作——上面提到的blog里解釋了一些細節。對了,這種接法用WNDR3700v4的官方固件行不通,WAN連接會直接斷了。WNDR3700v4刷DDWRT,以及原來用Linksys EA2700都可以工作。

長話短說,雖然能工作,但因為IPTV的數據是向組播地址廣播,在我家網路里造成的直接影響就是——只要看IPTV直播節目,視頻流會同時在三個WiFi AP(WNDR3700v4的2.4G + 5G, WR1041N的2.4G)上廣播,嚴重影響家裡其他無線終端的網路性能。比如一個高清CCTV5,就是10Mbps的數據流同時在三個AP上廣播,蔚為壯觀。

以前我的主路由是Linksys EA2700,當時還沒有第三方固件,我的解決辦法是在WR1041N上打開IGMP snooping,至少能解決一個WiFi AP的廣播。最近把EA2700換成了3700v4,就準備刷上OpenWRT或DDWRT,一勞永逸的用VLAN解決IPTV的問題。

思路很簡單,在WR1041N上把連接IPTV的網口划到一個VLAN(記編號為m),連接3700v4的LAN口作為trunk port,其餘設備用的LAN口划到另一個VLAN(記編號為n) 。類似的,在3700v4上把連接光貓的LAN口划到VLAN m,連接WR1041N的LAN口作為trunk port,其他LAN口劃為VLAN n。

WR1041N跑的是OpenWRT,一直相當穩定,修改VLAN配置也簡單。下面是過程:

root@OpenWrt:/etc/config# swconfig dev switch0 helpnswitch0: ag71xx-mdio.0(Atheros AR8327), ports: 7 (cpu @ 0), vlans: 128n...n

先跑swconfig help,得知一共有7個LAN口,其中CPU所用的內部LAN埠號是0。

root@OpenWrt:/etc/config# swconfig dev switch0 show | grep linkn link: port:0 link:up speed:1000baseT full-duplex txflow rxflown link: port:1 link:up speed:1000baseT full-duplex auton link: port:2 link:downn link: port:3 link:up speed:1000baseT full-duplex auton link: port:4 link:up speed:100baseT full-duplex auton link: port:5 link:downn link: port:6 link:downn

對比一下我當時的設備連接情況,很容易知道port 1是WAN口(連接3700v4),port 2, 3, 4, 5分別是WR1041N上的1, 2, 3, 4號LAN口,其中port 4連接機頂盒。 port 6未用。

然後把/etc/config/network里原來的vlan配置改為:

tconfig switch_vlan lan_wifint option vlan 1nt option ports 0 1t 2 3 5nt option device switch0nntconfig switch_vlan iptvnt option vlan 3nt option ports 1t 4nt option device switch0n

VLAN 1是NAS,電視等等用的普通VLAN,VLAN 3劃給IPTV用。修改完成後 /etc/init.d/network restart 即可。

然後是3700v4的配置。因為OpenWRT for 3700v4還是WIP,只能在論壇上下載網友們自行編譯的版本,雖然我也自己編譯了一個,但穩妥起見,還是可恥的先刷了有現成官方下載的DDWRT。

結果被DDWRT的官方VLAN配置文檔坑了很久。根據Switched Ports上的指引折騰了半天,沒有效果。然後才注意到VLAN Support里寫了這麼一段:

Only Broadcom based devices support port-based VLANs, no Atheros or Ralink devices.

坑爹啊摔!Atheros方案跑DDWRT不支持按埠劃分VLAN啊摔!!OpenWRT才支持啊!!!怪不得DDWRT的web管理界面里我都找不到VLAN,原來只在Broadcom方案的路由上才會出現。

不過還好,原來只是官方文檔疏於更新,其實DDWRT已經在幾個月前加入了port based vlan的支持。根據Using VLANs and VPN with DD-WRT的善心分享(這是目前唯一能找到的關於DDWRT Atheros VLAN配置的文章),從命令行下配置其實非常簡單:

root@DD-WRT:~# swconfig dev eth0 helpnswitch0: ag71xx-mdio.0(Atheros AR8327), ports: 7 (cpu @ 0), vlans: 128n

同樣先用swconfig help查看,也是有7個LAN口,CPU的內部埠使用0號。

root@DD-WRT:~# swconfig dev eth0 show | grep portn mirror_monitor_port: 0n mirror_source_port: 0n link: port:0 link:up speed:1000baseT full-duplex txflow rxflown link: port:1 link:up speed:100baseT full-duplex auton link: port:2 link:up speed:100baseT full-duplex auton link: port:3 link:up speed:1000baseT full-duplex auton link: port:4 link:up speed:1000baseT full-duplex auton link: port:5 link:up speed:100baseT full-duplex auton link: port:6 link:downn

根據我當時的聯網情況,判斷出port 5是WAN口(連光貓),port 4,3,2,1分別是3700v4的LAN口1,2,3,4。port 6未用。

查看修改之前的VLAN配置:

root@DD-WRT:~# swconfig dev eth0 shown[snip]nVLAN 1:n vid: 1n ports: 0t 1 2 3 4nVLAN 2:n vid: 2n ports: 0t 5n

VLAN 1是LAN口們,VLAN 2是WAN。其中port 3是連到WR1041N,port 2連到光貓的IPTV網口。只需要下面幾條命令,就可以完成我需要的修改:

root@DD-WRT:~# swconfig dev eth0 set enable_vlan 1nroot@DD-WRT:~# swconfig dev eth0 vlan 1 set ports "0t 1 3 4"nroot@DD-WRT:~# swconfig dev eth0 vlan 3 set ports "2 3t"nroot@DD-WRT:~# swconfig dev eth0 shown[snip]nVLAN 1:n vid: 1n ports: 0t 1 3t 4nVLAN 2:n vid: 2n ports: 0t 5nVLAN 3:n vid: 3n ports: 2 3tnroot@DD-WRT:~# swconfig dev eth0 set applyn

這樣就新增一個VLAN 3,把port 2划進去,並把port 3作為trunk port。

注意上面第一條命令「swconfig dev eth0 set enable_vlan 1"的含義是使能VLAN,enable_vlan是一個布爾屬性。之前提到的blog Using VLANs and VPN with DD-WRT在這一點上的理解有誤。

上面這幾條命令(除了show這條)還需要加到DDWRT的startup命令里去,以便每次重啟後生效。

這樣就徹底把IPTV機頂盒和光貓的IPTV口划到了獨立的VLAN 3,再也不會因為組播數據干擾其他設備啦。

下一步準備利用光貓HG8120C的內建VLAN映射,直接把用戶側(我家裡)的VLAN映射到網路側(光貓出口)的VLAN,這樣就可以從3700v4隻連接一條網線到光貓,變成這樣:


推薦閱讀:

Netgear r6300v2 或者R7000 Openwrt 有stable版本么?
小米路由器是基於OpenWRT? 不用開源?
路由器廠商為何不(在硬體條件允許的情況下)使用類似 DD-WRT、OpenWrt 等功能更豐富的第三方開源固件?
如何從零開始學習OpenWrt?

TAG:OpenWrt | DD-WRT | VLAN | IPTV | 无线路由器 |