¿Cómo bloquear todos los puertos excepto 80,443 con iptables? [duplicar]

15

Bloquear todos los puertos (entrada y salida) es fácil, pero es difícil con la palabra "excepto". No conozco ninguna regla que satisfaga la condición.

PD: Sé que esta pregunta no es nada nuevo. Pero, de hecho, no encontré nada útil. Entonces, ¡ayúdame, por favor!

usuario71169
fuente
¿No puede cerrar TODOS los puertos y luego ABRIR un solo puerto en la línea siguiente?
sinni800
Hago esto: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -I INPUT -p tcp --dport 80 -j ACCEPT ------ ¡No funciona!
user71169

Respuestas:

25

Primero el ! Es el símbolo NO.

iptables -A INPUT -p tcp -m tcp -m multiport ! --dports 80,443 -j DROP

En segundo lugar, las reglas que escribió pueden no tener los resultados esperados. Deje caer todo, incluida la respuesta a la conexión en el puerto 80. Por lo tanto, no podrá conectarse a él, dice a los efectos de un servidor web.

Estas reglas permiten conexiones RELACIONADAS y ESTABLECIDAS para que un servidor web funcione, si eso es lo que está tratando de hacer.

iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT
<insert further allowed list here>
iptables -A INPUT -m conntrack -j ACCEPT  --ctstate RELATED,ESTABLISHED
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j DROP
cybernard
fuente
2
¿No !debería escapar así \!, si se usa el shell Bash?
Cristian Ciupitu
@CristianCiupitu No, no debería ser necesario escapar. Es posible que tenga algo raro, pero en mi fiesta no necesito escapar.
cybernard
Verifiqué la salida de "iptables -nvL" para ver los paquetes en conexión. Parece funcionar, tus reglas. Pero no puedo verificar si realmente funciona o no, excepto usar algunas aplicaciones que usan esos puertos. Una aplicación usa un puerto no significa que use ese puerto solamente. Entonces, ¿alguna sugerencia para verificar?
user71169
1
@cybernard, sí, tienes razón. Un llano !no necesita ser escapado. Perdón por la falsa alarma.
Cristian Ciupitu
3
Las reglas de @MohammadShahid no son permanentes automáticamente, reinicie y desaparecerá y podrá iniciar sesión. Debe agregar 22 a la lista de puertos si desea mantener una conexión ssh.
cybernard
5
# Set the default policy of the INPUT chain to DROP
iptables -P INPUT DROP

# Accept incomming TCP connections from eth0 on port 80 and 443
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Esto debería darte lo que necesitas

Fazer87
fuente
44
Recuerde que si está conectado a través de SSH debe abrir el puerto TCP 22
Maximilian Ast
Sí, no se olvide de su puerto SSH, probablemente debería agregar su puerto SSH antes de configurar la política predeterminada para descartar. ;)
James Little
3

Puede establecer su acción predeterminada en DROP y luego crear reglas de excepción para permitir 80 y 443, de esta manera:

# Setting default policies:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Exceptions to default policy
iptables -A INPUT -p tcp --dport 80 -j ACCEPT       # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT      # HTTPS

iptables revisará la lista de 'excepciones' hasta que encuentre una coincidencia. Luego realizará la acción especificada por el -jparámetro (ACEPTAR en este caso). Si no encuentra una coincidencia, volverá a la política predeterminada y descartará el paquete.

Tenga en cuenta que con esta solución alternativa se bloqueará cualquier subdominio. Por ejemplo, con este método, lo tendrá funcionando en www.mydomain.com, pero su subdominio, digamos, www.sub.mydomain.com no se abrirá para errores de DNS.

mtak
fuente
Debería ser trabajo pero no lo es. Estoy muy confundido
user71169
¿Qué no funciona? ¿Permite todos los paquetes entrantes, o ninguno? ¿Puedes actualizar tu pregunta con la salida de iptables -nvL?
mtak
¿Por qué el voto negativo? Tengo esto funcionando en producción, así que estoy 100% seguro de que funciona.
mtak
¡Lo siento! No soy yo, alguien hizo eso :)) Sí, estás seguro de que soy pero no funciona. Por eso tengo que hacer la pregunta.
user71169
2
No hagas esto de nuevo ssh.
Ashesh