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?
¿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/
No, el servidor host es un servidor dedicado en usa, yo estoy en chile xD
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).
sudo sysctl -w net.ipv4.ip_forward=1
o
echo 1 > /proc/sys/net/ipv4/ip_forward
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.
Pon la lista completa de iptables:
sudo iptables -L
Y la lista de interfaces:
ip a
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.
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.
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
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.
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.
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:
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)
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.
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.
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.
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:
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:
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:
-A FORWARD -d 192.168.122.2 -o virbr0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT