¿Cómo crear / configurar vpn usando solo SSH?

9

Aquí está el problema que estoy tratando de resolver. Hay un servidor ("sistema remoto") en el que puedo ingresar desde mi computadora local, pero este sistema remoto no tiene conexión a Internet. Quiero proporcionar al sistema remoto acceso a Internet a través de mi computadora local utilizando una VPN basada en ssh. ¿Cómo logro esto? He intentado lo siguiente, que parece funcionar parcialmente. Lo que quiero decir con "trabajo parcial" es que los paquetes de conexión (paquetes de sincronización) se envían a mi computadora local pero no pueden establecer la conexión a Internet. Estoy usando tcpdump para capturar paquetes en la computadora local. La computadora local y el sistema remoto están ejecutando centos 7.

La configuración - Nota: los comandos a continuación se ejecutan en orden. Los comandos user @ remote se ejecutan en el servidor remoto y los comandos user @ local se ejecutan en la computadora local.

[usuario @ remoto ~] $ ip addr show
1: lo: mtu 65536 qdisc noqueue state DESCONOCIDO 
    enlace / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 ámbito host lo
       válido_lft para siempre preferido_lft para siempre
    inet6 :: host de alcance 1/128 
       válido_lft para siempre preferido_lft para siempre
2: eth0: mtu 1500 qdisc pfifo_fast state 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 preferred_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 alcance global noprefixroute dinámico 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: enlace de alcance LLLL / 64 
       válido_lft para siempre preferido_lft para siempre
[usuario @ local ~] $ ip addr show
1: lo: mtu 65536 qdisc noqueue state DESCONOCIDO 
    enlace / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 ámbito host lo
       válido_lft para siempre preferido_lft para siempre
    inet6 :: host de alcance 1/128 
       válido_lft para siempre preferido_lft para siempre
2: eth0: mtu 1500 qdisc pfifo_fast state 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 preferred_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 alcance global noprefixroute dinámico 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: enlace de alcance LLLL / 64 
       válido_lft para siempre preferido_lft para siempre

Cree la interfaz tun0 en el sistema remoto .

[usuario @ remoto ~] $ sudo ip tuntap agregar tun0 mode tun
[usuario @ remoto ~] $ ip addr show
1: lo: mtu 65536 qdisc noqueue state DESCONOCIDO 
    enlace / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 ámbito host lo
       válido_lft para siempre preferido_lft para siempre
    inet6 :: host de alcance 1/128 
       válido_lft para siempre preferido_lft para siempre
2: eth0: mtu 1500 qdisc pfifo_fast state 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 preferred_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 alcance global noprefixroute dinámico 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: enlace de alcance LLLL / 64 
       válido_lft para siempre preferido_lft para siempre
3: tun0: mtu 1500 qdisc noop state DOWN qlen 500
    enlace / ninguno 

Cree la interfaz tun0 en el sistema local .

[usuario @ local ~] $ sudo ip tuntap agregar tun0 mode tun
[usuario @ local ~] $ ip addr show
1: lo: mtu 65536 qdisc noqueue state DESCONOCIDO 
    enlace / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 ámbito host lo
       válido_lft para siempre preferido_lft para siempre
    inet6 :: host de alcance 1/128 
       válido_lft para siempre preferido_lft para siempre
2: eth0: mtu 1500 qdisc pfifo_fast state 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 preferred_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: LLLL / 64 alcance global noprefixroute dinámico 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: enlace de alcance LLLL / 64 
       válido_lft para siempre preferido_lft para siempre
3: tun0: mtu 1500 qdisc noop state DOWN qlen 500
    enlace / ninguno

Asigne una dirección IP a tun0 y tráigalo

[usuario @ local ~] $ sudo ip addr add 10.0.2.1/30 dev tun0
[user @ local ~] $ sudo ip link set dev tun0 up
[usuario @ local ~] $ ip addr show tun0
3: tun0: mtu 1500 qdisc pfifo_fast estado ABAJO qlen 500
    enlace / ninguno 
    inet 10.0.2.1/30 alcance global tun0
       válido_lft para siempre preferido_lft para siempre
[usuario @ remoto ~] $ sudo ip addr add 10.0.2.2/30 dev tun0
[user @ remote ~] $ 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
       válido_lft para siempre preferido_lft para siempre

Modifique sshd_config en los sistemas remotos y locales para habilitar la tunelización:

[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 @ remote true
contraseña de root @ remote: 
[usuario @ local ~] $ ps aux | grep root @ remote
raíz 1851 0.0 0.0 76112 1348? Ss 23:12 0:00 ssh -f -w0: 0 root @ remote true

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 min / avg / max / mdev = 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 1000ms
rtt min / avg / max / mdev = 0.589 / 0.739 / 0.889 / 0.150 ms
[usuario @ remoto ~] $ ruta
Tabla de enrutamiento IP del núcleo
Destination Gateway Genmask Flags Referencia métrica 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 ~] $ ip route show
predeterminado a través de AAA.BBB.CCC.1 dev eth0 proto static metric 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 

Obtenga 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 un momento diferente y obtuve un resultado diferente. No asuma que su respuesta será la misma que la mía para nslookup anterior.

Como todas las direcciones IP de Google comienzan con 173.194.219, enrutemos todas estas direcciones IP a través de la computadora local.

[user @ remote ~] $ sudo ip route add 173.194.219.0/24 dev tun0
[usuario @ remoto ~] $ ruta
Tabla de enrutamiento IP del núcleo
Destination Gateway Genmask Flags Referencia métrica 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 ~] $ ip route show
predeterminado a través de AAA.BBB.CCC.1 dev eth0 proto static metric 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 dev tun0 alcance enlace 

Habilitar ip_forwarding:

[usuario @ local ~] $ grep ip_forward /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[usuario @ local ~] reinicio de red del servicio $ sudo
Reinicio de 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: escucha en cualquier, tipo de enlace LINUX_SLL (Linux cocinado), tamaño de captura 65535 bytes

Intente conectarse a google desde el servidor remoto.

[usuario @ remoto ~] $ openssl s_client -connect google.com:443
zócalo: no hay ruta al host
conectar: ​​errno = 113

Tan pronto como se ejecuta el comando openssl en el servidor remoto, el 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, offset 0, banderas [DF], proto TCP (6), longitud 60)
    10.0.2.2.48774> 173.194.219.100.443: Flags [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, offset 0, flags [none], 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, offset 0, banderas [DF], proto TCP (6), longitud 60)
    10.0.2.2.48774> 173.194.219.100.443: Flags [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, offset 0, banderas [DF], proto TCP (6), longitud 60)
    10.0.2.2.51312> 173.194.219.101.443: Flags [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, offset 0, flags [none], 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: Flags [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, offset 0, flags [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, offset 0, flags [none], 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 núcleo

Los paquetes capturados con 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 68que parece sugerir un problema.

¿Alguna sugerencia sobre cómo solucionar este problema? ¿Hay reglas iptable que deben agregarse? Cualquier problema de 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 MASQUERADA -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
: ACEPTACIÓN DE PREROUTING [35: 8926]
: ACEPTACIÓN DE ENTRADA [1:84]
: ACEPTACIÓN DE SALIDA [6: 439]
: ACEPTACIÓN POSTROUTING [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_public - [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 OUTPUT -j OUTPUT_direct
-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 ZONAS DE PREROUTING -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
COMETER
# Completado el sáb 15 abr 01:40:57 2017
# Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017
*mutilar
: ACEPTACIÓN DE PREROUTING [169: 18687]
: ACEPTACIÓN DE ENTRADA [144: 11583]
: ADELANTE ADELANTE [0: 0]
: ACEPTACIÓN DE SALIDA [80: 8149]
: ACEPTACIÓN POSTROUTING [80: 8149]
: FORWARD_direct - [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_public - [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 INPUT -j INPUT_direct
-A FORWARD -j FORWARD_direct
-A OUTPUT -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A ZONAS DE PREROUTING -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
COMETER
# Completado el sáb 15 abr 01:40:57 2017
# Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017
*seguridad
: ACEPTACIÓN DE ENTRADA [2197: 163931]
: ADELANTE ADELANTE [0: 0]
: ACEPTACIÓN DE SALIDA [1229: 185742]
: FORWARD_direct - [0: 0]
: INPUT_direct - [0: 0]
: OUTPUT_direct - [0: 0]
-A INPUT -j INPUT_direct
-A FORWARD -j FORWARD_direct
-A OUTPUT -j OUTPUT_direct
COMETER
# Completado el sáb 15 abr 01:40:57 2017
# Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017
*crudo
: ACEPTACIÓN DE PREROUTING [2362: 184437]
: ACEPTACIÓN DE SALIDA [1229: 185742]
: OUTPUT_direct - [0: 0]
: PREROUTING_direct - [0: 0]
-A PREROUTING -j PREROUTING_direct
-A OUTPUT -j OUTPUT_direct
COMETER
# Completado el sáb 15 abr 01:40:57 2017
# Generado por iptables-save v1.4.21 el sábado 15 de abril 01:40:57 2017
*filtrar
: ACEPTACIÓN DE ENTRADA [0: 0]
: ADELANTE ADELANTE [0: 0]
: ACEPTACIÓN DE SALIDA [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_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, ESTABLECIDO -j ACEPTAR
-A ENTRADA -i lo -j ACEPTAR
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
-A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A ENTRADA -j RECHAZO --rechazo-con icmp-host-prohibido
-A HACIA ADELANTE -m conntrack --ctstate RELACIONADO, ESTABLECIDO -j ACEPTAR
-A ADELANTE -i lo -j ACEPTAR
-A FORWARD -j FORWARD_direct
-A FORWARD -j FORWARD_IN_ZONES_SOURCE
-A FORWARD -j FORWARD_IN_ZONES
-A FORWARD -j FORWARD_OUT_ZONES_SOURCE
-A FORWARD -j FORWARD_OUT_ZONES
-A ADELANTE -m conntrack --ctstate NO VÁLIDO -j DROP
-A ADELANTE -j RECHAZO --rechazo-con icmp-host-prohibido
-A OUTPUT -j OUTPUT_direct
-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 ACEPTAR
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
-A ZONAS DE ENTRADA -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 ACCEPT
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NUEVO -j ACCEPT
COMETER
# Completado el sáb 15 abr 01:40:57 2017


Nota # 2:
configuré un servidor web Apache en un host separado al que solo el servidor local tiene acceso. Ejecuté tcpdump en el servidor web escuchando en el puerto 80. Cuando ejecuto telnet webserver 80capturo 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 y 80' -i eth0 
tcpdump: escucha en eth0, tipo de enlace EN10MB (Ethernet), tamaño de captura 65535 bytes
07: 17: 30.411474 IP (tos 0x10, ttl 64, id 34376, offset 0, banderas [DF], proto TCP (6), longitud 60)
    local.server.46710> web.server.80: Flags [S], cksum 0x8412 (incorrecto -> 0x6d96), seq 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, offset 0, flags [DF], proto TCP (6), longitud 60)
    web.server.80> local.server.46710: Flags [S.], cksum 0x8412 (incorrecto -> 0x9114), seq 2651711943, ack 3018586543, win 28960, opciones [mss 1460, sackOK, TS val 37704524 ecr 3047398, nop , escala 7], longitud 0
07: 17: 30.411725 IP (tos 0x10, ttl 64, id 34377, offset 0, banderas [DF], proto TCP (6), longitud 52)
    local.server.46710> web.server.80: Flags [.], cksum 0x840a (incorrecto -> 0x301c), seq 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 configuración incorrecta o un firewall.

[usuario @ local ~] $ sudo tcpdump -nn -vv 'puerto no 22 y 80' -i cualquiera
tcpdump: escucha en cualquier, tipo de enlace LINUX_SLL (Linux cocinado), tamaño de captura 65535 bytes
02: 24: 09.135842 IP (tos 0x10, ttl 64, id 38062, offset 0, banderas [DF], proto TCP (6), longitud 60)
    10.0.2.2.50558> web.server.80: Banderas [S], cksum 0x668d (correcto), seq 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 (que falla). Puedo confirmar esto ejecutando tcpdump en la interfaz tun0:

[usuario @ local ~] $ sudo tcpdump -nn -vv 'puerto no 22 y 80' -i tun0
tcpdump: escucha en tun0, tipo de enlace RAW (Raw IP), tamaño de captura 65535 bytes
02: 28: 10.295972 IP (tos 0x10, ttl 64, id 46976, offset 0, flags [DF], proto TCP (6), longitud 60)
    10.0.2.2.50560> servidor web.80: Banderas [S], cksum 0xd560 (correcto), seq 605366388, win 29200, opciones [mss 1460, sackOK, TS val 5021684 ecr 0, nop, wscale 7], longitud 0


Nota # 3:
Apagué firewalld en la computadora local y el servidor web recibió los paquetes de sincronización.

[usuario @ local ~] $ sudo systemctl stop firewalld
[usuario @ servidor web ~] $ sudo tcpdump -nn -vv 'puerto no 22 y 80' -i eth0
tcpdump: escucha en eth0, tipo de enlace EN10MB (Ethernet), tamaño de captura 65535 bytes
08: 25: 17.390912 IP (tos 0x10, ttl 63, id 61767, offset 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, offset 0, flags [DF], proto TCP (6), longitud 60)
    web.server.80> 10.0.2.2.50580: Flags [S.], cksum 0x4e23 (incorrecto -> 0xa316), seq 959115533, ack 2601927550, win 28960, opciones [mss 1460, sackOK, TS val 41771503 ecr 7123514, nop , escala 7], longitud 0
08: 25: 17.391192 IP (tos 0x0, ttl 128, id 60032, offset 0, flags [none], proto TCP (6), longitud 40)
    10.0.2.2.50580> web.server.80: Flags [R], cksum 0x7339 (correcto), seq 2601927550, win 8192, longitud 0
08: 25: 18.393794 IP (tos 0x10, ttl 63, id 61768, offset 0, banderas [DF], proto TCP (6), longitud 60)
    10.0.2.2.50580> web.server.80: Flags [S], cksum 0x2cf1 (correcto), seq 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, offset 0, flags [DF], proto TCP (6), longitud 60)
    web.server.80> 10.0.2.2.50580: Flags [S.], cksum 0x4e23 (incorrecto -> 0x7e71), seq 974785773, ack 2601927550, win 28960, opciones [mss 1460, sackOK, TS val 41772506 ecr 7124517, nop , escala 7], longitud 0
08: 25: 18.394003 IP (tos 0x0, ttl 128, id 60033, offset 0, flags [none], proto TCP (6), longitud 40)
    10.0.2.2.50580> web.server.80: Flags [R], cksum 0x566a (correcto), seq 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 con el servidor web, puedo ver que el conteo de pkts para la regla 9 aumenta en 1 (como se ve a continuación).

[usuario @ local ~] $ sudo iptables -nvL --line-numbers
..........
Chain FORWARD (política ACEPTAR 0 paquetes, 0 bytes)
num pkts bytes objetivo prot opt ​​opt ​​out destino de origen         
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 all - * * 0.0.0.0/0 0.0.0.0/0           
4 1 60 FORWARD_IN_ZONES_SOURCE all - * * 0.0.0.0/0 0.0.0.0/0           
5 1 60 FORWARD_IN_ZONES all - * * 0.0.0.0/0 0.0.0.0/0           
6 1 60 FORWARD_OUT_ZONES_SOURCE all - * * 0.0.0.0/0 0.0.0.0/0           
7 1 60 FORWARD_OUT_ZONES all - * * 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 INVALID
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 --line-numbers
..........
Cadena HACIA ADELANTE (política ACEPTA 1 paquetes, 60 bytes)
num pkts bytes objetivo prot opt ​​opt ​​out destino de origen         
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 all - * * 0.0.0.0/0 0.0.0.0/0           
4 2 120 FORWARD_IN_ZONES_SOURCE all - * * 0.0.0.0/0 0.0.0.0/0           
5 2120 FORWARD_IN_ZONES all - * * 0.0.0.0/0 0.0.0.0/0           
6 2120 FORWARD_OUT_ZONES_SOURCE all - * * 0.0.0.0/0 0.0.0.0/0           
7 2120 FORWARD_OUT_ZONES all - * * 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 INVALID
..........
Ali
fuente

Respuestas:

4

La dirección de origen de los paquetes debe ser reemplazada por una de las direcciones de la máquina local para que las respuestas puedan ser recibidas por la máquina local, de lo contrario no hay una razón (buena) para enviar estos paquetes a los siguientes enrutadores, la respuesta no se pudo capturar de todos modos. iptables MASQUERADEy SNATson ú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
xin
fuente
Gracias por la respuesta @xin. Ejecuté el comando que proporcionaste pero aún recibí la misma respuesta. Ejecuté tcpdump en eth0 y tun0. los paquetes no se enrutan a eth0. tun0 todavía está tratando de llegar a google. ¿Debo de alguna manera enrutar paquetes de tun0 a eth0?
Ali
1
Si la máquina local usa la interfaz eth0 para conectarse a internet, los paquetes deben ir a eth0 incluso sin este comando. Entonces, quizás esté involucrada alguna configuración de firewall. ¿Se puede poner la iptables-savesalida de la máquina local?
Xin
He agregado la salida de iptables-save a la publicación original.
Ali
El cortafuegos necesitaba ser apagado. ¡Ejecuté tu comando después de apagar Firewalld, y la conexión comenzó a funcionar! ¡Aprecio tu ayuda! Consulte las notas en la publicación original para ver el progreso.
Ali
1
buen trabajo. Parece que el problema es la regla iptable -A FORWARD -j REJECT --reject-with icmp-host-prohibited. los paquetes que lleguen a su máquina y tengan la dirección de destino fuera de su máquina, irán a la cadena FORWARD, por lo tanto, descarte esta regla.
xin