![Como criar/configurar VPN usando apenas SSH?](https://rvso.com/image/109238/Como%20criar%2Fconfigurar%20VPN%20usando%20apenas%20SSH%3F.png)
Aqui está o problema que estou tentando resolver. Existe um servidor ("sistema remoto") no qual posso fazer ssh no meu computador local, mas esse sistema remoto não possui conexão com a Internet. Quero fornecer ao sistema remoto acesso à Internet através do meu computador local usando VPN baseada em ssh. Como faço isso? Eu tentei o seguinte, que parece funcionar parcialmente. O que quero dizer com 'funcionamento parcial' é que os pacotes de conexão (pacotes de sincronização) são enviados para o meu computador local, mas não conseguem estabelecer a conexão com a Internet. Estou usando o tcpdump para capturar pacotes no computador local. O computador local e o sistema remoto estão executando o centos 7.
A configuração- Nota: os comandos abaixo são executados em ordem. Os comandos user@remote são executados no servidor remoto e os comandos user@local são executados no computador local.
[usuário@remoto ~]$ endereço IP mostrar 1: lo: mtu 65536 qdisc noqueue estado DESCONHECIDO link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 host de escopo inet 127.0.0.1/8 lo valid_lft para sempre preferido_lft para sempre inet6 ::host de escopo 1/128 valid_lft para sempre preferido_lft para sempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 link/éter AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 escopo global dinâmico eth0 valid_lft 1785seg preferido_lft 1785seg inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 escopo global noprefixroute dinâmico valid_lft 2591987seg preferido_lft 604787seg inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 link de escopo valid_lft para sempre preferido_lft para sempre
[usuário@local ~]$ endereço IP mostrar 1: lo: mtu 65536 qdisc noqueue estado DESCONHECIDO link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 host de escopo inet 127.0.0.1/8 lo valid_lft para sempre preferido_lft para sempre inet6 ::host de escopo 1/128 valid_lft para sempre preferido_lft para sempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 link/éter AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 escopo global dinâmico eth0 valid_lft 1785seg preferido_lft 1785seg inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 escopo global noprefixroute dinâmico valid_lft 2591987seg preferido_lft 604787seg inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 link de escopo valid_lft para sempre preferido_lft para sempre
Crie a interface tun0 nocontrolo remotosistema.
[user@remote ~]$ sudo ip tuntap add tun0 mode tun [usuário@remoto ~]$ endereço IP mostrar 1: lo: mtu 65536 qdisc noqueue estado DESCONHECIDO link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 host de escopo inet 127.0.0.1/8 lo valid_lft para sempre preferido_lft para sempre inet6 ::host de escopo 1/128 valid_lft para sempre preferido_lft para sempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 link/éter AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 escopo global dinâmico eth0 valid_lft 1785seg preferido_lft 1785seg inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 escopo global noprefixroute dinâmico valid_lft 2591987seg preferido_lft 604787seg inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 link de escopo valid_lft para sempre preferido_lft para sempre 3: tun0: mtu 1500 qdisc noop estado DOWN qlen 500 link/nenhum
Crie a interface tun0 nolocalsistema.
[usuário@local ~]$ sudo ip tuntap add tun0 mode tun [usuário@local ~]$ endereço IP mostrar 1: lo: mtu 65536 qdisc noqueue estado DESCONHECIDO link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 host de escopo inet 127.0.0.1/8 lo valid_lft para sempre preferido_lft para sempre inet6 ::host de escopo 1/128 valid_lft para sempre preferido_lft para sempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 link/éter AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 escopo global dinâmico eth0 valid_lft 1785seg preferido_lft 1785seg inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 escopo global noprefixroute dinâmico valid_lft 2591987seg preferido_lft 604787seg inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 link de escopo valid_lft para sempre preferido_lft para sempre 3: tun0: mtu 1500 qdisc noop estado DOWN qlen 500 link/nenhum
Atribua um endereço IP para tun0 e abra-o:
[usuário@local ~]$ sudo endereço ip add 10.0.2.1/30 dev tun0 [usuário@local ~]$ sudo ip link set dev tun0 up [usuário@local ~]$ endereço IP mostrar tun0 3: tun0: mtu 1500 qdisc pfifo_fast estado DOWN qlen 500 link/nenhum inet 10.0.2.1/30 escopo global tun0 valid_lft para sempre preferido_lft para sempre
[usuário@remoto ~]$ sudo endereço ip add 10.0.2.2/30 dev tun0 [user@remote ~]$ sudo ip link set dev tun0 up [usuário@remoto ~]$ endereço IP mostrar tun0 3: tun0: mtu 1500 qdisc pfifo_fast estado DOWN qlen 500 link/nenhum inet 10.0.2.2/30 escopo global tun0 valid_lft para sempre preferido_lft para sempre
Modifique sshd_config nos sistemas remoto e local para ativar o tunelamento:
[usuário@remote ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config PermitTunnel ponto a ponto
[usuário@local ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config PermitTunnel ponto a ponto
Crie o túnel ssh:
[usuário@local ~]$ sudo ssh -f -w0:0 root@remote true Senha do root@remote: [usuário@local ~]$ ps aux | grep root@remoto raiz 1851 0,0 0,0 76112 1348? Ss 23:12 0:00 ssh -f -w0:0 root@remote verdadeiro
Teste o ping em ambos os servidores usando os novos endereços IP:
[usuário@local ~]$ ping 10.0.2.2 -c 2 PING 10.0.2.2 (10.0.2.2) 56(84) bytes de dados. 64 bytes de 10.0.2.2: icmp_seq=1 ttl=64 tempo=1,68 ms 64 bytes de 10.0.2.2: icmp_seq=2 ttl=64 tempo=0,861 ms --- 10.0.2.2 estatísticas de ping --- 2 pacotes transmitidos, 2 recebidos, 0% de perda de pacotes, tempo 1002ms rtt min/média/máx/mdev = 0,861/1,274/1,688/0,415 ms
[usuário@remoto ~]$ ping 10.0.2.1 -c 2 PING 10.0.2.1 (10.0.2.1) 56(84) bytes de dados. 64 bytes de 10.0.2.1: icmp_seq=1 ttl=64 tempo=0,589 ms 64 bytes de 10.0.2.1: icmp_seq=2 ttl=64 tempo=0,889 ms --- 10.0.2.1 estatísticas de ping --- 2 pacotes transmitidos, 2 recebidos, 0% de perda de pacotes, tempo 1000ms rtt min/média/máx/mdev = 0,589/0,739/0,889/0,150 ms
[usuário@remoto ~]$ rota Tabela de roteamento IP do kernel Gateway de destino Genmask Flags Métrica Ref Use Iface gateway padrão 0.0.0.0 UG 100 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 [usuário@remoto ~]$ ip route show padrão via AAA.BBB.CCC.1 dev eth0 proto métrica estática 100 10.0.2.0/30 dev tun0 proto kernel scope link src 10.0.2.2 AAA.BBB.CCC.0/24 dev eth0 proto kernel scope link src AAA.BBB.CCC.31 métrica 100
Obtenha endereços IP do Google:
[usuário@local ~]$ nslookup google.com Servidor: servidor Endereço: servidor#53 Resposta não oficial: Nome: google.com Endereço: 173.194.219.101 Nome: google.com Endereço: 173.194.219.100 Nome: google.com Endereço: 173.194.219.113 Nome: google.com Endereço: 173.194.219.102 Nome: google.com Endereço: 173.194.219.139 Nome: google.com Endereço: 173.194.219.138
IMPORTANTE: Executei o comando acima em um momento diferente e obtive um resultado diferente. Não presuma que sua resposta será igual à minha para o nslookup acima.
Como todos os endereços IP do Google começam com 173.194.219, vamos rotear todos esses endereços IP através do computador local.
[user@remote ~]$ sudo ip route add 173.194.219.0/24 dev tun0 [usuário@remoto ~]$ rota Tabela de roteamento IP do kernel Gateway de destino Genmask Flags Métrica Ref Use Iface gateway padrão 0.0.0.0 UG 100 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 [usuário@remoto ~]$ ip route show padrão via AAA.BBB.CCC.1 dev eth0 proto métrica estática 100 10.0.2.0/30 dev tun0 proto kernel scope link src 10.0.2.2 AAA.BBB.CCC.0/24 dev eth0 proto kernel scope link src AAA.BBB.CCC.31 métrica 100 173.194.219.0/24 link de escopo dev tun0
Habilite ip_forwarding:
[usuário@local ~]$ grep ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 [user@local ~]$ sudo reinicialização da rede de serviço Reiniciando a rede (via systemctl): [OK]
Configure a captura de pacotes no computador local usando tcpdump:
[user@local ~]$ sudo tcpdump -nn -vv 'porta não 22' -i qualquer tcpdump: ouvindo em qualquer tipo de link LINUX_SLL (Linux cozido), tamanho de captura 65535 bytes
Tente se conectar ao Google a partir de um servidor remoto.
[usuário@remoto ~]$ openssl s_client -connect google.com:443 soquete: Sem rota para hospedar conectar:errno=113
Assim que o comando openssl é executado no servidor remoto, o tcpdump captura alguns pacotes:
10.0.2.2.52768 > 173.194.219.102.443: Flags [S], cksum 0x8702 (correto), seq 994650730, win 29200, opções [mss 1460,sackOK,TS val 7701438 ecr 0,nop,wscale 7], comprimento 0 00:49:33.247753 IP (tos 0x0, ttl 64, id 46037, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.48774 > 173.194.219.100.443: Flags [S], cksum 0x47a7 (correto), seq 2218733674, win 29200, opções [mss 1460,sackOK,TS val 7701439 ecr 0,nop,wscale 7], comprimento 0 00:49:33.247883 IP (tos 0xc0, ttl 64, id 9538, deslocamento 0, sinalizadores [nenhum], proto ICMP (1), comprimento 88) 10.0.2.1 > 10.0.2.2: Host ICMP 173.194.219.100 inacessível - admin proibido, comprimento 68 IP (tos 0x0, ttl 63, id 46037, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.48774 > 173.194.219.100.443: Flags [S], cksum 0x47a7 (correto), seq 2218733674, win 29200, opções [mss 1460,sackOK,TS val 7701439 ecr 0,nop,wscale 7], comprimento 0 00:49:33.253068 IP (tos 0x0, ttl 64, id 26282, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.51312 > 173.194.219.101.443: Flags [S], cksum 0x6ff8 (correto), seq 2634016105, win 29200, opções [mss 1460,sackOK,TS val 7701443 ecr 0,nop,wscale 7], comprimento 0 00:49:33.254771 IP (tos 0xc0, ttl 64, id 9539, deslocamento 0, sinalizadores [nenhum], proto ICMP (1), comprimento 88) 10.0.2.1 > 10.0.2.2: Host ICMP 173.194.219.101 inacessível - admin proibido, comprimento 68 IP (tos 0x0, ttl 63, id 26282, deslocamento 0, flags [DF], proto TCP (6), comprimento 60) 10.0.2.2.51312 > 173.194.219.101.443: Flags [S], cksum 0x6ff8 (correto), seq 2634016105, win 29200, opções [mss 1460,sackOK,TS val 7701443 ecr 0,nop,wscale 7], comprimento 0 00:49:33.258805 IP (tos 0x0, ttl 64, id 9293, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.33686 > 173.194.219.139.443: Flags [S], cksum 0x542b (correto), seq 995927943, win 29200, opções [mss 1460,sackOK,TS val 7701450 ecr 0,nop,wscale 7], comprimento 0 00:49:33.258845 IP (tos 0xc0, ttl 64, id 9540, deslocamento 0, sinalizadores [nenhum], proto ICMP (1), comprimento 88) 10.0.2.1 > 10.0.2.2: Host ICMP 173.194.219.139 inacessível - admin proibido, comprimento 68 IP (tos 0x0, ttl 63, id 9293, deslocamento 0, flags [DF], proto TCP (6), comprimento 60) 10.0.2.2.33686 > 173.194.219.139.443: Flags [S], cksum 0x542b (correto), seq 995927943, win 29200, opções [mss 1460,sackOK,TS val 7701450 ecr 0,nop,wscale 7], comprimento 0 ^ C 13 pacotes capturados 13 pacotes recebidos por filtro 0 pacotes descartados pelo kernel
Os pacotes capturados usando tcpdump sugerem que é feita uma tentativa de estabelecer a conexão (pacotes de sincronização são enviados), mas nada é recebido. Também há uma mensagem 10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68
que parece sugerir um problema.
Alguma sugestão sobre como contornar esse problema? Existem regras de iptable que precisam ser adicionadas? Algum problema de firewall (firewall-d?).
Nota 1
Saída do iptables-save:
[usuário@local ~]$ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0 [usuário@local ~]$ sudo iptables-save # Gerado por iptables-save v1.4.21 em sábado, 15 de abril, 01:40:57 de 2017 *nat :PRÉ-ROTE ACEITAR [35:8926] :ENTRADA ACEITAR [1:84] :SAÍDA ACEITA [6:439] :POSTROUTING ACEITAR [6:439] :OUTPUT_direct - [0:0] :POSTROUTING_ZONES - [0:0] :POSTROUTING_ZONES_SOURCE - [0:0] :POSTROUTING_direct - [0:0] :POST_public - [0:0] :POST_public_allow - [0:0] :POST_public_deny - [0:0] :POST_public_log - [0:0] :PREROUTING_ZONES - [0:0] :PREROUTING_ZONES_SOURCE - [0:0] :PREROUTING_direct - [0:0] :PRE_público - [0:0] :PRE_public_allow - [0:0] :PRE_public_deny - [0:0] :PRE_public_log - [0:0] -A PREROUTING -j PREROUTING_direct -A PRÉ-ROUTING -j PREROUTING_ZONES_SOURCE -A PRÉ-ROUTING -j PREROUTING_ZONES -A SAÍDA -j SAÍDA_direto -A POSTROUTING -j POSTROUTING_direct -A POSTROUTING -j POSTROUTING_ZONES_SOURCE -A POSTROUTING -j POSTROUTING_ZONES -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.0/30 -j MASQUERADA -A POSTROUTING_ZONES -o eth0 -g POST_public -A POSTROUTING_ZONES -g POST_public -A POST_public -j POST_public_log -A POST_public -j POST_public_deny -A POST_public -j POST_public_allow -A PREROUTING_ZONES -i eth0 -g PRE_public -A PREROUTING_ZONES -g PRE_public -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow COMPROMETER-SE # Concluído em sábado, 15 de abril, 01:40:57 de 2017 # Gerado por iptables-save v1.4.21 em sábado, 15 de abril, 01:40:57 de 2017 *mangle :PRÉ-ROTE ACEITAR [169:18687] :ENTRADA ACEITAR [144:11583] :AVANÇAR ACEITAR [0:0] :SAÍDA ACEITA [80:8149] :POSTROUTING ACEITAR [80:8149] :FORWARD_direto - [0:0] :INPUT_direct - [0:0] :OUTPUT_direct - [0:0] :POSTROUTING_direct - [0:0] :PREROUTING_ZONES - [0:0] :PREROUTING_ZONES_SOURCE - [0:0] :PREROUTING_direct - [0:0] :PRE_público - [0:0] :PRE_public_allow - [0:0] :PRE_public_deny - [0:0] :PRE_public_log - [0:0] -A PREROUTING -j PREROUTING_direct -A PRÉ-ROUTING -j PREROUTING_ZONES_SOURCE -A PRÉ-ROUTING -j PREROUTING_ZONES -A ENTRADA -j INPUT_direct -A FORWARD -j FORWARD_direct -A SAÍDA -j SAÍDA_direto -A POSTROUTING -j POSTROUTING_direct -A PREROUTING_ZONES -i eth0 -g PRE_public -A PREROUTING_ZONES -g PRE_public -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow COMPROMETER-SE # Concluído em sábado, 15 de abril, 01:40:57 de 2017 # Gerado por iptables-save v1.4.21 em sábado, 15 de abril, 01:40:57 de 2017 *segurança :ENTRADA ACEITAR [2197:163931] :AVANÇAR ACEITAR [0:0] :SAÍDA ACEITA [1229:185742] :FORWARD_direto - [0:0] :INPUT_direct - [0:0] :OUTPUT_direct - [0:0] -A ENTRADA -j INPUT_direct -A FORWARD -j FORWARD_direct -A SAÍDA -j SAÍDA_direto COMPROMETER-SE # Concluído em sábado, 15 de abril, 01:40:57 de 2017 # Gerado por iptables-save v1.4.21 em sábado, 15 de abril, 01:40:57 de 2017 *cru :PRÉ-ROTE ACEITAR [2362:184437] :SAÍDA ACEITA [1229:185742] :OUTPUT_direct - [0:0] :PREROUTING_direct - [0:0] -A PREROUTING -j PREROUTING_direct -A SAÍDA -j SAÍDA_direto COMPROMETER-SE # Concluído em sábado, 15 de abril, 01:40:57 de 2017 # Gerado por iptables-save v1.4.21 em sábado, 15 de abril, 01:40:57 de 2017 *filtro :ENTRADA ACEITAR [0:0] :AVANÇAR ACEITAR [0:0] :SAÍDA ACEITA [80:8149] :FORWARD_IN_ZONES - [0:0] :FORWARD_IN_ZONES_SOURCE - [0:0] :FORWARD_OUT_ZONES - [0:0] :FORWARD_OUT_ZONES_SOURCE - [0:0] :FORWARD_direto - [0:0] :FWDI_public - [0:0] :FWDI_public_allow - [0:0] :FWDI_public_deny - [0:0] :FWDI_public_log - [0:0] :FWDO_public - [0:0] :FWDO_public_allow - [0:0] :FWDO_public_deny - [0:0] :FWDO_public_log - [0:0] :INPUT_ZONES - [0:0] :INPUT_ZONES_SOURCE - [0:0] :INPUT_direct - [0:0] :IN_public - [0:0] :IN_public_allow - [0:0] :IN_public_deny - [0:0] :IN_public_log - [0:0] :OUTPUT_direct - [0:0] -A ENTRADA -m conntrack --ctstate RELACIONADO, ESTABELECIDO -j ACEITAR -A ENTRADA -i lo -j ACEITAR -A ENTRADA -j INPUT_direct -A ENTRADA -j INPUT_ZONES_SOURCE -A ENTRADA -j INPUT_ZONES -A INPUT -m conntrack --ctstate INVÁLIDO -j DROP -A INPUT -j REJECT --reject-with icmp-host-proibido -A FORWARD -m conntrack --ctstate RELACIONADO, ESTABELECIDO -j ACEITAR -A FRENTE -i lo -j ACEITAR -A FORWARD -j FORWARD_direct -A FRENTE -j FORWARD_IN_ZONES_SOURCE -A FRENTE -j FORWARD_IN_ZONES -A FORWARD -j FORWARD_OUT_ZONES_SOURCE -A FRENTE -j FORWARD_OUT_ZONES -A FORWARD -m conntrack --ctstate INVÁLIDO -j DROP -A FORWARD -j REJECT --reject-with icmp-host-proibido -A SAÍDA -j SAÍDA_direto -A FORWARD_IN_ZONES -i eth0 -g FWDI_public -A FORWARD_IN_ZONES -g FWDI_public -A FORWARD_OUT_ZONES -o eth0 -g FWDO_public -A FORWARD_OUT_ZONES -g FWDO_public -A FWDI_public -j FWDI_public_log -A FWDI_public -j FWDI_public_deny -A FWDI_public -j FWDI_public_allow -A FWDI_public -p icmp -j ACEITAR -A FWDO_public -j FWDO_public_log -A FWDO_public -j FWDO_public_deny -A FWDO_public -j FWDO_public_allow -A INPUT_ZONES -i eth0 -g IN_public -A INPUT_ZONES -g IN_public -A IN_public -j IN_public_log -A IN_public -j IN_public_deny -A IN_public -j IN_public_allow -A IN_public -p icmp -j ACEITAR -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NOVO -j ACEITAR COMPROMETER-SE # Concluído em sábado, 15 de abril, 01:40:57 de 2017
Nota 2:
Eu configurei um servidor web Apache em um host separado ao qual apenas o servidor local tem acesso. Executei o tcpdump no servidor web escutando na porta 80. Quando executo,
telnet webserver 80
capturo os seguintes pacotes. Este é o comportamento esperado desde que a conexão TCP seja estabelecida (S, S-Ack, Ack).
[user@webserver ~]$ sudo tcpdump -nn -vv 'porta não 22 e 80' -i eth0 tcpdump: escutando em eth0, tipo de link EN10MB (Ethernet), tamanho de captura 65535 bytes 07:17:30.411474 IP (tos 0x10, ttl 64, id 34376, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) local.server.46710 > web.server.80: Flags [S], cksum 0x8412 (incorreto -> 0x6d96), seq 3018586542, win 29200, opções [mss 1460,sackOK,TS val 3047398 ecr 0,nop,wscale 7] , comprimento 0 07:17:30.411557 IP (tos 0x0, ttl 64, id 0, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) web.server.80 > local.server.46710: Flags [S.], cksum 0x8412 (incorreto -> 0x9114), seq 2651711943, ack 3018586543, win 28960, opções [mss 1460,sackOK,TS val 37704524 ecr 3047398,nop ,wescala 7], comprimento 0 07:17:30.411725 IP (tos 0x10, ttl 64, id 34377, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 52) local.server.46710 > web.server.80: Flags [.], cksum 0x840a (incorreto -> 0x301c), seq 1, ack 1, win 229, opções [nop,nop,TS val 3047398 ecr 37704524], comprimento 0
Quando tento conectar-me ao servidor web a partir do servidor remoto através do servidor local, o tcpdump no servidor web não captura nenhum pacote (nem mesmo o Sync inicial), mas o servidor local captura o pacote Sync enviado ao servidor web (veja abaixo). Isso me faz acreditar que algo está impedindo que os pacotes sejam enviados ao servidor web - talvez uma configuração incorreta ou firewall.
[user@local ~]$ sudo tcpdump -nn -vv 'porta não 22 e 80' -i qualquer tcpdump: ouvindo em qualquer tipo de link LINUX_SLL (Linux cozido), tamanho de captura 65535 bytes 02:24:09.135842 IP (tos 0x10, ttl 64, id 38062, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.50558 > web.server.80: Flags [S], cksum 0x668d (correto), seq 69756226, win 29200, opções [mss 1460,sackOK,TS val 4780524 ecr 0,nop,wscale 7], comprimento 0
IMPORTANTE:os pacotes não estão sendo roteados através da eth0, mas em vez disso, é feita uma tentativa de enviar os pacotes para o servidor web via tun0 (que falha). Posso confirmar isso executando o tcpdump na interface tun0:
[user@local ~]$ sudo tcpdump -nn -vv 'porta não 22 e 80' -i tun0 tcpdump: escutando em tun0, tipo link RAW (Raw IP), tamanho de captura 65535 bytes 02:28:10.295972 IP (tos 0x10, ttl 64, id 46976, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.50560 > webserver.80: Flags [S], cksum 0xd560 (correto), seq 605366388, win 29200, opções [mss 1460,sackOK,TS val 5021684 ecr 0,nop,wscale 7], comprimento 0
Nota 3:
Desliguei o firewalld no computador local e os pacotes de sincronização foram recebidos pelo servidor web.
[usuário@local ~]$ sudo systemctl parar firewalld
[user@webserver ~]$ sudo tcpdump -nn -vv 'porta não 22 e 80' -i eth0 tcpdump: escutando em eth0, tipo de link EN10MB (Ethernet), tamanho de captura 65535 bytes 08:25:17.390912 IP (tos 0x10, ttl 63, id 61767, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.50580 > web.server.80: Flags [S], cksum 0x30dc (correto), seq 2601927549, win 29200, opções [mss 1460,sackOK,TS val 7123514 ecr 0,nop,wscale 7], comprimento 0 08:25:17.391003 IP (tos 0x0, ttl 64, id 0, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) web.server.80 > 10.0.2.2.50580: Flags [S.], cksum 0x4e23 (incorreto -> 0xa316), seq 959115533, ack 2601927550, win 28960, opções [mss 1460,sackOK,TS val 41771503 ecr 7123514, não, não ,wescala 7], comprimento 0 08:25:17.391192 IP (tos 0x0, ttl 128, id 60032, deslocamento 0, sinalizadores [nenhum], proto TCP (6), comprimento 40) 10.0.2.2.50580 > web.server.80: Flags [R], cksum 0x7339 (correto), seq 2601927550, win 8192, comprimento 0 08:25:18.393794 IP (tos 0x10, ttl 63, id 61768, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) 10.0.2.2.50580 > web.server.80: Flags [S], cksum 0x2cf1 (correto), seq 2601927549, win 29200, opções [mss 1460,sackOK,TS val 7124517 ecr 0,nop,wscale 7], comprimento 0 08:25:18.393898 IP (tos 0x0, ttl 64, id 0, deslocamento 0, sinalizadores [DF], proto TCP (6), comprimento 60) web.server.80 > 10.0.2.2.50580: Flags [S.], cksum 0x4e23 (incorreto -> 0x7e71), seq 974785773, ack 2601927550, win 28960, opções [mss 1460,sackOK,TS val 41772506 ecr 7124517 , não ,wescala 7], comprimento 0 08:25:18.394003 IP (tos 0x0, ttl 128, id 60033, deslocamento 0, sinalizadores [nenhum], proto TCP (6), comprimento 40) 10.0.2.2.50580 > web.server.80: Flags [R], cksum 0x566a (correto), seq 2601927550, win 8192, comprimento 0
Agora, claramente, o IP de origem precisa ser atualizado para corresponder ao endereço IP do servidor local antes que o pacote seja enviado ao servidor web. Como sugerido pelo @xin, o NAT precisa ser configurado no servidor local.
Nota nº 4:
Depois de tentar me conectar ao servidor web, posso ver que a contagem de pacotes para a regra 9 aumenta em 1 (como visto abaixo).
[usuário@local ~]$ sudo iptables -nvL --line-numbers .......... Cadeia FORWARD (política ACCEPT 0 pacotes, 0 bytes) num pacotes bytes alvo prot opt in out origem destino 1 0 0 ACEITAR todos -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELACIONADO, ESTABELECIDO 2 0 0 ACEITAR tudo -- lo * 0.0.0.0/0 0.0.0.0/0 3 1 60 FORWARD_direcionar todos -- * * 0.0.0.0/0 0.0.0.0/0 4 1 60 FORWARD_IN_ZONES_SOURCE todos -- * * 0.0.0.0/0 0.0.0.0/0 5 1 60 FORWARD_IN_ZONES todos -- * * 0.0.0.0/0 0.0.0.0/0 6 1 60 FORWARD_OUT_ZONES_SOURCE todos -- * * 0.0.0.0/0 0.0.0.0/0 7 1 60 FORWARD_OUT_ZONES todos -- * * 0.0.0.0/0 0.0.0.0/0 8 0 0 DROP tudo -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVÁLIDO 9 1 60 REJEITAR tudo -- * * 0.0.0.0/0 0.0.0.0/0 rejeitar com icmp-host-proibido .......... [usuário@local ~]$ sudo iptables -D FORWARD 9
Depois que a regra 9 da cadeia FORWARD for excluída (acima, como sugerido por @xin), posso me conectar ao servidor da web.
[usuário@local ~]$ sudo iptables -nvL --line-numbers .......... Cadeia FORWARD (política ACCEPT 1 pacotes, 60 bytes) num pacotes bytes alvo prot opt in out origem destino 1 12 5857 ACEITAR tudo -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELACIONADO, ESTABELECIDO 2 0 0 ACEITAR tudo -- lo * 0.0.0.0/0 0.0.0.0/0 3 2 120 FORWARD_direcionar todos -- * * 0.0.0.0/0 0.0.0.0/0 4 2 120 FORWARD_IN_ZONES_SOURCE todos -- * * 0.0.0.0/0 0.0.0.0/0 5 2 120 FORWARD_IN_ZONES todos -- * * 0.0.0.0/0 0.0.0.0/0 6 2 120 FORWARD_OUT_ZONES_SOURCE todos -- * * 0.0.0.0/0 0.0.0.0/0 7 2 120 FORWARD_OUT_ZONES todos -- * * 0.0.0.0/0 0.0.0.0/0 8 0 0 DROP tudo -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVÁLIDO ..........
Responder1
O endereço de origem dos pacotes deve ser substituído por um dos endereços da máquina local para que as respostas possam ser recebidas pela máquina local, caso contrário não há (boa) razão para enviar esses pacotes para os próximos roteadores, a resposta não poderá ser capturada de qualquer maneira. iptables MASQUERADE
e SNAT
são úteis para alterar o endereço de origem destes pacotes:
[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0