IPTABLES para permitir ssh, ftp, pop, etc. desde una dirección IP estática con HTTP / SSL abierto al público

Esta es mi configuration en / etc / sysconfig / iptables:

#start of my iptables # Generated by iptables-save v1.2.11 on Wed May 27 00:31:22 2015 *mangle :PREROUTING ACCEPT [130933577:29488298585] :INPUT ACCEPT [130933577:29488298585] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [171790648:176814024859] :POSTROUTING ACCEPT [171789023:176813945079] COMMIT # Completed on Wed May 27 00:31:22 2015 # Generated by iptables-save v1.2.11 on Wed May 27 00:31:22 2015 *filter :INPUT ACCEPT [130907005:29486700773] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [171789023:176813945079] -A INPUT -s 117.21.191.0/255.255.255.0 -j DROP -A INPUT -s 106.0.210.78 -j DROP -A INPUT -s 58.218.0.0/255.255.0.0 -j DROP -A INPUT -s 117.3.215.251 -j DROP -A INPUT -s 119.97.146.0/255.255.255.0 -j DROP -A INPUT -s 203.185.69.45 -j DROP -A INPUT -s 58.18.172.0/255.255.255.0 -j DROP -A OUTPUT -p tcp -m tcp --dport 6660:6669 -j DROP -A INPUT -p tcp -s my_static_ip --dport 22 -j ACCEPT -A INPUT -p tcp -s my_static_ip --dport 21 -j ACCEPT -A INPUT -p tcp -s my_static_ip --dport 110 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT -A INPUT -p tcp ! -s my_static_ip -j DROP COMMIT # Completed on Wed May 27 00:31:22 2015 # Generated by iptables-save v1.2.11 on Wed May 27 00:31:22 2015 *nat :PREROUTING ACCEPT [8063847:452240147] :POSTROUTING ACCEPT [3324733:239203840] :OUTPUT ACCEPT [3324733:239203840] COMMIT # Completed on Wed May 27 00:31:22 2015 # end of my iptables 

my_static_ip es la dirección IP que uso para conectarme al server de Linux (digamos 100.10.10.10).

Básicamente, quería permitir que solo mi única IP se conectara a mi server para usar ssh, ftp, recibir y enviar correos electrónicos, etc. porque había muchos IP abusivos y bots que intentaban acceder a ssh, ftp, pop, etc. HTTP y SSL deben estar permitido para todos en mi server.

Con la configuration anterior, todo está bien, excepto que no puedo recibir ni enviar correos electrónicos. ¿Podría decirme qué hice mal?

Gracias de antemano por su ayuda.

El transporte de correo electrónico normalmente usa el puerto 25 (SMTP), 465 (SMTP sobre SSL) y / o 587 (envío). El único puerto de 'correo electrónico' que puedo ver en su configuration es 110 (POP3), que es un protocolo de cliente a server de correo para leer correos electrónicos en su cliente de correo favorito, pero no se usa para recibir o enviar correos electrónicos desde / hacia su server.

Si desea recibir correos electrónicos en su server, debe permitir los puertos anteriores desde el lado externo y si desea poder enviar correos desde su cliente a través de su server, debe permitir esos puertos desde su dirección estática.

Primero, un comentario general sobre buenas prácticas:

Una forma más agradable de hacerlo es crear otra cadena y networkingirigir el filter para su ip:

 -A INPUT -p tcp -s my_static_ip -j MYIP 

y luego coloque todos los demás filters en la cadena MYIP . ¡Tampoco necesitas la cláusula de negación ! -s my_static_ip ! -s my_static_ip , después de networkingirigir su ip a otra cadena, la siguiente línea puede soltar todo lo demás con

 -A INPUT -p tcp -j DROP 

sshguard o un filter similar también es una buena idea para bloquear a los abusadores sin restringir por completo el acceso a través de ssh excepto una dirección.

Si confías en my_static_ip , podrías dejarlo pasar por completo.

Para correo electrónico, deberá averiguar qué protocolos usa. Abriste el puerto 110 (POP no encriptado) pero probablemente necesites SMTP y / o IMAP.

Esto me lleva a mi siguiente comentario: no habría visto ningún problema, si aceptara todas las conexiones ESTABLECIDAS de todos modos (no solo http (s)). Debido a que usted es quien inicia la connection al server de correo (verificando el correo nuevo o enviándolo), el server de correo no se comunicará con usted por sí solo, solo le servirá lo que solicitó. Entonces, si permite todo ESTABLECIDO, eso está cubierto. Muchas aplicaciones, no solo clientes de correo, utilizan varios protocolos para recuperar su contenido, y todos se romperán en su configuration actual. Solo usa

 -A INPUT -p tcp -m tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

y ha cubierto todos los casos sin comprometer la security. Se eliminarán las nuevas conexiones entrantes, pero si la comunicación proviene de su lado, se deja pasar.

EDITAR:

Mi sugerencia, pero no la he probado.

 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :TCP - [0:0] :UDP - [0:0] :MYIP - [0:0] ##:sshguard - [0:0] #accept established connections immediately -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #drop all invalid packets -A INPUT -m conntrack --ctstate INVALID -j DROP #accept localhost (web interfaces and such) -A INPUT -i lo -j ACCEPT #pings and such -A INPUT -p icmp -j ACCEPT #special treatment of your ip #whatever MYIP chain doesn't accept is still subjected to all the following #rules - because of the dash in the :MYIP - line above. #if you really trust MYIP, you can just use ACCEPT -A INPUT -s my_static_ip -j MYIP #split into individual chains for TCP and UDP packets, handle them separately #in case you want to add specific rules for UDP and TCP things (like the http(s) acceptance below) -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP #reasonable defaults for dropping things -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable #if you have a web server, allow http(s): -A TCP -p tcp -m tcp --dport 80 -j ACCEPT -A TCP -p tcp -m tcp --dport 443 -j ACCEPT #dropping these outbound ports? -A OUTPUT -p tcp -m tcp --dport 6660:6669 -j DROP #it's nice to let DNS through -A UDP -p udp -m udp --dport 53 -j ACCEPT #what to accept in your ip chain #you don't even need mail ports here, because their requests don't come from outside -A MYIP -p tcp --dport 22 -j ACCEPT -A MYIP -p tcp --dport 21 -j ACCEPT #alternative: install sshguard and uncomment these lines (and the chain definition in the header) ##-A TCP -p tcp -m tcp --dport 22 -j sshguard ##-A TCP -p tcp -m tcp --dport 22 -j ACCEPT COMMIT