Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: WHK en 11 Diciembre 2016, 00:37 am



Título: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 00:37 am
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:

Citar
iptables -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?


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: MinusFour en 11 Diciembre 2016, 01:08 am
¿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/


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 01:22 am
No, el servidor host es un servidor dedicado en usa, yo estoy en chile xD


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: MinusFour en 11 Diciembre 2016, 01:55 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
  1. sudo sysctl -w net.ipv4.ip_forward=1

o

Código
  1. echo 1 > /proc/sys/net/ipv4/ip_forward


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 02:53 am
Asi es:

Código:
[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.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: MinusFour en 11 Diciembre 2016, 04:08 am
Pon la lista completa de iptables:

Código
  1. sudo iptables -L

Y la lista de interfaces:

Código
  1. ip a


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 04:42 am
En el host principal:

Código:
[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.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: MinusFour en 11 Diciembre 2016, 05:13 am
Código:
 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
  1. sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 16:55 pm
He eliminado todas las reglas de foward y le he añadido la regla de redirección:

Código:
[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:

Código:
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.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 17:20 pm
Mi tabla NAT

Código:
[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.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: MinusFour en 11 Diciembre 2016, 17:34 pm
Tienes demasiadas cosas en tu tabla de NAT creo. Yo diría que eliminaras todo de la tabla NAT y agregaras las reglas que necesitas... Tus reglas en la otra tabla realmente no hacen nada. Las políticas de cada una de las cadenas está en ACCEPT y todas tus reglas son ACCEPT, entonces tu servidor está aceptando todo, no solo aceptando las reglas que están ahí.

Si la redirección está bien, entonces no se que pudiera estar pasando. Es otra cosa de tu servidor. La regla de masquerade creo que solo debería aplicarse cuando sale de la interfaz virbr0:

Código
  1. sudo iptables -t nat -A POSTROUTING -i virbr0 -o eth0 -j MASQUERADE

Creo también que puede ser un problema de SELinux (porque tu usas CentOS)


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 17:46 pm
Pues veamos, intentaré deshabilitar temporalmente selinux aver si ese es el problema, no me gusta tenerlo deshabilitado, pero veamos aver como va y te cuento.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 11 Diciembre 2016, 18:02 pm
Tampoco es selinux xD en fin, ya veré que puedo seguir probando, por ahora no puedo seguir haciendo las demás instalaciones en el servidor porque la mayoría dependen del acceso por vpn.

Gracias de todas maneras.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 12 Diciembre 2016, 03:15 am
Finalmente lo he logrado!

Primero he deshabilitado selinux en la maquina virtual, luego de eso seguí tu consejo y eliminé todas las reglas de la maquina virtual y del host principal y las hice todo denuevo, despues reinicié ambas maquinas y ahora si funciona :)

Gracias por la paciencia, al parecer si era problema de selinux pero del lado de la maquina virtual.

Saludos.


Título: Re: Como redireccionar puertos entre una maquina virtual y el host principal?
Publicado por: WHK en 12 Diciembre 2016, 03:49 am
Encontré la diferencia entre mis reglas antiguas y las nuevas y he encontrado el problema de raiz que me impidia conectar desde el exterior a demás de selinux:

Código:
hain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1        2   152 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.2     ctstate RELATED,ESTABLISHED

Eso era lo que tenía antes y está claro, jamás le dije que podía aceptar conexiones nuevas por lo cual no podía aceptar conexiones nuevas del puerto abierto xD pero ahora le he agregado el estado NEW y ahora conecta de lujo:

Código:
hain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1        2   152 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.2     ctstate NEW,RELATED,ESTABLISHED

El comando fue este:

Código:
-A FORWARD -d 192.168.122.2 -o virbr0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT