Port Forwarding via OpenVPN to Client no OpenVZ

1

Editar : Ok, vou tentar deixar isso mais claro. O que eu estou tentando alcançar é simplesmente uma porta em frente, através do meu servidor OpenVZ hospedado openvpn, para um serviço em execução em um cliente. Existem alguns serviços diferentes que gostaria de encaminhar, como um servidor web ou um cliente bittorent. Por uma questão de argumento, digamos que eu queira apenas estabelecer uma conexão netcat funcional com essa topologia:

internet --- > [- > servidor (1.2.3.4:15555)] - nat - / - > openvpn-server (10.8.0.1) - \ - > cliente executando um servidor da Web (10.8.0.6:15555)

ou ....

(inet) --- > | (ip público) -nat-through-openvpn-server-- | - > para-client- \ 10.8.0.6 (destino)

Onde inet representa qualquer host na Internet, 1.2.3.4 representa o IP público do meu servidor, e 10.8.0.6 representa o cliente ovpn que hospedará o servidor, que gostaria de ser acessado por trás da VPN, no endereço / port 1.2.3.4:15555

Aqui está o meu ifconfig:

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:1037374 errors:0 dropped:0 overruns:0 frame:0
      TX packets:1037374 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:141887598 (141.8 MB)  TX bytes:141887598 (141.8 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
      UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
      RX packets:1746329 errors:0 dropped:0 overruns:0 frame:0
      TX packets:3193026 errors:0 dropped:117 overruns:0 carrier:0
      collisions:0 txqueuelen:100 
      RX bytes:104945794 (104.9 MB)  TX bytes:4356609743 (4.3 GB)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:127.0.0.2  P-t-P:127.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
      RX packets:43166195 errors:0 dropped:0 overruns:0 frame:0
      TX packets:44728488 errors:0 dropped:11647 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:34214141842 (34.2 GB)  TX bytes:43166888251 (43.1 GB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:1.2.3.4  P-t-P:1.2.3.4  Bcast:1.2.3.4  Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:1.2.3.5  P-t-P:1.2.3.5  Bcast:1.2.3.5  Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

Portanto, gostaria que os hosts da Internet pudessem acessar um ouvinte de netcat (ou servidor da web) no endereço IP público do servidor, NAT através do servidor openvpn, para um cliente openvpn.

Eu fiz esta pergunta ontem à noite e a deletei porque achei que tinha descoberto a resposta, mas acontece que eu não tinha. Se isso parece ser uma pergunta duplicada, peço desculpas. Eu pesquisei e tentei seguir as recomendações encontradas em outros tópicos sobre este tópico. A situação é que eu tenho um Ubuntu Minimal vps. É um contêiner OpenVZ. Está sendo usado principalmente como um servidor openvpn. A topologia de rede é p2p. Estou tentando encaminhar uma porta para um cliente (digamos 10.8.0.6, p2p 10.8.0.5) através do IP público do servidor (exemplo 1.2.3.4) para que um determinado serviço (digamos, o apache) seja acessível a partir do endereço VPN 1.2. 3.4.

Eu sei que, como o servidor é um contêiner OpenVZ, certas soluções alternativas do iptables precisam ser usadas, como para o openvpn:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $VPN_SN -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING  -s $VPN_SN -o venet0 -j SNAT --to-source $OUTIP

Isso funciona bem. Eu também posso redirecionar o tráfego destinado ao servidor de uma porta para outra:

iptables -A INPUT -i venet0 -d $EXTIP -p tcp --dport 80 -m state --state NEW -j ACCEPT
$IPT -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j REDIRECT --to-port 9001
iptables -A INPUT -i venet0 -p tcp --dport 9001 -j ACCEPT

Isso também funciona, embora eu prefira não ter a porta de destino (9001) aberta ao mundo, mas não consegui fazê-la funcionar de outra forma. O que eu não consigo trabalhar é o encaminhamento do tráfego destinado ao IP público do servidor ($ EXT_IP no exemplo acima) em uma determinada porta para um dos clientes VPN. Eu tentei fazer isso de várias maneiras diferentes. (Eu também estou querendo saber se a topologia ponto-a-ponto está complicando isso?) Eu tentei usar regras como descrito em outro segmento:

$IPT -A INPUT -p tcp -d $OUTIP --dport 15555 -j ACCEPT
$IPT -A FORWARD -i venet0 -p tcp --dport 15555 -j ACCEPT
$IPT -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 15555 -j DNAT --to-destination 10.8.0.6:15555

(OUTIP significa endereço IP de saída ou endereço de venet0: 1. O tráfego VPN é roteado por venet0: 0 para venet0: 1)

Em seguida, configuro um ouvinte de netcat: nc -l 0.0.0.0 -p 15555

E usei este site para testar a conexão, que finalmente mostrou algum progresso:

invalid connection to [10.8.0.6] from (UNKNOWN) [66.240.174.69] 55814

Agora, pelo menos, eu sei que o tráfego está sendo encaminhado, o que é um começo. Então eu pensei que talvez eu deva adicionar uma regra de pós-venda para que o tráfego saiba onde ser mandado de volta para

$IPT -A POSTROUTING -t nat -p tcp -d 10.8.0.6 --dport 15555 -j SNAT --to-source $OUT_IP:15555

Eu tenho o mesmo resultado. Eu sou tão frustrada por quantas horas eu gastei tentando encaminhar uma porta dang para um cliente. Eu apreciaria seriamente alguma ajuda!

    
por Chev_603 11.06.2015 / 05:34

1 resposta

2

Eu finalmente consegui que isso funcionasse. Acontece que os pacotes não estavam sendo encaminhados pelo servidor. Acabei precisando dessas regras abaixo. Eu escrevi este pequeno script para ativar / desativar a regra de encaminhamento de porta.

## Port Forwarding to Client ##
fwd_EN="false" # Change to 'true' to enable
ext_if="venet0" # 
int_if="tun0" # 
int_ip="10.9.0.6" # client to forward to
int_PRT="15555"

if [[ $fwd_EN == "true" ]]; then

echo Warning: Port Forwarding enabled

$IPT -t nat -A PREROUTING -p tcp -i $ext_if --dport $int_PRT -j DNAT --to-dest $int_ip:$int_PRT
$IPT -A FORWARD -p tcp -i $ext_if -o $int_if -d $int_ip --dport $int_PRT -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $ext_if -o $int_if -d $int_ip -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $int_if -s $int_ip -o $ext_if -m state --state ESTABLISHED,RELATED -j ACCEPT

else echo Info: Port Forwarding Disabled

fi

Agora posso configurar um ouvinte nc no cliente e, a partir de um host remoto, executar nc 1.2.3.4 15555 e a conexão funciona!

anon@vpnclient:~$ nc -l -v -p 15555
Listening on [0.0.0.0] (family 0, port 15555)
Connection from [x.x.x.x] port 15555 [tcp/*] accepted (family 2, sport 58939)
Can you see me?
yes, I can!
    
por 21.06.2015 / 22:08