Como redireccionar puertos entre una maquina virtual y el host principal?

Iniciado por WHK, 11 Diciembre 2016, 00:37 AM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Hola, actualmente tengo un centos 7 como host y una maquina virtual en kvm (virsh) también con centos 7, en la maquina virtual instalé un openvpn en modo tun por udp y quiero que sea accesible desde internet, por lo cual se me ocurrió que debo publicar el puerto udp:1194 usando el host principal.

He intentado con iptables y he hecho esto:

Citariptables -t nat -A PREROUTING -p udp --dport 1194 -j DNAT --to "192.168.122.2:1194"
iptables -I FORWARD -d "192.168.122.2/32" -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT

Hasta acá todo bien, hice correr el openvpn, el puerto se abre sin problemas, he testeado desde el host principal con:
Citar$ nc -v -u 192.168.122.2 1194

Y abre correctamente, ahora he probado el ruteo:
Citar$ nc -v -u 127.0.0.1 1194

y también conecta correctamente, el problema viene ahora, que quiero conectarme desde el exterior y no puedo, desde mi pc ejecuto:
Citar$ nc -v -u sitio.com 1194

Y no me conecta, por lo cual supuse que iptables me estaba restringiendo y he habilitado la apertura del puerto:
Citar$ iptables -A INPUT -i eth0 -p udp --destination-port 1194 -j ACCEPT

Pero aun sigo sin poder acceder y no se que pueda estar sucediendo :( ¿Qué hice mal?

MinusFour

¿Lo estäs probando desde tu misma red? Si lo estás probando desde tu misma red, usa algun servicio para revisar si el puerto está abierto.

http://www.canyouseeme.org/

WHK

No, el servidor host es un servidor dedicado en usa, yo estoy en chile xD

MinusFour

Cita de: WHK en 11 Diciembre 2016, 01:22 AM
No, el servidor host es un servidor dedicado en usa, yo estoy en chile xD

¿Y estás probando hacer la conexión desde fuera del servidor verdad? ¿No desde una session SSH en tu servidor o algo así?

¿Estás seguro que la interfaz es eth0? Si vas a usar IP forwarding vas a necesitar activarlo también (no se si en centos sea igual).

Código (bash) [Seleccionar]

sudo sysctl -w net.ipv4.ip_forward=1


o

Código (bash) [Seleccionar]

echo 1 > /proc/sys/net/ipv4/ip_forward

WHK

Asi es:

[root@machine ~]# cat /etc/sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# Disable IPv6 autoconf
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.eth0.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.eth0.accept_ra = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.ip_forward = 1
[root@machine ~]# cat /proc/sys/net/ipv4/ip_forward
1


He intentado conectarme desde el exterior y nada.

MinusFour

Pon la lista completa de iptables:

Código (bash) [Seleccionar]

sudo iptables -L


Y la lista de interfaces:

Código (bash) [Seleccionar]

ip a

WHK

En el host principal:

[code][root@machine ~]# iptables -vnL
Chain INPUT (policy ACCEPT 156K packets, 398M bytes)
pkts bytes target     prot opt in     out     source               destination         
4491  280K ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
  128 41984 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
92369 8828K ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW,ESTABLISHED
1779K  219M ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW,ESTABLISHED
56949 5700K ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 state NEW,ESTABLISHED
    0     0 ACCEPT     udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:1194 state NEW,ESTABLISHED
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1194 state NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
165K 1434M ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
113K 6269K ACCEPT     all  --  virbr0 *       192.168.123.0/24     0.0.0.0/0           
   24  7872 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
2525  106K REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
  124  5143 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.122.2        state NEW udp dpt:1194

Chain OUTPUT (policy ACCEPT 476K packets, 465M bytes)
pkts bytes target     prot opt in     out     source               destination         
  128 42874 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68

[root@machine ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 200.200.200.200/24 brd 200.200.200.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
5: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
7: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 500
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
9: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 500
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
15: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 500
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
16: vnet3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 500
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
18: vnet4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 500
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
[/code]

He ocultado la ip pública real por 200.200.200.200 y la dirección mac de todas las interfaces por xx:xx:xx:xx:xx:xx.

MinusFour

#7

2525  106K REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
 124  5143 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.122.2        state NEW udp dpt:1194


¿Será el orden aquí?

Dice ahi que rechaza todos los paquetes a la interfaz virbr0 (que me imagino es la interfaz virtual con la que te comunicas con el guest) y no esta pasando a la siguiente regla.

Tambien necesitas hacer MASQUERADE porque los paquetes que van saliendo de la interfaz virbr0 salen con la ip privada. Si no lo haces, los paquetes que lleguen a tu equipo van a llegar con el SRC de la ip privada.

Código (bash) [Seleccionar]

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

WHK

He eliminado todas las reglas de foward y le he añadido la regla de redirección:

[root@machine ~]# iptables -vnL
Chain INPUT (policy ACCEPT 103 packets, 72552 bytes)
pkts bytes target     prot opt in     out     source               destination        
7325  455K ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
   0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
 284 93152 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
   0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
109K   11M ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW,ESTABLISHED
2335K  291M ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW,ESTABLISHED
79028 7864K ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 state NEW,ESTABLISHED
   0     0 ACCEPT     udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:1194 state NEW,ESTABLISHED
   0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1194 state NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT 2 packets, 140 bytes)
pkts bytes target     prot opt in     out     source               destination        
   2    84 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.122.2       state NEW udp dpt:1194

Chain OUTPUT (policy ACCEPT 234 packets, 103K bytes)
pkts bytes target     prot opt in     out     source               destination        
 284 95163 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68


He agregado:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p "${PROTO}" --dport "${HOST_PORT}" -j DNAT --to "${GUEST_IPADDR}:${GUEST_PORT}"
iptables -I FORWARD -d "${GUEST_IPADDR}/32" -p "${PROTO}" -m state --state NEW -m "${PROTO}" --dport "${GUEST_PORT}" -j ACCEPT
iptables -A INPUT -i eth0 -p "${PROTO}" --destination-port 1194 -j ACCEPT


Pero nada :-/ , si me conecto desde el host principal (el dedicado) a localhost me conecta bien, quiere decir que la redirección está bien hecha pero solo funciona dentro del servidor como si la redirección hubiese sido hecha a localhost porque desde el exterior no puedo acceder.

Por otro lado si puedo acceder a otros puertos del servidor sin problemas.

WHK

Mi tabla NAT

[root@machine ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 2 packets, 104 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1       20   827 DNAT       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1194 to:192.168.122.2:1194

Chain INPUT (policy ACCEPT 2 packets, 104 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 3 packets, 204 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain POSTROUTING (policy ACCEPT 2 packets, 132 bytes)
num   pkts bytes target      prot opt in     out     source               destination        
1        0     0 RETURN      all  --  *      *       192.168.122.0/24     224.0.0.0/24        
2        0     0 RETURN      all  --  *      *       192.168.122.0/24     255.255.255.255    
3       30  1800 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
4       22  1672 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
5        0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
6     1066  242K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0          


He reemplazado la ip original de la maquina virtual y del rango de ip por 192.168.1.122 ya que mi rango es distinto, pero no influye en el problema ya que no entra en conflicto con ningún otro rango.