La respuesta corta es: no por diseño , y aquí hay un ejemplo de lo que tendría que suceder si fuera posible:
- netcat abre el socket en el puerto X llamando a la llamada relativa al sistema (como
listen
)
- kernel atrapa syscall, ejecuta el código de red (en este caso, abre el puerto)
- kernel habla con el módulo relativo
iptables
(suponiendo que esté disponible y cargado) y abre un agujero en el firewall para permitir que el tráfico vaya al puerto recién abierto.
Esto abriría un posible agujero de seguridad: ¿cómo sabría el kernel que el programa es legítimo, es decir, no es un troyano que quiere abrir una shell remota? Aquí hay algunas respuestas:
- Porque el programa está en una lista blanca en alguna parte; pero esto cambiaría la seguridad a otro conjunto de problemas:
- ¿cómo sabes que el programa no se ha comprometido? Podría usar algo como tripwire, pero esto abre otra pregunta de seguridad: ¿cómo puede garantizar que la lista maestra no se vea comprometida?
- ¿Cómo lidias con las actualizaciones? P.ej. la versión Z de
ssh
puede perforar agujeros a través del firewall; su sistema se actualiza automáticamente, ahora el hash de ssh
ha cambiado y usted está bloqueado.
- Porque el usuario que lo lanza pertenece a un grupo privilegiado: ¿cómo lidias con los binarios de SUID? Eche un vistazo a los permisos del programa
ping
, por ejemplo.
Otra lata de gusanos ^ W ^ W ^ W conjunto de posibles problemas sería la interfaz entre iptables (a nivel de kernel) y los syscalls; cada cambio menor en iptables requeriría una posible reescritura del código subyacente a las syscalls, la introducción de errores, etc.
En pocas palabras, estás describiendo el problema al que se enfrentan firewalls de aplicaciones (piensa en los firewalls de Windows o Mac). Es factible, pero no es simple.
A nivel de red, es posible que desee echar un vistazo a UPnP cuya función era permitir que los servicios hagan agujeros a través del firewall de una puerta de enlace. Con las obvias consecuencias de seguridad.
O podrías usar un script en su lugar :)