Anteriormente, mostrei os programas que hospedo no meu servidor local. Alguns deles, especificamente o plex, eu deixo exposto publicamente para que eu e meus usuários consigam acessar fora da minha rede.
CGNAT
O problema é que a operada que utilizo me deixava em CGNAT. Isso traz várias consequências negativas. Primeiro que mesmo você liberando a porta X publicamente, não é um “público” de verdade, pois apenas usuários da mesma operadora conseguirão acessar sua aplicação. Segundo que usuários P2P em programas de torrent não irão se conectar com você. Não seria possível nem acessar uma câmera IP remotamente, por exemplo.
Conversei com a minha operadora e eles conseguiram me tirar do CGNAT sem nenhum custo adicional, o problema é que com isso me alocaram um IP dinâmico, e eu não estou a fim de pagar por um IP fixo porque costumar ser caro. A solução mais direta neste caso seria utilizar DNS dinâmico, que foi o que optei.
DNS Dinâmico
DNS dinâmico funciona de uma forma bem simples. Basicamente, é um script que verifica se o seu IP foi alterado ou não, se sim, o script atualiza o valor do DNS para o novo IP que a operadora atribuiu a você. O DNS em questão é o que utilizo para acessar o plex, exemplo: plex.domain.tld.
Mas aí você pode se perguntar: mas e se essa troca acontecer no meio de algo importante? Bom, isso nunca aconteceu comigo. E pelo que vi nos logs a última troca aconteceu de madrugada. Por ser mídia, isso não é um problema já que se estiver no meio do filme, boa parte dele estará no buffer. Mas é um trade-off por não querer pagar por um IP fixo.
Geralmente, esse script vai depender da plataforma que gerencia o seu DNS. Como eu utilizo a Cloudflare, eu poderia utilizar um container que faria essa checagem, como o bem conhecido github.com/favonia/cloudflare-ddns. Mas, isso também é possível fazer pelo OpenWRT, que, na verdade, é até melhor pois o IP é buscado pela interface e é menos um container para gerenciar. Existe um pacote específico para a cloudflare: https://openwrt.org/packages/pkgdata/ddns-scripts-cloudflare.
< FOTO DO DDNS OPENWRT AQUI >
Configuração
A primeira coisa a ser feita é criar o DNS na cloudflare. O único ponto de atenção é o Proxy, pois não pode trafegar certos tipos de conteúdo pelo proxy, então se for pra usar Jellyfin ou Plex, é melhor deixar desativado.
O script também precisa de um token API da cloudflare para conseguir atualizar o DNS caso precise. Crie indo em Profile -> API Tokens.
Para instalar o pacote no OpenWRT é bem simples (versoões mais antigas irão usar opkg):
apk update
apk add ddns-scripts ddns-scripts-cloudflare luci-app-ddns ca-bundle
Depois de instalado um novo menu irá aparecer no LuCI em Services -> Dynamic DNS:

Aqui você pode configurar tanto pela interface como pela linha de comando. Eu prefiro usar a CLI, então segue os comandos:
uci set ddns.plex=service
uci set ddns.plex.enabled='1'
uci set ddns.plex.service_name='cloudflare.com-v4'
uci set ddns.plex.lookup_host='plex.domain.tld'
uci set ddns.plex.domain='plex.domain.tld'
uci set ddns.plex.username='Bearer'
uci set ddns.plex.password='<TOKEN API DA CLOUDFLARE>'
uci set ddns.plex.interface='wan'
uci set ddns.plex.ip_source='network'
uci set ddns.plex.ip_network='wan'
uci set ddns.plex.use_https='1'
uci set ddns.plex.check_interval='10'
uci set ddns.plex.check_unit='minutes'
uci set ddns.plex.force_interval='72'
uci set ddns.plex.force_unit='hours'
uci commit ddns
/etc/init.d/ddns enable
/etc/init.d/ddns restart
Basicamente, esses comandos irão configurar o script para checar a cada 10 minutos se o IP foi alterado. Esta é uma forma de usar o DDNS bem confiável já que está no roteador que fica ligado sempre.
