5 votes

Les règles d'Iptables ne sont plus respectées

J'ai installé Ubuntu Server 64 bits 14.04 il y a une semaine. Il a fonctionné correctement pendant un ou plusieurs jours, puis, soudainement, iptables est devenu inutile (j'ai remarqué que FTP et d'autres sont hors service). Seuls les ports 22, 25 et 80 sont ouverts. iptables -S a l'air bien mais pour une raison quelconque n'est plus honoré. Flush & tous les ports ne sont pas ouverts, seulement 22, 25 & 80. network-manager n'est pas installé (j'ai vérifié cela aussi). Je n'ai pas d'autre pare-feu... Je ne comprends pas ?

/etc/network/interfaces :

auto lo
iface lo inet loopback

auto em1
iface em1 inet static
        address XX.15.191.XXX
        netmask 255.255.255.240
        gateway XX.15.191.XXX
        dns-nameservers XX.105.28.XX

pre-up iptables-restore < /etc/iptables.rules
post-down iptables-restore > /etc/iptables.downrules

/etc/hosts

127.0.0.1       localhost
127.0.1.1       MY-SERVER.ph.cox.net   MY-SERVER
XX.15.191.XXX   mysite.com

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

/etc/hostname :

MY-SERVER

/etc/resolv.conf ( pas set be my, autoset si je comprends bien ) :

nameserver XX.105.28.XX

/etc/iptables.rules

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [19969:30829963]# <--- not sure where this came from?
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --mask 255.255.255.255 --rsource
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH --mask 255.255.255.255 --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -d 0/0 -s 0/0 --dport 5900 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
#-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT

C'est le seul élément notable dmesg après le démarrage, mais cela ne semble pas lié car je suis sur IP4, et de plus, cela fonctionne pendant 1 à 3 jours.

IPv6: ADDRCONF(NETDEV_UP): em1: link is not ready

dmesg | grep eth0 :

[    3.787227] e1000e 0000:00:19.0 eth0: registered PHC clock
[    3.787228] e1000e 0000:00:19.0 eth0: (PCI Express:2.5GT/s:Width x1) c8:60:00:24:ea:cc
[    3.787229] e1000e 0000:00:19.0 eth0: Intel(R) PRO/1000 Network Connection
[    3.787281] e1000e 0000:00:19.0 eth0: MAC: 10, PHY: 11, PBA No: FFFFFF-0FF
[    5.219089] systemd-udevd[157]: renamed network interface eth0 to em1

sudo lsof -i -s tcp:listen ( sortie comme demandé )

sshd     960        root    3u  IPv4    564      0t0  TCP *:ssh (LISTEN)
sshd     960        root    4u  IPv6    566      0t0  TCP *:ssh (LISTEN)
mysqld  1011       mysql   12u  IPv4    602      0t0  TCP localhost:mysql (LISTEN)
exim4   2001 Debian-exim    3u  IPv4  11966      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    4u  IPv6  11967      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    5u  IPv4  11968      0t0  TCP mysite.com:smtp (LISTEN)
searchd 2025        root    7u  IPv4  14510      0t0  TCP *:9312 (LISTEN)
proftpd 2041     proftpd    2u  IPv6  11974      0t0  TCP *:ftp (LISTEN)
apache2 2103        root    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 3882    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 4230    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 etc, etc...

sudo lsof -i -s tcp:listen ( 1 semaine après que le ftp ait fonctionné correctement, le port est soudainement bloqué )

sshd     960        root    3u  IPv4    564      0t0  TCP *:ssh (LISTEN)
sshd     960        root    4u  IPv6    566      0t0  TCP *:ssh (LISTEN)
mysqld  1011       mysql   12u  IPv4    602      0t0  TCP localhost:mysql (LISTEN)
exim4   2001 Debian-exim    3u  IPv4  11966      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    4u  IPv6  11967      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    5u  IPv4  11968      0t0  TCP mysite.com:smtp (LISTEN)
searchd 2025        root    7u  IPv4  14510      0t0  TCP *:9312 (LISTEN)
apache2 2103        root    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 4151    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 4710    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 etc, etc...

sudo nmap -O mysite.com ( 1 semaine après le ftp fonctionnait bien, le port est soudainement bloqué )

20/tcp   closed ftp-data
21/tcp   closed ftp
22/tcp   open   ssh
25/tcp   open   smtp
53/tcp   closed domain
80/tcp   open   http
143/tcp  closed imap
443/tcp  closed https
993/tcp  closed imaps
3306/tcp closed mysql
4444/tcp closed krb524
5900/tcp closed vnc

sudo iptables-save ( sortie comme demandé )

# Generated by iptables-save v1.4.21 on Tue May 27 20:39:05 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17351423:29122270850]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --mask 255.255.255.255 --rsource
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH --mask 255.255.255.255 --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Tue May 27 20:39:05 2014

ifconfig ( sortie comme demandé )

em1       Link encap:Ethernet  HWaddr c8:60:00:24:ea:cc  
          inet addr:XX.15.191.XXX  Bcast:XX.15.191.XXX  Mask:255.255.255.240
          inet6 addr: fe80::ca60:ff:fe24:eacc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19212799 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24791186 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6488896548 (6.4 GB)  TX bytes:29719279878 (29.7 GB)
          Interrupt:20 Memory:f7d00000-f7d20000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4415657 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4415657 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:573695629 (573.6 MB)  TX bytes:573695629 (573.6 MB)

4voto

0xC0000022L Points 5221

Ok, je suppose qu'on ne peut pas résoudre ça en une seule fois. Donc je vais modifier ma réponse au fur et à mesure. Les données jusqu'ici n'indiquent aucune raison pour laquelle iptables ne fonctionnerait pas. Si l'on examine les lignes (potentiellement) pertinentes du document lsof sortie que je vous ai demandée et que vous avez fournie, vous ne devriez voir que les ports que vous avez mentionnés :

Seuls certains ports, tels que 22, 25 et 80, sont ouverts.

ouverts et d'autres fermés. Cependant, vous devriez voir les ports 21, 22, 80 et 9312 ouverts. Il n'y a pas de services écoutant sur les autres ports (version allégée de l'indicateur sudo lsof -i -s tcp:listen sortie) :

sshd     960        root    3u  IPv4    564      0t0  TCP *:ssh (LISTEN)
sshd     960        root    4u  IPv6    566      0t0  TCP *:ssh (LISTEN)
exim4   2001 Debian-exim    5u  IPv4  11968      0t0  TCP mysite.com:smtp (LISTEN)
searchd 2025        root    7u  IPv4  14510      0t0  TCP *:9312 (LISTEN)
proftpd 2041     proftpd    2u  IPv6  11974      0t0  TCP *:ftp (LISTEN)
apache2 2103        root    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 ????    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)

D'accord, ceci étant établi (c'est-à-dire qu'ils sont ouverts, mais rien n'écoute). Nous devrions examiner comment vous essayez de déterminer si le port est ouvert ou non. La méthode normale est de faire un nmap fuir le monde extérieur. Nmap sera également capable de distinguer - selon les circonstances - entre ouvert, filtré et fermé.

Une chose qui m'est venue à l'esprit est que si vous utilisez tcpwrappers, /etc/hosts.deny y /etc/hosts.allow jouera également un rôle sans iptables interférer.


Simplification possible

En outre, vos règles peuvent être simplifiées.

Remplacer :

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

par :

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

sauf si vous avez l'intention d'utiliser le suivi des connexions à l'avenir.

Tous OUTPUT ( filter ) peuvent être supprimées, puisqu'elles ne font rien tant que la politique de cette chaîne est définie comme suit ACCEPT .

Vous voulez probablement ajouter une règle pour le DNS sur UDP, puisque UDP est la valeur par défaut. Cela ressemblerait à ceci :

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

Maintenant tous les noms de port peuvent être mis dans une forme plus lisible en utilisant les noms de /etc/services et donc

-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT # <-- added this one
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT

peut être condensée en deux lignes plus lisibles :

-A INPUT -p tcp -m multiport --dports ftp-data,ftp,ssh,smtp,domain,www,imap2,https,imaps,mysql,4444,5900,9312
-A INPUT -p udp -m multiport --dports domain,5900

avec l'aide de la multiport module

Toutes les règles dans un format adapté aux iptables-restore deviennent alors :

*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH -j DROP
-A INPUT -p tcp -m multiport --dports ftp-data,ftp,ssh,smtp,domain,www,imap2,https,imaps,mysql,4444,5900,9312
-A INPUT -p udp -m multiport --dports domain,5900
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
COMMIT

L'intégration de ces règles dans une invocation de iptables-restore --test vous montrera toute erreur de syntaxe, d'ailleurs. Ceci est généralement très utile pour tous les cas où vous tapez vos règles dans un format adapté à iptables-restore o iptables-apply .

Bonus : Variations

Vous pouvez utiliser ipset(8) ( apt-get install ipset ) pour gérer également la liste des ports. Ceci peut également être utilisé pour d'autres choses comme le verrouillage de zones géographiques entières si vous avez un ensemble de spécifications de réseau (CIDR) pour ces zones. Voir ce .

Bien entendu, vous pouvez également établir une correspondance avec les ensembles IP en tant qu'adresse source ou destination et combinaisons adresse/port. Pour plus d'informations, consultez le manuel ( man ipset ) et consultez le set et le module SET cible (en baisse par rapport à celle d'avant) des descriptions en man iptables-extensions .

Dernier point mais non des moindres : si vous avez une connectivité IPv6, vous pouvez ajouter le préfixe -6 y -4 respectivement avant les lignes sur lesquelles des règles spécifiques au protocole sont données. De cette façon, vous pouvez utiliser un seul fichier pour stocker vos règles à la fois pour les protocoles ip6tables-restore y iptables-restore . Les règles partagées entre les deux devraient no portent le préfixe.

Par exemple, les règles condensées au moment de la rédaction de ce document pourraient être utilisées à la fois pour IPv4 et IPv6. En général, seuls les adresses, les masques de réseau et autres nécessiteront que vous sépariez les règles entre IPv4 et IPv6. De plus : Les ensembles IP ne peuvent être qu'IPv4 (par défaut) ou IPv6 ( ipset create foo family inet6 ), ce qui signifie que ces ensembles, en raison de leurs noms différents, nécessiteront également des règles de fractionnement.


Vous avez également demandé implicitement :

:OUTPUT ACCEPT [19969:30829963]# <--- not sure where this came from?

les chiffres entre parenthèses sont les compteurs de la chaîne. Lorsque vous utilisez iptables-restore (ou son homologue IPv6), ces éléments sont facultatifs. Le nombre de paquets est indiqué avant les deux points, le nombre d'octets après. Si vous exécutez iptables-save とのことです。 -c vous obtiendrez les compteurs correspondants par règle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X