Este repositório contém uma implementação simples de uma rede privada virtual ponto a ponto, abrindo um dispositivo TUN e transferindo o tráfego bruto por UDP. Esta VPN foi projetada para criar um túnel entre dois hosts:
O tráfego TUN é enviado ad-literalmente entre os dois terminais por meio de pacotes UDP não criptografados. Portanto, isso só deve ser usado se um protocolo mais seguro (como SSH; consulte github.com/dsnet/sshtunnel) estiver sendo executado nesta VPN. Para evitar que invasores se conectem a outros soquetes vinculados localmente nos terminais, um filtro de porta simples é integrado para restringir o tráfego IP apenas às portas especificadas. Os usuários do udptunnel também devem configurar regras de iptable como medida secundária para restringir o tráfego malicioso.
Isso suporta apenas Linux.
Construa o daemon:
go get -u github.com/dsnet/udptunnel
Crie um arquivo de configuração do servidor:
{
"TunnelAddress" : "10.0.0.1" ,
"NetworkAddress" : ":8000" ,
"AllowedPorts" : [ 22 ] ,
}
O NetworkAddress
com um host vazio indica que o daemon está operando no modo servidor.
Crie um arquivo de configuração do cliente:
{
"TunnelAddress" : "10.0.0.2" ,
"NetworkAddress" : "server.example.com:8000" ,
"AllowedPorts" : [ 22 ] ,
}
Presume-se que o host server.example.com
resolva para algum endereço onde o cliente possa acessar o servidor.
Inicie o daemon no cliente e no servidor (assumindo que $GOPATH/bin
esteja em seu $PATH
):
[email protected] $ udptunnel /path/to/config.json
[email protected] $ udptunnel /path/to/config.json
Tente acessar o outro endpoint (o exemplo é de cliente para servidor):
[email protected] $ ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_req=1 ttl=64 time=56.7 ms
64 bytes from 10.0.0.1: icmp_req=2 ttl=64 time=58.7 ms
64 bytes from 10.0.0.1: icmp_req=3 ttl=64 time=50.1 ms
64 bytes from 10.0.0.1: icmp_req=4 ttl=64 time=51.6 ms
[email protected] $ nmap 10.0.0.1
Host is up (0.063s latency).
PORT STATE SERVICE
22/tcp open ssh
[email protected] $ ssh 10.0.0.1
Password: ...
O exemplo acima mostra o cliente tentando se comunicar com o servidor, que é endereçável em 10.0.0.1
. Os comandos de exemplo podem ser executados no servidor discando para o cliente em 10.0.0.2
.