1 votos

¿Restablecer la pila TCP/IP sin reiniciar?

Esta es una pregunta un poco inusual, pero tengo un servidor Mac que recibe muchos ataques DDoS. Por lo general, el sistema de mitigación de mi centro de datos los atrapa, pero a veces se cuelan. Cuando lo hacen, a menudo pueden matar completamente el TCP/IP de mi sistema. Incluso el acceso a localhost no funciona. El TCP/IP está completamente muerto. Pero el sistema no está congelado. Por lo demás, sigue funcionando perfectamente. Lo sé porque una vez que reinicio el sistema, puedo ver todas las entradas de registro de mis scripts de todo el tiempo que estuvo desconectado. Tengo capturas de pantalla del escritorio de cuando estaba desconectado.

Reiniciando el servidor en este estado se vuelve a la normalidad. Pero espero que haya alguna forma de reiniciar sólo la pila TCPIP sin reiniciar todo el sistema operativo. Eso al menos me permitiría recuperar el acceso a la máquina de una manera que, aunque torpe, sería significativamente menos que los reinicios remotos duros a través de IPMI.

Todo esto es sólo un parche mientras buscamos formas de reforzar la mitigación de los DDoS. Pero sería una buena tirita. También sería útil, y en una línea similar, una forma de limpiar todas las conexiones TCP, establecidas, medio abiertas, todo, incluyendo toda la información de estado.

1voto

felixbuenemann Puntos 111

No creo que haya una manera de reiniciar la pila TCP, pero la pregunta debería ser por qué TCP deja de responder, debe estar golpeando algunos límites en la pila.

Si el servicio crea nuevas conexiones para responder a las solicitudes entrantes, es posible que esté alcanzando el límite de 16K por defecto en los puertos efímeros y el aún más problemático tiempo de espera de 30s (MSL*2) en las conexiones TIME_WAIT hasta que puedan ser reutilizadas.

Puede utilizar sysctl para ajustarlas:

sudo sysctl net.inet.tcp.msl=1000 # default 15000
sudo sysctl net.inet.ip.portrange.first=16384 # default 49152

Las colas TCP por defecto también son bastante pequeñas (128 sockets en espera):

sudo sysctl kern.ipc.somaxconn=2048 # default 128

Si también está recibiendo escaneos de puertos o DoS a puertos no utilizados, puede reducir la retrodispersión activando el modo blackhole y limitando las respuestas ICMP/RST:

sudo sysctl net.inet.tcp.blackhole=2 # default 0
sudo sysctl net.inet.udp.blackhole=1 # default 0
sudo sysctl net.inet.icmp.icmplim=50 # default 250

Una vez que esté satisfecho con los sysctls puede persistirlos en /etc/sysctl.conf . Utiliza algo como sudo vim /etc/sysctl.conf para crearlo.

También le sugiero que instale HAProxy en su servidor frente a sus servicios y utilícelo para aplicar la limitación de velocidad y el filtrado para las conexiones del backend. Incluso puede hacer una inspección de paquetes, como por ejemplo, descartar conexiones con cabeceras SNI no válidas. La forma más fácil de instalar haproxy en el Mac es a través de Homebrew .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X