![¿Cómo crear/configurar VPN usando solo SSH?](https://rvso.com/image/109238/%C2%BFC%C3%B3mo%20crear%2Fconfigurar%20VPN%20usando%20solo%20SSH%3F.png)
Aquí está el problema que estoy tratando de resolver. Hay un servidor ("sistema remoto") al que puedo acceder mediante ssh desde mi computadora local, pero este sistema remoto no tiene conexión a Internet. Quiero proporcionarle al sistema remoto acceso a Internet a través de mi computadora local usando una VPN basada en ssh. ¿Cómo logro esto? Intenté lo siguiente, que parece funcionar parcialmente. Lo que quiero decir con "funcionamiento parcial" es que los paquetes de conexión (paquetes de sincronización) se envían a mi computadora local pero no logran establecer la conexión a Internet. Estoy usando tcpdump para capturar paquetes en la computadora local. Tanto la computadora local como el sistema remoto ejecutan centos 7.
La puesta en marcha- Nota: los comandos siguientes se ejecutan en orden. Los comandos usuario@remoto se ejecutan en el servidor remoto y los comandos usuario@local se ejecutan en la computadora local.
[usuario@remoto ~]$ mostrar dirección ip 1: lo: mtu 65536 qdisc noqueue estado DESCONOCIDO enlace/bucle invertido 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 alcance host lo valid_lft para siempre preferido_lft para siempre inet6 ::1/128 host de alcance valid_lft para siempre preferido_lft para siempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 enlace/é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 alcance global dinámico eth0 valid_lft 1785sec preferido_lft 1785sec inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 alcance global noprefixroute dinámico valid_lft 2591987sec preferido_lft 604787sec inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 enlace de alcance valid_lft para siempre preferido_lft para siempre
[usuario@local ~]$ mostrar dirección ip 1: lo: mtu 65536 qdisc noqueue estado DESCONOCIDO enlace/bucle invertido 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 alcance host lo valid_lft para siempre preferido_lft para siempre inet6 ::1/128 host de alcance valid_lft para siempre preferido_lft para siempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 enlace/é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 alcance global dinámico eth0 valid_lft 1785sec preferido_lft 1785sec inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 alcance global noprefixroute dinámico valid_lft 2591987sec preferido_lft 604787sec inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 enlace de alcance valid_lft para siempre preferido_lft para siempre
Cree la interfaz tun0 en elremotosistema.
[usuario@remoto ~]$ sudo ip tuntap agregar modo tun0 tun [usuario@remoto ~]$ mostrar dirección ip 1: lo: mtu 65536 qdisc noqueue estado DESCONOCIDO enlace/bucle invertido 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 alcance host lo valid_lft para siempre preferido_lft para siempre inet6 ::1/128 host de alcance valid_lft para siempre preferido_lft para siempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 enlace/é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 alcance global dinámico eth0 valid_lft 1785sec preferido_lft 1785sec inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 alcance global noprefixroute dinámico valid_lft 2591987sec preferido_lft 604787sec inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 enlace de alcance valid_lft para siempre preferido_lft para siempre 3: tun0: mtu 1500 qdisc noop estado ABAJO qlen 500 enlace/ninguno
Cree la interfaz tun0 en ellocalsistema.
[usuario@local ~]$ sudo ip tuntap agregar modo tun0 tun [usuario@local ~]$ mostrar dirección ip 1: lo: mtu 65536 qdisc noqueue estado DESCONOCIDO enlace/bucle invertido 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 alcance host lo valid_lft para siempre preferido_lft para siempre inet6 ::1/128 host de alcance valid_lft para siempre preferido_lft para siempre 2: eth0: mtu 1500 qdisc pfifo_fast estado UP qlen 1000 enlace/é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 alcance global dinámico eth0 valid_lft 1785sec preferido_lft 1785sec inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 alcance global noprefixroute dinámico valid_lft 2591987sec preferido_lft 604787sec inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 enlace de alcance valid_lft para siempre preferido_lft para siempre 3: tun0: mtu 1500 qdisc noop estado ABAJO qlen 500 enlace/ninguno
Asigne una dirección IP a tun0 y ábrala:
[usuario@local ~]$ sudo ip addr add 10.0.2.1/30 dev tun0 [usuario@local ~]$ sudo ip link set dev tun0 up [usuario@local ~]$ dirección ip show tun0 3: tun0: mtu 1500 qdisc pfifo_fast estado ABAJO qlen 500 enlace/ninguno inet 10.0.2.1/30 alcance global tun0 valid_lft para siempre preferido_lft para siempre
[usuario@remoto ~]$ sudo ip addr add 10.0.2.2/30 dev tun0 [usuario@remoto ~]$ sudo ip link set dev tun0 up [usuario@remoto ~]$ ip addr show tun0 3: tun0: mtu 1500 qdisc pfifo_fast estado ABAJO qlen 500 enlace/ninguno inet 10.0.2.2/30 alcance global tun0 valid_lft para siempre preferido_lft para siempre
Modifique sshd_config tanto en el sistema remoto como en el local para habilitar el túnel:
[usuario@remoto ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config PermitTunnel punto a punto
[usuario@local ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config PermitTunnel punto a punto
Crea el túnel ssh:
[usuario@local ~]$ sudo ssh -f -w0:0 root@remoto verdadero contraseña de root@remote: [usuario@local ~]$ ps aux | grep raíz@remoto raíz 1851 0,0 0,0 76112 1348? Ss 23:12 0:00 ssh -f -w0:0 raíz@remoto verdadero
Pruebe el ping en ambos servidores utilizando las nuevas direcciones IP:
[usuario@local ~]$ ping 10.0.2.2 -c 2 PING 10.0.2.2 (10.0.2.2) 56(84) bytes de datos. 64 bytes de 10.0.2.2: icmp_seq=1 ttl=64 tiempo=1,68 ms 64 bytes de 10.0.2.2: icmp_seq=2 ttl=64 tiempo=0,861 ms --- 10.0.2.2 estadísticas de ping --- 2 paquetes transmitidos, 2 recibidos, 0% de pérdida de paquetes, tiempo 1002 ms rtt mín/promedio/máx/mdesv = 0,861/1,274/1,688/0,415 ms
[usuario@remoto ~]$ ping 10.0.2.1 -c 2 PING 10.0.2.1 (10.0.2.1) 56(84) bytes de datos. 64 bytes de 10.0.2.1: icmp_seq=1 ttl=64 tiempo=0,589 ms 64 bytes de 10.0.2.1: icmp_seq=2 ttl=64 tiempo=0,889 ms --- 10.0.2.1 estadísticas de ping --- 2 paquetes transmitidos, 2 recibidos, 0% de pérdida de paquetes, tiempo 1000 ms rtt mín/promedio/máx/mdesv = 0,589/0,739/0,889/0,150 ms
[usuario@remoto ~]$ ruta Tabla de enrutamiento IP del kernel Destino Gateway Genmask Banderas Métrica Ref Uso Iface puerta de enlace predeterminada 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 [usuario@remoto ~]$ mostrar ruta ip predeterminado a través de AAA.BBB.CCC.1 dev eth0 proto métrica estática 100 10.0.2.0/30 dev tun0 proto kernel alcance enlace src 10.0.2.2 AAA.BBB.CCC.0/24 dev eth0 proto kernel alcance enlace src AAA.BBB.CCC.31 métrica 100
Obtener direcciones IP de Google:
[usuario@local ~]$ nslookup google.com Servidor: servidor Dirección: servidor#53 Respuesta no autorizada: Nombre: google.com Dirección: 173.194.219.101 Nombre: google.com Dirección: 173.194.219.100 Nombre: google.com Dirección: 173.194.219.113 Nombre: google.com Dirección: 173.194.219.102 Nombre: google.com Dirección: 173.194.219.139 Nombre: google.com Dirección: 173.194.219.138
IMPORTANTE: Ejecuté el comando anterior en otro momento y obtuve un resultado diferente. No asuma que su respuesta será la misma que la mía para nslookup arriba.
Dado que todas las direcciones IP de Google comienzan con 173.194.219, enrutemos todas estas direcciones IP a través de la computadora local.
[usuario@remoto ~]$ sudo ip route agregar 173.194.219.0/24 dev tun0 [usuario@remoto ~]$ ruta Tabla de enrutamiento IP del kernel Destino Gateway Genmask Banderas Métrica Ref Uso Iface puerta de enlace predeterminada 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 [usuario@remoto ~]$ mostrar ruta ip predeterminado a través de AAA.BBB.CCC.1 dev eth0 proto métrica estática 100 10.0.2.0/30 dev tun0 proto kernel alcance enlace src 10.0.2.2 AAA.BBB.CCC.0/24 dev eth0 proto kernel alcance enlace src AAA.BBB.CCC.31 métrica 100 Enlace de alcance 173.194.219.0/24 dev tun0
Habilite ip_forwarding:
[usuario@local ~]$ grep ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 [usuario@local ~]$ reinicio de la red del servicio sudo Reiniciando la red (a través de systemctl): [OK]
Configure la captura de paquetes en la computadora local usando tcpdump:
[usuario@local ~]$ sudo tcpdump -nn -vv 'puerto no 22' -i cualquiera tcpdump: escuchando en cualquier tipo de enlace LINUX_SLL (Linux preparado), tamaño de captura 65535 bytes
Intente conectarse a Google desde un servidor remoto.
[usuario@remoto ~]$ openssl s_client -connect google.com:443 socket: No hay ruta al host conectar: error = 113
Tan pronto como se ejecuta el comando openssl en el servidor remoto, tcpdump captura algunos paquetes:
10.0.2.2.52768 > 173.194.219.102.443: Banderas [S], cksum 0x8702 (correcto), seq 994650730, win 29200, opciones [mss 1460,sackOK,TS val 7701438 ecr 0,nop,wscale 7], longitud 0 00:49:33.247753 IP (tos 0x0, ttl 64, id 46037, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.48774 > 173.194.219.100.443: Banderas [S], cksum 0x47a7 (correcto), seq 2218733674, win 29200, opciones [mss 1460,sackOK,TS val 7701439 ecr 0,nop,wscale 7], longitud 0 00:49:33.247883 IP (tos 0xc0, ttl 64, id 9538, desplazamiento 0, banderas [ninguna], proto ICMP (1), longitud 88) 10.0.2.1 > 10.0.2.2: host ICMP 173.194.219.100 inalcanzable - administrador prohibido, longitud 68 IP (tos 0x0, ttl 63, id 46037, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.48774 > 173.194.219.100.443: Banderas [S], cksum 0x47a7 (correcto), seq 2218733674, win 29200, opciones [mss 1460,sackOK,TS val 7701439 ecr 0,nop,wscale 7], longitud 0 00:49:33.253068 IP (tos 0x0, ttl 64, id 26282, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.51312 > 173.194.219.101.443: Banderas [S], cksum 0x6ff8 (correcto), seq 2634016105, win 29200, opciones [mss 1460,sackOK,TS val 7701443 ecr 0,nop,wscale 7], longitud 0 00:49:33.254771 IP (tos 0xc0, ttl 64, id 9539, desplazamiento 0, banderas [ninguna], proto ICMP (1), longitud 88) 10.0.2.1 > 10.0.2.2: host ICMP 173.194.219.101 inalcanzable - administrador prohibido, longitud 68 IP (tos 0x0, ttl 63, id 26282, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.51312 > 173.194.219.101.443: Banderas [S], cksum 0x6ff8 (correcto), seq 2634016105, win 29200, opciones [mss 1460,sackOK,TS val 7701443 ecr 0,nop,wscale 7], longitud 0 00:49:33.258805 IP (tos 0x0, ttl 64, id 9293, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.33686 > 173.194.219.139.443: Banderas [S], cksum 0x542b (correcto), seq 995927943, win 29200, opciones [mss 1460,sackOK,TS val 7701450 ecr 0,nop,wscale 7], longitud 0 00:49:33.258845 IP (tos 0xc0, ttl 64, id 9540, desplazamiento 0, banderas [ninguna], proto ICMP (1), longitud 88) 10.0.2.1 > 10.0.2.2: host ICMP 173.194.219.139 inalcanzable - administrador prohibido, longitud 68 IP (tos 0x0, ttl 63, id 9293, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.33686 > 173.194.219.139.443: Banderas [S], cksum 0x542b (correcto), seq 995927943, win 29200, opciones [mss 1460,sackOK,TS val 7701450 ecr 0,nop,wscale 7], longitud 0 ^C 13 paquetes capturados 13 paquetes recibidos por filtro 0 paquetes descartados por el kernel
Los paquetes capturados usando tcpdump sugieren que se intenta establecer la conexión (se envían paquetes de sincronización) pero no se recibe nada. También hay un mensaje 10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68
que parece sugerir un problema.
¿Alguna sugerencia sobre cómo solucionar este problema? ¿Hay reglas de iptable que deban agregarse? ¿Algún problema con el firewall (firewall-d?).
Nota 1
Salida de iptables-save:
[usuario@local ~]$ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASCARADA -o eth0 [usuario@local ~]$ sudo iptables-save # Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017 *nat :PRERUTAMIENTO ACEPTAR [35:8926] :ENTRADA ACEPTAR [1:84] :SALIDA ACEPTAR [6:439] :POSTRUTAR ACEPTAR [6:439] :SALIDA_directa - [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 PREROUTING -j PREROUTING_ZONES_SOURCE -A PREROUTING -j PREROUTING_ZONES -A SALIDA -j SALIDA_directa -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 MASCARADA -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_publico -j PRE_public_deny -A PRE_público -j PRE_público_allow COMPROMETERSE # Completado el sábado 15 de abril 01:40:57 2017 # Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017 *mutilar :PRERUTAMIENTO ACEPTAR [169:18687] :ENTRADA ACEPTAR [144:11583] :ADELANTE ACEPTAR [0:0] :SALIDA ACEPTAR [80:8149] :POSTOUTING ACEPTAR [80:8149] :FORWARD_direct - [0:0] :ENTRADA_directa - [0:0] :SALIDA_directa - [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 PREROUTING -j PREROUTING_ZONES_SOURCE -A PREROUTING -j PREROUTING_ZONES -A ENTRADA -j ENTRADA_directa -A ADELANTE -j ADELANTE_directo -A SALIDA -j SALIDA_directa -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_publico -j PRE_public_deny -A PRE_público -j PRE_público_allow COMPROMETERSE # Completado el sábado 15 de abril 01:40:57 2017 # Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017 *seguridad :ENTRADA ACEPTAR [2197:163931] :ADELANTE ACEPTAR [0:0] :SALIDA ACEPTAR [1229:185742] :FORWARD_direct - [0:0] :ENTRADA_directa - [0:0] :SALIDA_directa - [0:0] -A ENTRADA -j ENTRADA_directa -A ADELANTE -j ADELANTE_directo -A SALIDA -j SALIDA_directa COMPROMETERSE # Completado el sábado 15 de abril 01:40:57 2017 # Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017 *crudo :PRERUTAMIENTO ACEPTAR [2362:184437] :SALIDA ACEPTAR [1229:185742] :SALIDA_directa - [0:0] :PREROUTING_direct - [0:0] -A PREROUTING -j PREROUTING_direct -A SALIDA -j SALIDA_directa COMPROMETERSE # Completado el sábado 15 de abril 01:40:57 2017 # Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017 *filtrar :ENTRADA ACEPTAR [0:0] :ADELANTE ACEPTAR [0:0] :SALIDA ACEPTAR [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_direct - [0:0] :FWDI_público - [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] :ENTRADA_ZONAS - [0:0] :INPUT_ZONES_SOURCE - [0:0] :ENTRADA_directa - [0:0] :IN_public - [0:0] :IN_public_allow - [0:0] :IN_public_deny - [0:0] :IN_public_log - [0:0] :SALIDA_directa - [0:0] -A ENTRADA -m conntrack --ctstate RELACIONADO,ESTABLECIDO -j ACEPTAR -A ENTRADA -i lo -j ACEPTAR -A ENTRADA -j ENTRADA_directa -A ENTRADA -j ENTRADA_ZONES_FUENTE -A ENTRADA -j ENTRADA_ZONAS -A ENTRADA -m conntrack --ctstate NO VÁLIDO -j DROP -A ENTRADA -j RECHAZO --rechazar-con icmp-host-prohibido -A ADELANTE -m conntrack --ctstate RELACIONADO,ESTABLECIDO -j ACEPTAR -A ADELANTE -i lo -j ACEPTAR -A ADELANTE -j ADELANTE_directo -A ADELANTE -j ADELANTE_IN_ZONES_SOURCE -A ADELANTE -j ADELANTE_IN_ZONES -A ADELANTE -j FORWARD_OUT_ZONES_SOURCE -A ADELANTE -j FORWARD_OUT_ZONES -A ADELANTE -m conntrack --ctstate NO VÁLIDO -j DROP -A ADELANTE -j RECHAZO --rechazar-con icmp-host-prohibido -A SALIDA -j SALIDA_directa -A FORWARD_IN_ZONES -i eth0 -g FWDI_public -A FORWARD_IN_ZONES -g FWDI_público -A FORWARD_OUT_ZONES -o eth0 -g FWDO_public -A FORWARD_OUT_ZONES -g FWDO_público -A FWDI_público -j FWDI_público_log -A FWDI_público -j FWDI_público_denegar -A FWDI_público -j FWDI_público_allow -A FWDI_public -p icmp -j ACEPTAR -A FWDO_público -j FWDO_público_log -A FWDO_público -j FWDO_público_deny -A FWDO_público -j FWDO_público_allow -A INPUT_ZONES -i eth0 -g IN_public -A ENTRADA_ZONAS -g EN_público -A EN_público -j EN_público_log -A EN_público -j EN_público_denegar -A EN_público -j EN_público_allow -A EN_público -p icmp -j ACEPTAR -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NUEVO -j ACEPTAR COMPROMETERSE # Completado el sábado 15 de abril 01:40:57 2017
Nota 2:
Configuré un servidor web Apache en un host separado al que solo tiene acceso el servidor local. Ejecuté tcpdump en el servidor web escuchando en el puerto 80. Cuando lo ejecuto,
telnet webserver 80
capturo los siguientes paquetes. Este es el comportamiento esperado ya que se establece la conexión TCP (S, S-Ack, Ack).
[usuario@servidor web ~]$ sudo tcpdump -nn -vv 'puerto no 22 ni 80' -i eth0 tcpdump: escuchando en eth0, tipo de enlace EN10MB (Ethernet), tamaño de captura 65535 bytes 07:17:30.411474 IP (tos 0x10, ttl 64, id 34376, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) local.server.46710 > web.server.80: Banderas [S], cksum 0x8412 (incorrecto -> 0x6d96), secuencia 3018586542, win 29200, opciones [mss 1460,sackOK,TS val 3047398 ecr 0,nop,wscale 7] , longitud 0 07:17:30.411557 IP (tos 0x0, ttl 64, id 0, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) web.server.80 > local.server.46710: Banderas [S.], cksum 0x8412 (incorrecto -> 0x9114), secuencia 2651711943, ack 3018586543, win 28960, opciones [mss 1460,sackOK,TS val 37704524 ecr 3047398, nop ,wscale 7], longitud 0 07:17:30.411725 IP (tos 0x10, ttl 64, id 34377, desplazamiento 0, banderas [DF], proto TCP (6), longitud 52) local.server.46710 > web.server.80: Banderas [.], cksum 0x840a (incorrecto -> 0x301c), secuencia 1, ack 1, win 229, opciones [nop,nop,TS val 3047398 ecr 37704524], longitud 0
Cuando intento conectarme al servidor web desde el servidor remoto a través del servidor local, tcpdump en el servidor web no captura ningún paquete (ni siquiera la sincronización inicial), pero el servidor local captura el paquete de sincronización que se envía al servidor web (ver más abajo). Esto me hace creer que algo impide que los paquetes se envíen al servidor web, tal vez una mala configuración o un firewall.
[usuario@local ~]$ sudo tcpdump -nn -vv 'puerto no 22 ni 80' -i cualquiera tcpdump: escuchando en cualquier tipo de enlace LINUX_SLL (Linux preparado), tamaño de captura 65535 bytes 02:24:09.135842 IP (tos 0x10, ttl 64, id 38062, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.50558 > web.server.80: Banderas [S], cksum 0x668d (correcto), secuencia 69756226, win 29200, opciones [mss 1460,sackOK,TS val 4780524 ecr 0,nop,wscale 7], longitud 0
IMPORTANTE:los paquetes no se enrutan a través de eth0 sino que se intenta enviar los paquetes al servidor web a través de tun0 (lo cual falla). Puedo confirmar esto ejecutando tcpdump en la interfaz tun0:
[usuario@local ~]$ sudo tcpdump -nn -vv 'puerto no 22 y 80' -i tun0 tcpdump: escuchando en tun0, tipo de enlace RAW (IP sin formato), tamaño de captura 65535 bytes 02:28:10.295972 IP (tos 0x10, ttl 64, id 46976, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.50560 > webserver.80: Banderas [S], cksum 0xd560 (correcto), secuencia 605366388, win 29200, opciones [mss 1460,sackOK,TS val 5021684 ecr 0,nop,wscale 7], longitud 0
Nota 3:
Apagué el firewalld en la computadora local y el servidor web recibió los paquetes de sincronización.
[usuario@local ~]$ sudo systemctl detener firewalld
[usuario@servidor web ~]$ sudo tcpdump -nn -vv 'puerto no 22 ni 80' -i eth0 tcpdump: escuchando en eth0, tipo de enlace EN10MB (Ethernet), tamaño de captura 65535 bytes 08:25:17.390912 IP (tos 0x10, ttl 63, id 61767, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.50580 > web.server.80: Banderas [S], cksum 0x30dc (correcto), seq 2601927549, win 29200, opciones [mss 1460,sackOK,TS val 7123514 ecr 0,nop,wscale 7], longitud 0 08:25:17.391003 IP (tos 0x0, ttl 64, id 0, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) web.server.80 > 10.0.2.2.50580: Banderas [S.], cksum 0x4e23 (incorrecto -> 0xa316), seq 959115533, ack 2601927550, win 28960, opciones [mss 1460,sackOK,TS val 41771503 ecr 14, no ,wscale 7], longitud 0 08:25:17.391192 IP (tos 0x0, ttl 128, id 60032, desplazamiento 0, banderas [ninguna], proto TCP (6), longitud 40) 10.0.2.2.50580 > web.server.80: Banderas [R], cksum 0x7339 (correcto), secuencia 2601927550, win 8192, longitud 0 08:25:18.393794 IP (tos 0x10, ttl 63, id 61768, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) 10.0.2.2.50580 > web.server.80: Banderas [S], cksum 0x2cf1 (correcto), secuencia 2601927549, win 29200, opciones [mss 1460,sackOK,TS val 7124517 ecr 0,nop,wscale 7], longitud 0 08:25:18.393898 IP (tos 0x0, ttl 64, id 0, desplazamiento 0, banderas [DF], proto TCP (6), longitud 60) web.server.80 > 10.0.2.2.50580: Banderas [S.], cksum 0x4e23 (incorrecto -> 0x7e71), seq 974785773, ack 2601927550, win 28960, opciones [mss 1460,sackOK,TS val 41772506 ecr 7124 517, no ,wscale 7], longitud 0 08:25:18.394003 IP (tos 0x0, ttl 128, id 60033, desplazamiento 0, banderas [ninguna], proto TCP (6), longitud 40) 10.0.2.2.50580 > web.server.80: Banderas [R], cksum 0x566a (correcto), secuencia 2601927550, win 8192, longitud 0
Ahora claramente, la IP de origen debe actualizarse para que coincida con la dirección IP del servidor local antes de que el paquete se envíe al servidor web. Como sugirió @xin, NAT debe configurarse en el servidor local.
Nota #4:
Una vez que intento conectarme al servidor web, puedo ver que el recuento de paquetes para la regla 9 aumenta en 1 (como se ve a continuación).
[usuario@local ~]$ sudo iptables -nvL --números de línea .......... Cadena ADELANTE (política ACEPTAR 0 paquetes, 0 bytes) núm paquetes bytes destino prot opt in out fuente destino 1 0 0 ACEPTAR todo -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELACIONADO, ESTABLECIDO 2 0 0 ACEPTAR todo -- lo * 0.0.0.0/0 0.0.0.0/0 3 1 60 FORWARD_direct 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 all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NO VÁLIDO 9 1 60 RECHAZAR todo -- * * 0.0.0.0/0 0.0.0.0/0 rechazar-con icmp-host-prohibido .......... [usuario@local ~]$ sudo iptables -D ADELANTE 9
Una vez que se elimina la regla 9 de la cadena FORWARD (desde arriba, como sugirió @xin), puedo conectarme al servidor web.
[usuario@local ~]$ sudo iptables -nvL --números de línea .......... Cadena ADELANTE (política ACEPTAR 1 paquete, 60 bytes) núm paquetes bytes destino prot opt in out fuente destino 1 12 5857 ACEPTAR todo -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELACIONADO, ESTABLECIDO 2 0 0 ACEPTAR todo -- lo * 0.0.0.0/0 0.0.0.0/0 3 2 120 FORWARD_direct 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 all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NO VÁLIDO ..........
Respuesta1
La dirección de origen de los paquetes debe reemplazarse por una dirección de la máquina local para que la máquina local pueda recibir las respuestas; de lo contrario, no hay (buena) razón para enviar estos paquetes a los siguientes enrutadores, la respuesta no se pudo capturar de todos modos. iptables MASQUERADE
y SNAT
son útiles para cambiar la dirección de origen de estos paquetes:
[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0