Skip to content

Instantly share code, notes, and snippets.

@negri
Created October 30, 2024 11:52
Show Gist options
  • Select an option

  • Save negri/4f0494107d740fb60e8731c72baa0bf0 to your computer and use it in GitHub Desktop.

Select an option

Save negri/4f0494107d740fb60e8731c72baa0bf0 to your computer and use it in GitHub Desktop.
Modem Vivo Askey em Bridge sem Perder o Telefone

Modem Vivo Askey em Bridge sem perder o telefone (e TV)

"Coming together is a beginning; keeping together is progress; working together is success." - Henry Ford

O Problema

A Vivo oferece um serviço de Internet por Fibra Óptica, de boa velocidade e preço competitivo em São Paulo. Para pessoas jurídicas eles entregam um IPv4 real (embora dinâmico) e um belo bloco de IPv6 plenamente funcional. Por um pouco a mais eles entregam um número de telefone, e por um pouco mais eles habilitam o "Siga-Me", que te permite direcionar todas as chamadas para um outro número, um celular, por exemplo, muito útil.

Eles entregam o serviço (em 2024) através de um modem Askey (no nosso caso um RTF8225VW), que em tese é bastante competente: aguenta taxas até gigabit, Wi-Fi 6, e é um aparelho discreto.

Para 95% (?) das pessoas a Vivo entrega a contento. Até aqui, nenhum problema.

O problema ocorre quando você quer mais controle sobre a rede, direcionar mais portas, prestar serviços sobre IPv6, monitorar tráfego, bloquear spam e tracking, habilitar uma VPN entrante, separar as redes de Wi-Fi 2.4GHz e 5Ghz em SSIDs distintos etc. Se você está nos 5% que precisam de mais, os modems Askey não servem. O que serve é algo mais poderoso, configurado com Fresh Tomado, por exemplo, rodando num modesto Tenda AC-15, em nosso caso.

Parece simples:

  • Configurar o Siga-Me usando um telefone ligado ao modem Askey;
  • Colocar o modem em Modo Bridge pelas telas que a Vivo habilita;
  • Configurar seu roteador para discar o PPoE;
  • ???
  • Profit 🤑🤑🤑

Mas acontece algo quando se coloca o Askey em bridge: Ele desliga o telefone. E quando o telefone não conecta, o Siga-Me não funciona.

E precisamos que o Siga-Me funcione, e para ele funcionar o modem da Vivo precisa discar e conseguir a conexão VoIP, e então ele não pode ficar em bridge! E você não vai querer ficar em Double NAT, e em pleno 2024 você quer uma rede IPv6 funcional.

Tem jeito?

Tem. Mas antes de seguir os avisos...

  • Esse (não) tutorial assume que você sabe resetar seu modem, sabe ler um pouco de inglês em telas, não tem medo de abrir um prompt do PowerShell (ou seja lá qual seu terminal), sabe editar arquivos texto com javascript.
  • Eu não sou especialista em redes: este que vos escreve é um mero programador, mas que criado na frente de computadores desde 1987 sabe um pouquinho.
  • Eu, minha empresa, meus amigos, ninguém será responsável pelas consequências, sejam elas quais forem, de você seguir, corretamente ou não, as instruções que te apresento.
  • Caveat Emptor!

A Solução

A solução é configurar o modem Askey para "fazer o bridge" apenas da conexão de Internet, deixando o Askey responsável pela conexão SIP (VoIP) e TV (se for o caso do seu modem). Isso é possível, a Vivo entrega os 3 serviços num mesmo fio, 3 redes IP, separadas cada uma com seu VLAN (Virtual LAN) Id diferente (10 é a Internet para eles).

Matt Mills, no final de 2021, publicou um excelente tutorial no ITIGIC, aplicável ao Movistar (uma marca da Telefonica, dona da Vivo) Askey RTF8115VW. Nesse tutorial ele coloca o modem em Full Bridge, jogando todas as conexões (Internet, TV e Telefone) para o roteador. Seremos menos radicais e jogaremos apenas a Internet.

O tutorial começa acessando as configurações avançadas do roteador (tipicamente em http://192.168.15.1/avanzada.asp), mas a Vivo tomou, recentemente, creio, a péssima decisão de bloquear o acesso à essa página. Deixando, mesmo com o login support apenas o acesso à uma casca que oculta quase tudo de interessante.

Felizmente existem hackers, e são bastante engenhosos. Izurii publicou um repositório no GitHub que contém um programa node (javascript) que automatiza o browser (Firefox, Chrome, Edge) e faz o truque de obter cookies numa página, postar em outra e abrir uma janela com a famosa avanzada aberta.

Portanto, os passos:

  1. Com o modem Vivo funcionando, telefone funcionando, conecte a ele por cabo, na porta ETH1 dele, fixe o IP do notebook para o mesmo que ele delegar (tipicamente 192.168.15.1xx);
  2. Instale e rode o programa do Izurii, acessando o avanzada ;
  3. Em WAN Interface apague a interface de Internet, deixe as demais;
  4. Em Bridging Setup | Filtering, apague a entrada relativa a eth0.4 (que é por onde ligaremos o Askey ao seu roteador) e crie uma nova regra:
    • Adm. State: Enable
    • Order: lowest (para colocar a regra lá no final)
    • Ingress Interface: eth0.4 (pois usaremos a porta 4)
    • Associated bridge: 1 (Internet WAN)
    • Ingress Packet: All
    • VLAN ID: 10 (o que a Vivo usa, estava na entrada WAN que você apagou)
  5. Em Bridging Setup | Marking, apague (se existir) entradas que apontem para eth0.4 e crie uma nova regra:
    • Adm. State: Enable
    • Ingress Interface: eth0.4 (pois usaremos a porta 4)
    • Associated bridge: 1 (Internet WAN)
    • Ingress Marking:
      • Accept Type: tagged
      • VLAN ID: -1
      • Priority re-mark: 1
  6. Desligue ambas as redes Wi-Fi em Wireless LAN colocando o Adm. State como Disable, posto que elas não mais funcionariam e apenas ficariam poluindo o ar, e você não quer isso. As luzes de Wi-Fi devem se apagar.
  7. Desligue em Management | Remote Management | TR-069 o acesso remoto colocando o Adm. State como Disable. Se preciso clique o botão direito no checkbox, inspecione o elemento, e retire a propriedade disabled. Você não quer a Vivo fuçando no seu setup. Aproveite e confira em Remote Access que somente via LAN o acesso seja possível por SSH e TELNET.
  8. Reinicie o modem. As luzes de Wi-Fi não vão ficar acessas, a luz de navegação (o mouse, ficará sempre piscando), a luz de telefone deverá ficar firme (o telefone funciona!)
  9. Ligue um bom cabo da porta ETH4 do Askey para a porta WAN do seu roteador.
  10. Configure a discagem de WAN via PPoE (como faria em "bridge" normal), provavelmente ainda não funcionará...
  11. Em Advanced | VLAN, na WAN0 bridge, coloque o VID (VLAN ID) como 10.
  12. Pronto! Seu roteador vai pegar a conexão, o telefone (com ou sem o Siga-Me) vai funcionar.

Notas extras

  1. Se ao colocar em Bridge o roteador não pegar "toda a velocidade", verifique se a opção CTF (Cut-Through Forwarding) está habilitada. No Tomato fica em Advanced | Miscellaneous e, por padrão, fica desligada.
  2. Se algo der errado... reinicie o Askey para as configurações padrão com o botão de reset.
  3. Algumas vezes, após o reset, o telefone pode continuar a não funcionar (a luz nem acende). Nesse caso entre na avanzada, Voice | Voice Basic e coloque o Adm. State como Enable.
  4. Para programar o "Siga-Me": *52*Numero#. Se recebedor e redirecionamento forem de mesmo DD, não o coloque, por exemplo *52*991690269#. Para desprogramar use #52#.

Conclusão

O serviço de fibra da Vivo é bom, funciona bem e no Askey RTF8225VW é perfeitamente estável mesmo para velocidades altas. Deve servir bem para 95% ou mais dos assinantes deles. Mas para os que desejam mais controle sobre a rede, a camada administrativa que a Vivo construiu é ruim, e muito limitada.

Antigamente se resolvia isso acessando o painel de configuração avanzada livremente, mas colocaram um bloqueio, que requer um script para ser contornado. Uma vez contornado o bloqueio, sabendo (com ajuda do chatGPT todo mundo pode saber) o que é um VLAN, se direciona apenas a internet para o seu próprio roteador, mantendo serviços de telefone (VoIP, SIP) funcionando, o que é necessário para que o "Siga-Me" funcione.

Sugestões para a Vivo

  1. Não bloqueiem o acesso ao avanzada! Entendo que curiosos podem mexer lá e depois abrir chamados. Mas basta deixar claro, no primeiro acesso, que

    "não te ajudaremos, prossiga por conta e risco, se formos aí e o avanzada tive sido acessado a primeira coisa que faremos é o reset do roteador."

    Podem até deixar o desbloqueio ser por SSH. Vai parar curiosos incautos, mas não impedirá curiosos que sabem (?) o que estão fazendo.

  2. Colocar em modo bridge é apenas um script que a camada de vocês aplica. Criem uma opção de bridge apenas da Internet. Para vocês é trivial fazer o que descrevi aqui, e vai reduzir muito a necessidade de sequer precisar do avanzada.

  3. IPv4 morreu! É uma relíquia dos anos 70. Viva o IPv6! Mas para isso precisa haver, nas telas fáceis de você a possibilidade de direcionar tráfego para portas (sem re-mapear números!), para quem quer que estejam escutando. Mesmo algo simples como o que o FreshTomato faz já resolve.

  4. Não deixem o pessoal de vendas apitar em questões técnicas. Sei que vocês querem vender "extensões Wi-Fi" para rede MESH", e é justo. Mas não obriguem, através de uma opção de bridge torta (que mata telefone e TV) e do bloqueio do avanzada, que só vocês forneçam. Vocês já tem a vantagem da conveniência, não precisam de mais nenhuma. Basta perderem um processo jurídico de alguém que fique muito puto com vocês, para verem o lucro de milhares de MESH vendidos irem parar no bolso de advogados ou do Ministério Público.

@alnviana
Copy link

alnviana commented Oct 30, 2024

Está bem explicado, gostei. Não tenho telefone e nem TV, mas algum dia pode ser útil. :)

Só um comentário sobre a questão de ativar a avançada.
Sim, fazer isso funciona e não tem problema algum, podem ir na fé. Para aqueles que acharem meio trabalhoso fazer toda uma instalação de node e/ou docker, existem alternativas:

  • Não cheguei a testar isso, mas aparentemente é a forma manual da versão com node.
  • Tem a forma "arcaica"
    • Desconectar a fibra.
    • Resetar o ONT para as configurações de fábrica.
    • Mudar a região nas configurações normais de "Vivo1" pra "Vivo2" (ou vice-versa).
    • Reiniciar o ONT novamente.
    • Tentar acessar a avançada e logar com support.
    • Desativar o TR-069 para acesso permanente à avançada.
    • Mudar a região de volta para a original.
    • Reiniciar a ONT novamente.

Esse último é mais chato que só editar os cookies, mas deixo como alternativa.
Além disso, ela funciona para equipamentos que o firmware de fábrica permite o acesso ao avançada, mas que é desativado no primeiro acesso pelo TR-069. Então, caso o firmware já venha com a avançada bloqueada por padrão, essa opção não funcionará.

@gbc921
Copy link

gbc921 commented Oct 30, 2024

Muito bem escrito o tutorial! Guardar para futuras referências!
Obrigado.

@leleobhz
Copy link

Tenho a sensação que a Vivo nos lê aqui pois azedaram o esquema dos biscoitos: Izurii/modem-vivo-avancado#7

O exploit via ssh funciona, mas é um tormento esse aspsysd dele, misericórdia! Reverter essa config é bem complicado

@W0LFGT
Copy link

W0LFGT commented Aug 9, 2025

bom tutorial.
Agora estava pensando em como fazer o equipamento da Vivo fazer a "discagem" PPPoE e repassar o ipv4 publico para o router.
O PPPoE é uma das partes que anda pegando boa parte da CPU de alguns router limitando a performance, caso o equipamento da vivo ja fizesse a "discagem" e repassasse o ipv4 publico como os modens faziam antigamente seria bastante util.
Algumas ONU's (caixinhas pretas) até faziam isso antigamente, mas agora são incompatíveis na minha região.

@mapsouza
Copy link

Tutorial é ótimo. Mas no meu caso, o telefone não acendeu e não adiantou ativar em voice basic. Ele fica com erro e aparentemente, as configurações de SIP são excluídas depois do reset.

@lauroamerico
Copy link

Modem Vivo Askey RTF8115VW — Bridge Parcial via API (mantendo telefone)

Objetivo

Configurar o modem Vivo Fibra Askey RTF8115VW em bridge parcial, passando apenas a VLAN de internet (VLAN 10) para um roteador externo (no meu caso, TP-Link ER605), sem perder o telefone fixo (VoIP).

A Vivo bloqueia a página avançada (/avanzada.asp) nos firmwares mais recentes, então esse método usa chamadas diretas à API CGI do modem via Console do navegador (F12), sem precisar de scripts externos, Selenium, ou troca de região.

Pré-requisitos

  • Acesso ao painel do modem: http://192.168.15.1 (admin / senha na etiqueta do seu modem)
  • Navegador com DevTools (F12 → Console)
  • Roteador com suporte a PPPoE + VLAN tagging (ER605, Mikrotik, pfSense, etc.)
  • Cabo do roteador conectado na porta ETH4 do modem

Informações do Modem

  • Modelo: Askey RTF8115VW (REV5)
  • Firmware: BR_SV_g13.12_RTF_TEF001_V8.33_V022
  • VLANs: Internet (10), TV (20), VoIP (30)
  • Bridges: 1 = Internet WAN, 2 = Voice WAN, 3 = IPTV WAN, 4 = LAN

Arquitetura

Fibra (GPON) → Modem Vivo (bridge parcial ETH4)
                  ├── ETH4 (VLAN 10, bridge) → Roteador WAN (PPPoE)
                  ├── ETH1-3 → LAN do modem (inativa/desnecessária)
                  ├── TEL/PHONE → Telefone fixo (VoIP, VLAN 30, funcional)
                  └── Wi-Fi → Pode desligar

APIs Úteis (GET)

Todas via POST com Content-Type: application/x-www-form-urlencoded.

Endpoint Body Descrição
/cgi-bin/cbGetWanIPIntf.xml (vazio) Interfaces WAN (PPPoE, DHCP)
/cgi-bin/cbGetTR98L2Bridge.xml all=ALL Bridges configurados
/cgi-bin/cbGetTR98L2Filtering.xml all=ALL Regras de ingress filtering
/cgi-bin/cbGetTR98L2Marking.xml all=ALL Regras de egress marking
/cgi-bin/cbGetAvailableIntf.xml all=ALL Interfaces disponíveis e seus IDs

No TP-Link ER605 (Omada), isso fica em Settings → Internet → WAN → Edit WAN1 → Advanced Settings → VLAN ID.

Script Completo (uma tacada só)

Execute os passos 3, 4 e 5 em sequência com delays. Busque a sessionKey primeiro!

var SK = "SUA_SESSION_KEY";
var H = {"Content-Type":"application/x-www-form-urlencoded"};

function s(url, body) {
return fetch("/cgi-bin/" + url, {
method: "POST", credentials: "include", headers: H,
body: body + "&sessionKey=" + SK
}).then(r => r.text());
}

function d(ms) { return new Promise(r => setTimeout(r, ms)); }

async function run() {
var r;

console.log("=== Movendo ETH4 para Internet WAN (Filtering) ===");
r = await s("cbSetTR98L2Filtering.xml",
"adm_state=1&order_p=3&order=&filter_intf=23&filter_br_id=1" +
"&cls_admit_only_vlan_tagged=0&cls_vid_value=-1" +
"&cls_ethertype_value=0x0000" +
"&cls_src_mac_addr=00:00:00:00:00:00&cls_src_mac_mask=ff:ff:ff:ff:ff:ff" +
"&cls_dst_mac_addr=00:00:00:00:00:00&cls_dst_mac_mask=ff:ff:ff:ff:ff:ff" +
"&mll_br_filter_id=10");
console.log("FILTER:", r);
await d(3000);

console.log("=== Movendo ETH4 para Internet WAN (Marking) ===");
r = await s("cbSetTR98L2Marking.xml",
"adm_state=1&marking_intf=23&marking_br_id=1" +
"&untagged=0&vid_value=-1&vid_override=0" +
"&pbit_value=0&pbit_override=1&mll_br_marking_id=6");
console.log("MARKING:", r);
await d(3000);

console.log("=== Deletando WAN PPPoE do modem ===");
r = await s("cbSetWanIPIntf.xml", "del=DEL&ip_intf_id=2");
console.log("DEL_WAN:", r);

console.log("=== FEITO! Configure PPPoE com VLAN 10 no roteador ===");
}

run();

Verificação

Após executar, acesse 192.168.15.1 (pode precisar estar conectado na ETH1-3 do modem):

  • Internet: PPP Não Conectado (esperado — o roteador cuida disso agora)
  • Telefone: Rede Disponível, número aparecendo ✅
  • TV: Disponível ✅
  • GPON: Link Estabelecido ✅

Erros Comuns

BAD_PARAM no Filtering

O modem rejeita BAD_PARAM se:

  • Você enviar cls_ethertype=0 (é checkbox, não envie como campo)
  • Você usar mll_br_filter_id=-1 (tentar criar novo ao invés de editar existente)
  • A sessionKey expirou

Solução: Use mll_br_filter_id=10 (editar o existente) e não envie os campos checkbox (cls_ethertype, cls_src_mac, cls_dst_mac).

Promise {pending} sem resultado

A sessionKey expirou. Busque uma nova com o comando do Passo 1.

Modem reinicia durante os comandos

Execute os passos 3 e 4 antes do passo 5 (delete da WAN). Quando a WAN é deletada, o modem pode perder conectividade temporariamente.

Referências

Créditos

Procedimento documentado a partir de engenharia reversa da API do modem, com auxílio do Claude (Anthropic). Testado em 28/02/2026 com firmware V8.33.

# Modem Vivo Askey RTF8115VW — Bridge Parcial via API (mantendo telefone)

Objetivo

Configurar o modem Vivo Fibra Askey RTF8115VW em bridge parcial, passando apenas a VLAN de internet (VLAN 10) para um roteador externo (no meu caso, TP-Link ER605), sem perder o telefone fixo (VoIP).

A Vivo bloqueia a página avançada (/avanzada.asp) nos firmwares mais recentes, então esse método usa chamadas diretas à API CGI do modem via Console do navegador (F12), sem precisar de scripts externos, Selenium, ou troca de região.

Pré-requisitos

  • Acesso ao painel do modem: http://192.168.15.1 (admin / senha na etiqueta do seu modem)
  • Navegador com DevTools (F12 → Console)
  • Roteador com suporte a PPPoE + VLAN tagging (ER605, Mikrotik, pfSense, etc.)
  • Cabo do roteador conectado na porta ETH4 do modem

Informações do Modem

  • Modelo: Askey RTF8115VW (REV5)
  • Firmware: BR_SV_g13.12_RTF_TEF001_V8.33_V022
  • VLANs: Internet (10), TV (20), VoIP (30)
  • Bridges: 1 = Internet WAN, 2 = Voice WAN, 3 = IPTV WAN, 4 = LAN

Arquitetura

Fibra (GPON) → Modem Vivo (bridge parcial ETH4)
                  ├── ETH4 (VLAN 10, bridge) → Roteador WAN (PPPoE)
                  ├── ETH1-3 → LAN do modem (inativa/desnecessária)
                  ├── TEL/PHONE → Telefone fixo (VoIP, VLAN 30, funcional)
                  └── Wi-Fi → Pode desligar

APIs Úteis (GET)

Todas via POST com Content-Type: application/x-www-form-urlencoded.

Endpoint Body Descrição
/cgi-bin/cbGetWanIPIntf.xml (vazio) Interfaces WAN (PPPoE, DHCP)
/cgi-bin/cbGetTR98L2Bridge.xml all=ALL Bridges configurados
/cgi-bin/cbGetTR98L2Filtering.xml all=ALL Regras de ingress filtering
/cgi-bin/cbGetTR98L2Marking.xml all=ALL Regras de egress marking
/cgi-bin/cbGetAvailableIntf.xml all=ALL Interfaces disponíveis e seus IDs

Mapeamento de Interfaces

ID Interface Descrição
20 eth0.1 ETH1 (LAN)
21 eth0.2 ETH2 (LAN)
22 eth0.3 ETH3 (LAN)
23 eth0.4 ETH4 (LAN → Bridge)
30 rg0 GPON
40 ra0 Wi-Fi 2.4GHz
41 qtn0 Wi-Fi 5GHz
50 ppp0 PPPoE
61 ip1 IP LAN
63 ip3 IP VoIP
64 ip4 IP TV

Passo a Passo

1. Obter a sessionKey

Toda operação de escrita requer uma sessionKey. Para obtê-la:

fetch("/wanintf.asp", {credentials:"include"}).then(r=>r.text()).then(t=>{
  var m = t.match(/sessionKey='(\d+)'/);
  console.log("SK:", m[1]);
});

⚠️ A sessionKey expira rápido. Se um comando retornar vazio (Promise pending sem resultado), busque uma nova.

2. Verificar estado atual do Filtering

fetch("/cgi-bin/cbGetTR98L2Filtering.xml", {method:"POST", credentials:"include",
  headers:{"Content-Type":"application/x-www-form-urlencoded"},
  body:"all=ALL"}).then(r=>r.text()).then(t=>{
    var p = new DOMParser();
    var x = p.parseFromString(t,"text/xml");
    x.querySelectorAll("mll_tr098_dpm_cfg_ingress_filter").forEach(function(f){
      console.log("id:" + f.querySelector("mll_br_filter_id").textContent +
        " intf:" + f.querySelector("filter_intf").textContent +
        " br:" + f.querySelector("filter_br_id").textContent +
        " vid:" + f.querySelector("cls_vid_value_active").textContent);
    });
});

Saída esperada (configuração padrão):

id:0  intf:30  br:1  vid:10   ← GPON → Internet WAN
id:1  intf:50  br:1  vid:10   ← PPPoE → Internet WAN
id:2  intf:30  br:2  vid:30   ← GPON → Voice WAN
id:3  intf:63  br:2  vid:30   ← VoIP IP → Voice WAN
id:4  intf:30  br:3  vid:20   ← GPON → IPTV WAN
id:5  intf:64  br:3  vid:20   ← TV IP → IPTV WAN
id:6  intf:61  br:4  vid:1    ← LAN IP → LAN
id:7  intf:20  br:4  vid:1    ← ETH1 → LAN
id:8  intf:21  br:4  vid:1    ← ETH2 → LAN
id:9  intf:22  br:4  vid:1    ← ETH3 → LAN
id:10 intf:23  br:4  vid:1    ← ETH4 → LAN (VAMOS MUDAR ESSE)
id:11-19: Wi-Fi e outras interfaces → LAN

3. Mover ETH4 do Bridge LAN para o Bridge Internet WAN

Aqui está o pulo do gato. Não é possível criar um novo filtro apontando para outro bridge (retorna BAD_PARAM). A solução é editar o filtro existente da ETH4 (id=10) para apontar do bridge 4 (LAN) para o bridge 1 (Internet WAN).

Importante: Não envie os campos cls_ethertype, cls_src_mac, cls_dst_mac como valores numéricos — eles são checkboxes no formulário original. Envie apenas os subcampos _value, _addr, _mask.

var SK = "SUA_SESSION_KEY";

fetch("/cgi-bin/cbSetTR98L2Filtering.xml", {
  method: "POST",
  credentials: "include",
  headers: {"Content-Type": "application/x-www-form-urlencoded"},
  body: "adm_state=1" +
    "&order_p=3" +
    "&order=" +
    "&filter_intf=23" +
    "&filter_br_id=1" +
    "&cls_admit_only_vlan_tagged=0" +
    "&cls_vid_value=-1" +
    "&cls_ethertype_value=0x0000" +
    "&cls_src_mac_addr=00:00:00:00:00:00" +
    "&cls_src_mac_mask=ff:ff:ff:ff:ff:ff" +
    "&cls_dst_mac_addr=00:00:00:00:00:00" +
    "&cls_dst_mac_mask=ff:ff:ff:ff:ff:ff" +
    "&mll_br_filter_id=10" +
    "&sessionKey=" + SK
}).then(r=>r.text()).then(t=>{ console.log("FILTER:", t); });

Resposta esperada: <Result>0</Result> sem BAD_PARAM.

⚠️ O order_p=3 (Lowest) reordena os filtros. O id:10 vai para o final da lista, mas o mapeamento intf:23 → br:1 é o que importa.

4. Editar o Marking da ETH4

var SK = "SUA_SESSION_KEY";

fetch("/cgi-bin/cbSetTR98L2Marking.xml", {
  method: "POST",
  credentials: "include",
  headers: {"Content-Type": "application/x-www-form-urlencoded"},
  body: "adm_state=1" +
    "&marking_intf=23" +
    "&marking_br_id=1" +
    "&untagged=0" +
    "&vid_value=-1" +
    "&vid_override=0" +
    "&pbit_value=0" +
    "&pbit_override=1" +
    "&mll_br_marking_id=6" +
    "&sessionKey=" + SK
}).then(r=>r.text()).then(t=>{ console.log("MARKING:", t); });

5. Deletar a interface WAN de Internet (PPPoE do modem)

Isso remove a conexão PPPoE do modem — agora quem vai discar é o roteador.

var SK = "SUA_SESSION_KEY";

fetch("/cgi-bin/cbSetWanIPIntf.xml", {
  method: "POST",
  credentials: "include",
  headers: {"Content-Type": "application/x-www-form-urlencoded"},
  body: "del=DEL&ip_intf_id=2&sessionKey=" + SK
}).then(r=>r.text()).then(t=>{ console.log("DEL_WAN:", t); });

⚠️ Após esse comando, a internet do modem cai imediatamente. Execute os passos 3 e 4 antes deste.

6. Configurar o Roteador

No roteador, configure a porta WAN:

Parâmetro Valor
Connection Type PPPoE
Username cliente@cliente
Password cliente
VLAN ID 10

No TP-Link ER605 (Omada), isso fica em Settings → Internet → WAN → Edit WAN1 → Advanced Settings → VLAN ID.

Script Completo (uma tacada só)

Execute os passos 3, 4 e 5 em sequência com delays. Busque a sessionKey primeiro!

var SK = "SUA_SESSION_KEY";
var H = {"Content-Type":"application/x-www-form-urlencoded"};

function s(url, body) {
  return fetch("/cgi-bin/" + url, {
    method: "POST", credentials: "include", headers: H,
    body: body + "&sessionKey=" + SK
  }).then(r => r.text());
}

function d(ms) { return new Promise(r => setTimeout(r, ms)); }

async function run() {
  var r;

  console.log("=== Movendo ETH4 para Internet WAN (Filtering) ===");
  r = await s("cbSetTR98L2Filtering.xml",
    "adm_state=1&order_p=3&order=&filter_intf=23&filter_br_id=1" +
    "&cls_admit_only_vlan_tagged=0&cls_vid_value=-1" +
    "&cls_ethertype_value=0x0000" +
    "&cls_src_mac_addr=00:00:00:00:00:00&cls_src_mac_mask=ff:ff:ff:ff:ff:ff" +
    "&cls_dst_mac_addr=00:00:00:00:00:00&cls_dst_mac_mask=ff:ff:ff:ff:ff:ff" +
    "&mll_br_filter_id=10");
  console.log("FILTER:", r);
  await d(3000);

  console.log("=== Movendo ETH4 para Internet WAN (Marking) ===");
  r = await s("cbSetTR98L2Marking.xml",
    "adm_state=1&marking_intf=23&marking_br_id=1" +
    "&untagged=0&vid_value=-1&vid_override=0" +
    "&pbit_value=0&pbit_override=1&mll_br_marking_id=6");
  console.log("MARKING:", r);
  await d(3000);

  console.log("=== Deletando WAN PPPoE do modem ===");
  r = await s("cbSetWanIPIntf.xml", "del=DEL&ip_intf_id=2");
  console.log("DEL_WAN:", r);

  console.log("=== FEITO! Configure PPPoE com VLAN 10 no roteador ===");
}

run();

Verificação

Após executar, acesse 192.168.15.1 (pode precisar estar conectado na ETH1-3 do modem):

  • Internet: PPP Não Conectado (esperado — o roteador cuida disso agora)
  • Telefone: Rede Disponível, número aparecendo ✅
  • TV: Disponível ✅
  • GPON: Link Estabelecido ✅

Erros Comuns

BAD_PARAM no Filtering

O modem rejeita BAD_PARAM se:

  • Você enviar cls_ethertype=0 (é checkbox, não envie como campo)
  • Você usar mll_br_filter_id=-1 (tentar criar novo ao invés de editar existente)
  • A sessionKey expirou

Solução: Use mll_br_filter_id=10 (editar o existente) e não envie os campos checkbox (cls_ethertype, cls_src_mac, cls_dst_mac).

Promise {pending} sem resultado

A sessionKey expirou. Busque uma nova com o comando do Passo 1.

Modem reinicia durante os comandos

Execute os passos 3 e 4 antes do passo 5 (delete da WAN). Quando a WAN é deletada, o modem pode perder conectividade temporariamente.

Referências

Créditos

Procedimento documentado a partir de engenharia reversa da API do modem, com auxílio do Claude (Anthropic). Testado em 28/02/2026 com firmware V8.33.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment