Tenho VPS executando wg-easy docker image e Orange Pi 4B, que está localizado em casa. Quero fazer proxy de solicitações de VPS para Orange Pi através do túnel WireGuard para criar um servidor minecraft para mim e meus amigos. Para solicitações de proxy vou usar nginx
(talvez não seja a melhor solução, mas pelo menos sei como trabalhar com ela).
A princípio tentei ping 10.8.0.2
(IP do Orange Pi no WireGuard), mas não obtive resposta. Então eu fiz o próximo comando sudo docker exec -it wg-easy ping 10.8.0.2
e funcionou.
vps-user@vps:~$ ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
--- 10.8.0.2 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4093ms
vps-user@vps:~$ sudo docker exec -it wg-easy ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2): 56 data bytes
64 bytes from 10.8.0.2: seq=0 ttl=65 time=57.427 ms
64 bytes from 10.8.0.2: seq=1 ttl=65 time=56.928 ms
64 bytes from 10.8.0.2: seq=2 ttl=65 time=57.318 ms
^C
--- 10.8.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 56.928/57.224/57.427 ms
Então, acho que meu Orange Pi só pode ser acessado no contêiner do docker.
Quando pesquisei essa questão, encontrei essa discussão no repositório GitHub. Pelo que entendi, há uma resposta sobre como fazer proxy da porta exata. Mas acho isso um pouco difícil, porque se eu precisar adicionar mais portas, terei que acrescentar mais padrões e não cometer erros.
Também encontrei --network host
argumentos. Tentei usá-lo dentro da VM. Ele adiciona uma wg0
interface real e torna possível fazer ping entre pares dentro do host. Aqui está a demonstração, como funciona (mudei /etc/sysctl.conf
nos bastidores e removi algumas ifconfig
saídas, deixei apenas nomes de interface e IPs)
osboxes@osboxes:~$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
osboxes@osboxes:~$ sudo docker start wg-easy
[sudo] password for osboxes:
wg-easy
osboxes@osboxes:~$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1420
inet 10.8.0.1 netmask 255.255.255.0 destination 10.8.0.1
osboxes@osboxes:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.035 ms
^C
--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2036ms
rtt min/avg/max/mdev = 0.032/0.033/0.035/0.001 ms
Essa coisa parece boa para mim, mas não tenho certeza de como funciona exatamente e é um pouco assustador usá-la em um servidor real. Assisti ao tutorial do NetworkChuk sobre redes docker, mas talvez não tenha entendido, pois inglês não é meu idioma principal.
Então, existe uma maneira melhor de acessar a rede interna de contêineres do Docker?
Eu descobri alguns prós e contras dos métodos mencionados em questão. Também acho que encontrei o melhor método para solicitações de proxy.
Alterando a rede de contêineres para
host
Por um lado, é a maneira mais fácil para iniciantes exporem a rede interna. Por outro lado, é inseguro, pois cada mudança na rede dentro do contêiner influenciará a rede host.
Proxy da porta exata
A maneira mais difícil de fazer solicitações de proxy. A única maneira de usá-lo é se eu precisar apenas fazer proxy de apenas uma porta para um peer.
Aqui estão os contras da solução:
WG_POST_DOWN
iptables
Conecte o host ao túnel WireGuard
Quando pesquisei minha pergunta, também encontrei esse comentário nas discussões do projeto no GitHub. Então aqui estão os passos de como fazer isso.
wg-easy
contêiner ( exemplo da documentação)sudo apt install wireguard -y
sudo nano /etc/wireguard/wg0.conf
sudo wg-quick up wg0
ping 10.8.0.1
Acho que essa solução é a melhor, pois não há necessidade de gerenciar múltiplas
iptable
regras para proxy e as únicas alterações na rede host são feitas por suas mãos.