Tengo las interfaces eth0 (el acceso a internet) y tap_vpn0 (interfaz vpn tap, con red de 192.168.110.0/24). Lo que quiero es DNAT de todas las conexiones entrantes a través de eth0 a 192.168.110.2, pero SÓLO si NO hay ningún servicio de escucha en el servidor (principalmente, el servidor VPN en sí, pero básicamente cualquier otro servicio que aparezca en netstat -plunt
, incluido SSH). ).
Por ahora lo que estoy haciendo es
iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2
anotando una larga lista de excepciones estáticas. Pero, ¿hay alguna manera de decirle a IPTables que no haga DNAT en caso de que el puerto no esté cerrado en el host real, si el paquete se manejará exitosamente localmente? Entonces, si, por ejemplo, tengo un puerto aleatorio de 9988 abierto más tarde en el servidor, no necesito agregar otra excepción, iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPT
pero ¿simplemente no será editado por DNAT?
Respuesta1
Parece que iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT
funciona. -m socket
según la descripción hace exactamente eso: coincide si hay algún socket de aceptación para este paquete. El truco consistía en usar la --nowildcard
opción, que omití anteriormente; incluso su página de manual dice "La coincidencia de socket no aceptará oyentes de límite cero de forma predeterminada, ya que entonces los servicios locales podrían interceptar el tráfico que de otro modo se reenviaría". - que en realidad es exactamente lo que necesitaba - ¡que los servicios locales intercepten si hay alguno disponible!
Las reglas resultantes son:
iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2
Dejé el puerto 22 (ssh) por si acaso no funciona como se esperaba, ¡pero según las pruebas parece que funciona perfectamente!