# IPTABLES i SpamAssassin (RE-CERRADO)

## nandelbosc

Buenos dias,

tengo iptables y desde que agregué alguna regla no me permite conectar el demonio SPAMD por la interficie localhost... ya me lio, mejor el archivo de log:

```
# tail /var/log/iptables

Oct 26 09:31:54 vito spamc[31535]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#2 of 3): Connection timed out

Oct 26 09:32:05 vito spamc[31520]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#3 of 3): Connection timed out

Oct 26 09:32:06 vito spamc[31520]: connection attempt to spamd aborted after 3 retries

Oct 26 09:33:50 vito spamc[31826]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#1 of 3): Connection timed out

Oct 26 09:35:04 vito spamc[31535]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#3 of 3): Connection timed out

Oct 26 09:35:05 vito spamc[31535]: connection attempt to spamd aborted after 3 retries

Oct 26 09:35:57 vito spamc[31868]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#1 of 3): Connection timed out

Oct 26 09:37:00 vito spamc[31826]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#2 of 3): Connection timed out

Oct 26 09:37:46 vito spamc[31878]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#1 of 3): Connection timed out
```

```
Oct 26 10:42:31 vito firewallIN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48126 DF PROTO=TCP SPT=36794 DPT=783 WINDOW=32792 RES=0x00 SYN URGP=0

```

mi configuración iptables:

```
*raw

:PREROUTING ACCEPT [4788:468490]

:OUTPUT ACCEPT [4407:547842]

COMMIT

*nat

:PREROUTING ACCEPT [1757:78394]

:POSTROUTING ACCEPT [400:29395]

:OUTPUT ACCEPT [549:38899]

-A POSTROUTING -o eth0 -j SNAT --to 192.168.10.1

COMMIT

*mangle

:PREROUTING ACCEPT [4788:468490]

:INPUT ACCEPT [4771:467446]

:FORWARD ACCEPT [17:1044]

:OUTPUT ACCEPT [4407:547842]

:POSTROUTING ACCEPT [4464:554273]

COMMIT

*filter

:INPUT ACCEPT [5:952]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [1192099:595387635]

# Reject packets from RFC1918 class networks (i.e., spoofed)

-A INPUT -s 10.0.0.0/8 -j DROP

-A INPUT -s 169.254.0.0/16 -j DROP

-A INPUT -s 172.16.0.0/12 -j DROP

-A INPUT -s 127.0.0.0/8 -j DROP

-A INPUT -s 224.0.0.0/4 -j DROP

-A INPUT -d 224.0.0.0/4 -j DROP

-A INPUT -s 240.0.0.0/5 -j DROP

-A INPUT -d 240.0.0.0/5 -j DROP

-A INPUT -s 0.0.0.0/8 -j DROP

-A INPUT -d 0.0.0.0/8 -j DROP

-A INPUT -d 239.255.255.0/24 -j DROP

-A INPUT -d 255.255.255.255 -j DROP

#

-A INPUT -p tcp --destination-port 783 -j ACCEPT

# Allow most ICMP packets to be received (so people can check our

# presence), but restrict the flow to avoid ping flood attacks

# limit = 1 paquet per segon

-A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP

-A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP

-A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT

# Drop invalid packets immediately

-A INPUT -m state --state INVALID -j DROP

-A FORWARD -m state --state INVALID -j DROP

-A OUTPUT -m state --state INVALID -j DROP

# Drop bogus TCP packets

-A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

# Drop excessive RST packets to avoid SMURF attacks, by given the

# next real data packet in the sequence a better chance to arrive first.

-A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

# Protect against SYN floods by rate limiting the number of new

# connections from any host to 60 per second. This does *not* do rate

# limiting overall, because then someone could easily shut us down by

# saturating the limit.

-A INPUT -m state --state NEW -p tcp -m tcp --syn -m recent --name synflood --set

-A INPUT -m state --state NEW -p tcp -m tcp --syn -m recent --name synflood --update --seconds 1 --hitcount 60 -j DROP

# Anyone who tried to portscan us is locked out for an entire day.

-A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP

-A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list

-A INPUT -m recent --name portscan --remove

-A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.

-A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"

-A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

-A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"

-A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

# accept all from localhost

-A INPUT -s 127.0.0.1 -j ACCEPT

# accept all previously established connections

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# ssh

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# ICMP

-A INPUT -p ICMP -j ACCEPT

# ftp / webserver related

# -A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT

# -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT

-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT

# NFS

-A INPUT -p tcp -m state --state NEW -m multiport --dport 999,669,111,790,793,2049,4001,32764:32767 -j ACCEPT

-A INPUT -p udp -m state --state NEW -m multiport --dport 999,669,111,790,793,2049,4001,32764:32767 -j ACCEPT

# Windows / Samba

-A INPUT -p tcp -m state --state NEW -m tcp --dport 137:139 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 426 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT

# up to 5 Bit-torrent connections

-A INPUT -p tcp -m state --state NEW -m tcp --dport 6881:6886 -j ACCEPT

-A INPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "firewall"

-A OUTPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "firewall"

# Reject any packets that do not meet the specified criteria

-A INPUT -p tcp -j REJECT --reject-with tcp-reset

-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable

# reject everything else

-A INPUT -j REJECT --reject-with icmp-port-unreachable

```

Pensaba que con la linea 

```
-A INPUT -p tcp --destination-port 783 -j ACCEPT
```

 se solucionaria, pero no ;(

Sabeis como puedo solucionar-lo?Last edited by nandelbosc on Fri Oct 26, 2007 1:40 pm; edited 3 times in total

----------

## jgascon

Las reglas de iptables se leen secuencialmente. La primera que concuerda se aplica y se omiten todas las demás. Por tanto, si tienes las  reglas puestas en este orden:

```

-A INPUT -s 127.0.0.0/8 -j DROP

-A INPUT -p tcp --destination-port 783 -j ACCEPT

```

Los paquetes no llegan porque los descartas antes.

Si insertas las reglas mediante iptables en caliente, tendrías que añadir la regla del puerto 783 con la opción -I que te la inserta como la primera de la tabla INPUT.

```

iptables -I INPUT -p tcp --destination-port 783 -j ACCEPT

```

Si editas el archivo de iptables a mano sólo tienes que cambiar las reglas de orden.

También podrías cambiar el DROP de la regla de localhost por un ACCEPT ya que hay por ahí unos cuantos demonios que necesitan comunicarse con localhost para funcionar. Si cambias esto no necesitarás la regla para el puerto 783.

----------

## nandelbosc

Nada, que pensaba que habia funcionado pero no...

```
Oct 26 11:48:53 vito spamc[2456]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#1 of 3): Connection timed out

Oct 26 11:50:23 vito spamc[2421]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#3 of 3): Connection timed out

Oct 26 11:50:23 vito spamc[2424]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#3 of 3): Connection timed out

Oct 26 11:50:24 vito spamc[2421]: connection attempt to spamd aborted after 3 retries

Oct 26 11:50:24 vito spamc[2424]: connection attempt to spamd aborted after 3 retries

Oct 26 11:52:03 vito spamc[2456]: connect(AF_INET) to spamd at 127.0.0.1 failed, retrying (#2 of 3): Connection timed out

```

```
vito etc # iptables -L

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:783

DROP       all  --  10.0.0.0/8           anywhere

DROP       all  --  169.254.0.0/16       anywhere

DROP       all  --  172.16.0.0/12        anywhere

DROP       all  --  loopback/8           anywhere

DROP       all  --  BASE-ADDRESS.MCAST.NET/4  anywhere

DROP       all  --  anywhere             BASE-ADDRESS.MCAST.NET/4

DROP       all  --  240.0.0.0/5          anywhere

DROP       all  --  anywhere             240.0.0.0/5

DROP       all  --  0.0.0.0/8            anywhere

DROP       all  --  anywhere             0.0.0.0/8

...

```

Ideas?

----------

## jgascon

Vamos a hacer un poco de investigación   :Cool: 

En lugar de iptables -L, ejecuta iptables -L -vn y pega la salida. La opción -v nos permite ver los contadores y ver si hay paquetes que hayan coincidido con esta regla:

```

ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:783

```

Cambia estas reglas:

```

-A INPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "firewall"

-A OUTPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "firewall" 

```

por

```

-A INPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "input-firewall "

-A OUTPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "output-firewall " 

```

Para ver si el problema está en el OUTPUT y no en el INPUT.

Por lo que dice esto:

```

Oct 26 10:42:31 vito firewallIN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48126 DF PROTO=TCP SPT=36794 DPT=783 WINDOW=32792 RES=0x00 SYN URGP=0 

```

Parece que el problema es el OUTPUT (fíjate en OUT=lo), supongo que debe ser por el --limit. Puedes añadir la siguiente regla al prinicpio:

```

-A OUTPUT -p tcp --source-port 783 -j ACCEPT

```

Y aunque no creo que sea lo que te pasa, comprueba que spamd no use UDP en vez de TCP.

----------

## gringo

yo sinceramente no entiendo porque restringes el tráfico en loopback ... si tu nivel de paranoia es elevado o lo haces por juguetear pue fale, pero me parece excesivo no confiar en los demonios que tiene rulando en una misma máquina.

saluetes

----------

## nandelbosc

Primero... jgascon, muchas gracias, dejar pasar la salida funcionó, ya me habia fijado, pero no estaba muy segureo de la sintaxis de la regla.

Segundo... gringo, muchas gracias también, y tienen razón, soy paranoico, pero no tanto  :Wink:  por lo que he quitado esa regla y funciona!

Saludos!

Ahora si que cierro el hilo   :Wink: 

----------

## jgascon

Me alegro que haya funcionado  :Smile: 

Lo que ahora no tengo muy claro es porque no te dejaba pasar el OUTPUT si tienes todas las políticas para OUTPUT en ACCEPT y la única regla para el OUTPUT es la que usas para los logs. Al principio creía que podía ser el --limit, pero como la acción de la cadena es LOG en teoria debe dejar pasar los paquetes. La verdad es que ahora mismo no sé que podía ser...

Bueno, ahora que está funcionando y dices que no tienes ningún impedimento para dejar pasar el tráfico de loopback yo añadiría al principio del todo estas dos reglas para ahorrate follones más adelante:

```

-A INPUT -s 127.0.0.1/8 -d 127.0.0.1/8 -j ACCEPT 

-A OUTPUT -s 127.0.0.1/8 -d 127.0.0.1/8 -j ACCEPT 

```

Con eso yo creo que deberías poder eliminar las reglas que has puesto para el puerto 783 y no tendrás que añadir más reglas otra vez. Acuérdate de usar las opciones -s y -d siempre que puedas, ahora mismo con la regla que tienes tienes abierto el puerto 783 a todo el mundo.

----------

## nandelbosc

He añadido las lineas que comenta jgascon y eliminado la consecuente.

Gracias, sé que lo tengo abierto a todo el mundo, pero este servidor está detrás de un router con unos pocos puertos abiertos. El cortafuegos es para probar/aprender.

Gracias de nuevo a tod@s! Salud!

----------

