He estado tratando de implementar un nuevo flujo de comunicación en un servidor NGINX listo para producción en funcionamiento. El servidor se ejecuta dentro de un DaemonSet en kubernetes con hostNetwork true. Este nuevo flujo reenviará las conexiones UDP de ingresos de los clientes a un backend conservando el puerto original. Lo he intentado con esta configuración (dentro de un bloque de flujo):
server { listen 12000-12100 udp; proxy_pass backend_name:$server_port; proxy_bind $remote_addr:$remote_port transparent; proxy_responses 0; resolver 1.2.2.10; }Cuando el paquete UDP llega a nginx, el resultado del registro es:
2021/07/01 06:19:55 [alert] 30#30: *24650 sendmsg() failed (1: Operation not permitted) while proxying and sending to upstream, udp client: 172.21.2.114, server: 0.0.0.0:12037, upstream: "1.2.123.101:12037", bytes from/to client:1946/0, bytes from/to upstream:0/0 2021/07/01 06:19:56 [alert] 30#30: *24652 sendmsg() failed (1: Operation not permitted) while proxying and sending to upstream, udp client: 172.21.2.114, server: 0.0.0.0:12037, upstream: "1.2.123.101:12037", bytes from/to client:973/0, bytes from/to upstream:0/0 2021/07/01 06:19:58 [alert] 30#30: *24654 sendmsg() failed (1: Operation not permitted) while proxying and sending to upstream, udp client: 172.21.2.114, server: 0.0.0.0:12037, upstream: "1.2.123.101:12037", bytes from/to client:973/0, bytes from/to upstream:0/0 2021/07/01 06:20:02 [alert] 30#30: *24656 sendmsg() failed (1: Operation not permitted) while proxying and sending to upstream, udp client: 172.21.2.114, server: 0.0.0.0:12037, upstream: "1.2.123.101:12037", bytes from/to client:973/0, bytes from/to upstream:0/0 2021/07/01 06:20:10 [alert] 30#30: *24658 sendmsg() failed (1: Operation not permitted) while proxying and sending to upstream, udp client: 172.21.2.114, server: 0.0.0.0:12037, upstream: "1.2.123.101:12037", bytes from/to client:973/0, bytes from/to upstream:0/0Estoy usando user root y worker_processes auto en el archivo de configuración principal.
He leído esta guía para ayudarme sin resultados: [https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/][1]
No puedo encontrar ningún problema como este que le haya sucedido a otra persona, el mensaje "mientras se envía a proxy y se envía a upstream" no tiene coincidencias en la web.
¿Alguien me puede ayudar a solucionar lo que está pasando?
Finalmente, entendí que el problema estaba relacionado con el sistema operativo y no solo con Nginx. Cuando el sistema operativo intenta abrir el socket con la función sendmsg, el firewall del sistema operativo (iptables) niega esta operación. iptables tenía una regla de rechazo para los servidores ascendentes. El servicio kubelet creó esta regla porque no se pudo acceder a los extremos del pod de destino. Configurando los pods en el puerto de destino, los hizo disponibles; por lo tanto, borró las reglas de rechazo de iptables y el tráfico se reenvió correctamente.