Como rotear o tráfego através do OpenVPN apenas para o servidor

2

Eu tenho um número de serviços em execução no meu servidor para o qual eu quero restringir o acesso apenas àqueles que se conectam através do OpenVPN. Consegui obter roteamento para trabalhar para um segundo IP que adicionei à máquina, mas isso não é ideal.

*.*.*.1 é o IP público principal. Está ligado ao IP local 172.31.20.102 . *.*.*.2 é o IP secundário na mesma máquina criada para teste. Está ligado ao IP local 172.31.20.103 . Isso é feito na interface do Amazon EC2, não no servidor.

Nota : Os * s são apenas para mascarar o endereço IP aqui. As configurações reais têm os IPs públicos reais.

Aqui estão os bits relevantes da configuração do servidor OpenVPN:

dev tun
server 172.16.128.32 255.255.255.240
#push "route *.*.*.1 255.255.255.255 net_gateway"
push "route *.*.*.2 255.255.255.255"

Eu tentei os dois com e sem a linha push "route *.*.*.1 255.255.255.255 net_gateway" , e é por isso que eu comentei neste exemplo. Observe que o roteamento funciona para *.*.*.2 na configuração atual.

O IP do servidor na VPN é 172.16.128.33 .

Aqui está a linha relevante de sysctl.conf :

net.ipv4.ip_forward = 1

Aqui estão os bits relevantes de iptables-save :

*nat
-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 22 -j DNAT --to-destination 172.16.128.33
-A POSTROUTING -s 172.16.128.32/28 -o eth0 -j MASQUERADE
COMMIT
*filter
-A FORWARD -i tun0 -s 172.16.128.32/28 -d *.*.*.1 -j ACCEPT
-A FORWARD -i tun0 -s 172.16.128.32/28 -d *.*.*.2 -j ACCEPT
-A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 172.16.128.32/28 -j ACCEPT
-A INPUT -s 172.31.20.100/28 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 22 -j DNAT --to-destination 172.16.128.33 me permitiu acessar o SSH na interface alternativa. Adicionar uma dessas linhas para cada porta não é o ideal, mas seria aceitável se não houvesse outras opções.

Eu quero poder acessar a porta 22, por exemplo, em *.*.*.1 . Eu preferiria que a conexão se originasse de *.*.*.1 , em vez do meu IP público. Percebo que não posso rotear todo o tráfego através do túnel, pois o túnel em si deve ser mantido, mas quero que todo o resto passe pelo túnel.

Deixe-me saber se perdi alguma informação útil.

    
por user1936123 20.05.2014 / 16:52

1 resposta

0

Até onde eu sei, o EC2 não implementa o loopback nat, e é por isso que as conexões com você mesmo falham.

A solução curta é adicionar o IP público a uma interface fictícia ou DNAT, tudo o que seria encaminhado ao IP público para o seu endereço interno.

Interface fictícia:

ip link add dummy0 type dummy
ip addr add *.*.*.1/32 dev dummy0
ip link set dummy0 up
iptables -A OUTPUT -s *.*.*.1/32 -o eth+ -j REJECT
iptables -A FORWARD -i tun+ -o dummy0 -j ACCEPT
iptables -A FORWARD -i dummy0 -o tun+ -j ACCEPT

ou NAT:

iptables -t nat -A PREROUTING -i tun+ -p tcp -d *.*.*.1 -m state --state NEW -j DNAT --to-destination 172.16.128.33

Uma solução mais comum é implementar o DNS split-horizon, que permite que você execute sua rede segura baseada em nome com IPs internos e externos. Isso tornará o roteamento e o gerenciamento automáticos significativamente mais fáceis no futuro, à medida que sua rede for dimensionada.

    
por 21.05.2014 / 14:15