Routery Linksys vs Netgear a VLAN s DD-WRT

Tak jsem se postupem času dopracoval dopsat tento článek.

Zadání bylo vcelku jednoduché na levných zařízeních typu Linksys WRT160N, Linksys E1000 nebo Netgear N150, Netgear 3500L zprovoznit VLANy pro použití s IPTV.
Už kdysi dávno můj kolega Honza Kratochvíl do Linksys routerů začal programovat upravený firmware OpenWRT nebo DD-WRT, vzali jsme tedy jako základ jeho znalosti a první router pro tyto účely byl Linksys WRT160N.

Popíšu základní požadavky:

  1. Levný router s možností nastavení VLAN pro IPTV
  2. Klasická kombinace 1xWAN port + 4xLAN porty + WiFi v N variantě
  3. Možnost monitoringu například SNMP
  4. Vzdálená správa nejlépe HTTP Provisioning, TR-069 nebo XML

Výběr byl následující:

  • Linksys WRT160N
    • cena kolem 900,- verze RF (Refurbish)
    • použitelná pouze HW revize v3.0 s čipsetem BCM4716 a BCM532
    • plná podpora DD-WRT
    • 10/100Mb porty LAN a WAN

     

  • Linksys E1000
    • cena kolem 900,- verze RF (Refurbish)
    • použitelná pouze HW revize v1.0  s čipsetem BCM4716A nebo v2.0 s čipsetem BCM5357
    • plná podpora DD-WRT
    • 10/100Mb porty LAN a WAN

     

  • Netgear 3500L
    • cena kolem 1500,-
    • HW určen přímo pro nasazení Linuxu
    • plná podpora DD-WRT
    • 10/100/1000 Mb porty LAN a WAN
    • USB

U testovaní byl samozřejmě tlak na cenu tak jsme věnovali asi měsíc nebo dva modelu Linksys WRT160N a E1000, zjistili jsme ale že daný čipset ačkoliv DD-WRT podporuje VLANy tak pouze ty interní v rozsahu 1-15.

Na internetu koluje spoustu blogů na toto téma, držel jsem se manuálu DD-WRT který naleznete zde
http://www.dd-wrt.com/wiki/index.php/Switched_Ports
a zjistili jsme, že vlastnost VLAN a funkčnost jiné VLAN ID mimo rozsah 1-15 se musí definovat například tímto příkazem přímo přes SSH nebo spouštěcí skript

/sbin/vconfig add eth0 389
/sbin/ifconfig vlan389 up
sleep 1
/sbin/vconfig add eth0 385
/sbin/ifconfig vlan385 up
sleep 1
/usr/sbin/nvram set port0vlans="16 18 19"
/usr/sbin/nvram set port1vlans="18 19"
/usr/sbin/nvram set port2vlans="18 19"
/usr/sbin/nvram set port3vlans="1 18 19"
/usr/sbin/nvram set port4vlans="1 18 19"
/usr/sbin/nvram commit
sleep 5
/bin/echo "0t 1 2 8" >/proc/switch/eth0/vlan/389/ports
/bin/echo "0 8" >/proc/switch/eth0/vlan/2/ports
sleep 5
/bin/echo "0t 8" >/proc/switch/eth0/vlan/385/ports
/sbin/startservice wan
/usr/sbin/nvram set http_wanport="8088"
/usr/sbin/nvram set telnet_wanport="23"
/usr/sbin/nvram set telnetd_enable="1"
/usr/sbin/nvram set remote_mgt_telnet="1"
/usr/sbin/nvram set remote_management="1"
/usr/sbin/nvram set router_name="WNR3500L"
/usr/sbin/nvram commit

Tato konfigurace je funkční na všech modelech které podporují VLANy resp. toto je přímo z Netgear 3500L.

V konfiguraci naleznete VLAN 389 (IPTV) a VLAN 385 (Hotspot), nejprve se příkazem tato VLAN nastartuje jako interface a pak přijde kámen úrazu, pomocí příkazu nvram a /proc/switch musíme nastavit typ portu na Trunk a pak na koncovém portu provoz Odtagovat. Možná pomůže pro znalé toto blokové schéma routeru, pro neznalé vysvětlím níže 🙂

 

Pro aplikaci skriptu je potřeba pochopit jak vlastně HW funguje.

Představme si, že router má pěti portový switch, tento switch řídí dle typu čipsetu samostatný procesor v blokovém schématu jako port 5 (u 100mbit verze) nebo port 8 (u gigové verze). Tento virtuální port/procesor řídí provoz k centrálnímu procesoru/čipsetu. Musím tedy na port switch 0 definovat typ portu Trunk s Tagovanou VLAN 389 a 385 a zároveň Access VLAN. Tomu odpovídá tato definice.

/bin/echo "0t 1 2 8" >/proc/switch/eth0/vlan/389/ports
/bin/echo "0 8" >/proc/switch/eth0/vlan/2/ports

Půjdeme zezadu, příkazem /proc/switch/eth0/vlan/389 říkám, že VLAN 389 je na portu switche 0 (WAN) Tagovaně tedy proto „t“, na portu 1 a 2 Netagovaně, port číslo 8 je právě zmiňovaný interní port resp. CPU které musí celé switchování zprocesovat.

Druhý řádek znázorňujě VLAN 2 což defaultní VLANa v DD-WRT.

/usr/sbin/nvram set port0vlans="16 18 19"
/usr/sbin/nvram set port1vlans="18 19"
/usr/sbin/nvram set port2vlans="18 19"
/usr/sbin/nvram set port3vlans="1 18 19"
/usr/sbin/nvram set port4vlans="1 18 19"

Další příkaz nvram zapisuje parametry typu portu Trunk/Access a také tím mažu defaultní nastavení DD-WRT.

 

Nastavení je funkční pouze na gigových modelech tedy Netgear 3500L nebo Linksys E4200, WRT320N a pod, u levných routerů se 100mbit čipsety toto nefunguje, po důkladném testování i dalších TP-Link, OEM jsem si přečetl Datasheet čipu na routeru a zjevně už čip neumí na switchy VLANy zpracovat.

Bohužel dva měsíce testování routerů jsme rozhodli, že jediný funkční model s IPTV je pouze Netgear 3500L, během této doby také Mikrotik začal prodávat routery RB751U-2HnD a RB751G-2HnD tedy gigovou verzi.

Mikrotik všeobecně podporuje SSH, Telnet, Winbox a například API a právě to byl největší důvod zvolit právě Mikrotik. Při switchování tří IPTV HD kanálů a datového toku cca 3x 15Mbit je zatížění CPU max 20%, nicméně debatě o Mikrotik RB751U-2HnD se budu věnovat někdy přístě.

Výsledek

Levné routery s čipsety Broadcom nebo Atheros běžící na DD-WRT v cenové hladině kolem 1000,- Kč není z technických důvodů použítých čipů možné použít na switchování L2 a použití IPTV, jediná cesta je Mikrotik RB751, UBNT Airouter nebo gigový router Netgear 3500L.

Samozřejmě budu rád za feedback.

Tomáš Chott

Napsat komentář