0.3.16
- The router now makes its own account and name-lookup requests through the same fallback paths as the apps, so it keeps reaching ForestVPN on networks that interfere with them.
O ForestVPN como contêiner em um roteador MikroTik com RouterOS 7. Ele se registra como um dispositivo próprio e imprime um código de pareamento.
Um contêiner RouterOS, verificado em hardware real — um MikroTik cAP ax baixou a imagem, se registrou, imprimiu um código de pareamento e se conectou. Ele mantém sua própria chave de máquina e pede uma saída ao control plane da mesma forma que o telefone faz.
Três linhas no terminal do RouterOS — um /30 que existe apenas entre o contêiner e o roteador, nada para procurar na sua LAN.
Imagem fixada, não :latest — um roteador diante do qual você não está fisicamente nunca deveria trocar silenciosamente o que está executando.
Ele é impresso em /log antes mesmo de o contêiner ter qualquer acesso à rede. Abra o app do ForestVPN, já conectado com seu número de conta, e digite o código.
O roteador serve sua própria página de status no endereço que você acabou de dar a ele — abra-a em um telefone na mesma rede e toque em uma localização. Essa é a única coisa que uma caixa sem tela não consegue fazer sozinha.
/interface/veth/add name=veth-fvpn address=172.31.254.2/30 gateway=172.31.254.1
/ip/address/add address=172.31.254.1/30 interface=veth-fvpn
/interface/list/member/add list=LAN interface=veth-fvpn
# A `flash` folder (hAP ac² and other 16 MB boards) means only flash/ survives a reboot: the state
# goes there, the log stays in RAM, and the image is pulled again at every boot.
:global fvRAMROOT ([:len [/file/find where name="flash"]] > 0)
:global fvSTATE "/forestvpn"
:global fvCMD "--agent --nat-lan --iface fvpn0 --config /etc/forestvpn/fvpn0.conf --policy-route --fwmark 51820 --table 100 --http-port 80 --report /etc/forestvpn/result.txt"
:if ($fvRAMROOT) do={
:global fvSTATE
:global fvCMD
:set fvSTATE "flash/forestvpn"
:set fvCMD ($fvCMD . " --log-dir /var/log")
}
/container/mounts/add list=fvpn-state src=$fvSTATE dst=/etc/forestvpn mode=rw
/container/add remote-image=suquant/fvpn:0.3.17 interface=veth-fvpn root-dir=/fvpn \
mountlists=fvpn-state entrypoint=/mikrotik.sh cmd=$fvCMD \
privileged=yes logging=yes start-on-boot=yes dns=172.31.254.1 name=fvpn
:if ($fvRAMROOT) do={
/container/set [find name="fvpn"] start-on-boot=no
/system/script/add name=forestvpn-repull comment="forestvpn" source={
:local c [/container/find where name="fvpn"]
:if ([:len $c] = 1) do={
:local n 0
:while ((![/container/get $c running]) && ($n < 60)) do={
:set n ($n + 1)
:log info ("ForestVPN: pulling the image into the RAM root, attempt " . $n)
:do { /container/repull $c } on-error={}
:local w 0
:local s ""
:while (($w < 60) && ($s = "")) do={
:set w ($w + 1)
:delay 5s
:local st [:pick [/container/print as-value where name="fvpn"] 0]
:if (($st->"stopped") = true) do={ :set s "stopped" }
:if (($st->"download/extract failed") = true) do={ :set s "failed" }
}
:if ($s = "stopped") do={
:do { /container/start $c } on-error={}
:delay 30s
} else={
:log warning "ForestVPN: image pull failed, retrying in 60s"
:delay 60s
}
}
:if (![/container/get $c running]) do={
:log error "ForestVPN: the container is still not running after 60 pulls; see /container/print"
}
}
}
/system/scheduler/add name=forestvpn-repull start-time=startup comment="forestvpn" \
on-event="/system/script/run forestvpn-repull"
}
/container/start [find name="fvpn"]Cada linha é essencial, `cmd=` mais do que qualquer outra.
Sem `--agent`, o entrypoint executa o tunneller bruto em vez do gerenciado pela conta, procura por um `.conf` que ninguém escreveu, e o contêiner encerra com `fvpn0 never appeared`. O outro ponto é o mount: a imagem é `scratch`, então nada sobrevive a um reinício exceto o que estiver montado, e perder o mount da chave de máquina significa que o roteador volta como um dispositivo totalmente novo que saiu silenciosamente da sua conta.
Ele é impresso em /log, e o roteador serve uma página de status em http://172.31.254.2/.
Abra o ForestVPN em um celular em que você está conectado e digite o código. O vínculo é feito pelo app, não pelo roteador.
Na página de status, toque em uma localização.
Ainda não no MikroTik: escolher sites ou serviços por destino de dentro do ForestVPN. O RouterOS toma a decisão de roteamento.
Passar para uma imagem mais nova é uma decisão deliberada, porque a tag está fixada.
A imagem é suquant/fvpn:0.3.17. A tag está fixada e publicada no Docker Hub; o bloco de instalação usa exatamente esta tag.
Pare e remova o contêiner com /container/stop e /container/remove, depois exclua o veth e o endereço dele. O dispositivo continua na sua conta até você removê-lo no app.