NetFilter : connexion refusee gestion de la connexion
Le
Jeannot Lelapin
Bonjour,
J'ai modifié la configuration du serveur SSH pour que le serveurs écoute
sur le port 443. Dans le fichier /etc/ssh/sshd_config :
Port 443
Quand j'essaye depuis ma machine la connection suivante :
ssh -2 -p 443 theusername@themachinename
Ca marche nickel mais ce ne marche depuis internet.
En logguant netfilter, je vois mes packets de connexions droppés dans
/var/log/messages :
.
Sep 8 13:24:48 paradise kernel: IPTABLES TCP-IN: IN=eth1 OUT=
MAC :60:4c:14:d8:2e:00:60:4c:14:d8:2f:08:00 SRC5.248.192.4
DST.57.11.43 LENd TOS=0x00 PREC=0x00 TTLS IDB043 DF PROTO=TCP
SPT)333 DPTD3 WINDOW2850 RES=0x00 SYN URGP=0
Sep 8 13:24:51 paradise kernel: IPTABLES TCP-IN: IN=eth1 OUT=
MAC :60:4c:14:d8:2e:00:60:4c:14:d8:2f:08:00 SRC5.248.192.4
DST.57.11.43 LENd TOS=0x00 PREC=0x00 TTLS IDB044 DF PROTO=TCP
SPT)333 DPTD3 WINDOW2850 RES=0x00 SYN URGP=0
.
Je lis une bonne documentation sur :
http://www.kalamazoolinux.org/prese...track.html
mais je n'arrive toujours pas à trouver un bon ensemble de règles pour
permettre ma connectionSSH. Les règles concernant SSH sont les suivantes :
/sbin/iptables -A INPUT -p tcp --sport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
idées, conseils sont vraiment les bienvenus.
Cordialement,
Jeannot Lelapin
L'ensemble des règles : /etc/iptables.rules
##
#!/bin/bash
## ==
## Load modules
IPTABLES="/sbin/iptables"
DEPMOD="/sbin/depmod"
MODPROBE="/sbin/modprobe"
# Load all required IPTables modules
# Needed to initially load modules
$DEPMOD -a
# Load appropriate modules.
$MODPROBE ip_tables
# Support for connection tracking
$MODPROBE ip_conntrack
$MODPROBE ip_conntrack_ftp
# MODIF BEGIN
$MODPROBE ip_conntrack_irc
# Adds some $IPTABLES targets like LOG, REJECT and MASQUARADE.
$MODPROBE ipt_LOG
$MODPROBE ipt_REJECT
$MODPROBE ipt_MASQUERADE
# Support for owner matching
$MODPROBE ipt_owner
# MODIF END
## ==
## Reset all configurations
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
## ==
## Default Policy
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
## ==
## Some definitions:
##
## Kernel flags
#
/bin/echo "1" > /proc/sys/net/ipv4/ip_dynaddr
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
/bin/echo "1" > ${interface}
done
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
##
# RULES
## LOOPBACK
# Allow unlimited traffic on the loopback interface.
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
## SYN-FLOODING PROTECTION
$IPTABLES -N syn-flood
$IPTABLES -A INPUT -p tcp --syn -j syn-flood
$IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A syn-flood -j DROP
## FRAGMENTS
$IPTABLES -A INPUT -f -j LOG --log-prefix "IPTABLES FRAGMENTS: "
$IPTABLES -A INPUT -f -j DROP
## Make sure NEW tcp connections are SYN packets
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
## DNS
# Allow UDP packets in for DNS client from nameservers.
$IPTABLES -A INPUT -p udp -s 212.27.32.5 --sport 53 -m state --state
ESTABLISHED -j ACCEPT
# Allow UDP packets to DNS servers from client.
$IPTABLES -A OUTPUT -p udp -d 212.27.32.5 --dport 53 -m state --state
NEW,ESTABLISHED -j ACCEPT
## WWW
# Allow www outbound to 80.
$IPTABLES -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j
ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED
-j ACCEPT
## SSH
# Allow ssh outbound.
$IPTABLES -A INPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
# ICMP
# We accept icmp in if it is "related" to other connections
$IPTABLES -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
# We always allow icmp out.
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j
ACCEPT
## LOGGING
# Any udp not already allowed is logged and then dropped.
$IPTABLES -A INPUT -p udp -j LOG --log-prefix "IPTABLES UDP-IN: "
$IPTABLES -A INPUT -p udp -j DROP
$IPTABLES -A OUTPUT -p udp -j LOG --log-prefix "IPTABLES UDP-OUT: "
$IPTABLES -A OUTPUT -p udp -j DROP
# Any icmp not already allowed is logged and then dropped.
$IPTABLES -A INPUT -p icmp -j LOG --log-prefix "IPTABLES ICMP-IN: "
$IPTABLES -A INPUT -p icmp -j DROP
$IPTABLES -A OUTPUT -p icmp -j LOG --log-prefix "IPTABLES ICMP-OUT: "
$IPTABLES -A OUTPUT -p icmp -j DROP
# Any tcp not already allowed is logged and then dropped.
$IPTABLES -A INPUT -p tcp -j LOG --log-prefix "IPTABLES TCP-IN: "
$IPTABLES -A INPUT -p tcp -j DROP
$IPTABLES -A OUTPUT -p tcp -j LOG --log-prefix "IPTABLES TCP-OUT: "
$IPTABLES -A OUTPUT -p tcp -j DROP
# Anything else not already allowed is logged and then dropped.
$IPTABLES -A INPUT -j LOG --log-prefix "IPTABLES PROTOCOL-X-IN: "
$IPTABLES -A INPUT -j DROP
$IPTABLES -A OUTPUT -j LOG --log-prefix "IPTABLES PROTOCOL-X-OUT: "
$IPTABLES -A OUTPUT -j DROP
J'ai modifié la configuration du serveur SSH pour que le serveurs écoute
sur le port 443. Dans le fichier /etc/ssh/sshd_config :
Port 443
Quand j'essaye depuis ma machine la connection suivante :
ssh -2 -p 443 theusername@themachinename
Ca marche nickel mais ce ne marche depuis internet.
En logguant netfilter, je vois mes packets de connexions droppés dans
/var/log/messages :
.
Sep 8 13:24:48 paradise kernel: IPTABLES TCP-IN: IN=eth1 OUT=
MAC :60:4c:14:d8:2e:00:60:4c:14:d8:2f:08:00 SRC5.248.192.4
DST.57.11.43 LENd TOS=0x00 PREC=0x00 TTLS IDB043 DF PROTO=TCP
SPT)333 DPTD3 WINDOW2850 RES=0x00 SYN URGP=0
Sep 8 13:24:51 paradise kernel: IPTABLES TCP-IN: IN=eth1 OUT=
MAC :60:4c:14:d8:2e:00:60:4c:14:d8:2f:08:00 SRC5.248.192.4
DST.57.11.43 LENd TOS=0x00 PREC=0x00 TTLS IDB044 DF PROTO=TCP
SPT)333 DPTD3 WINDOW2850 RES=0x00 SYN URGP=0
.
Je lis une bonne documentation sur :
http://www.kalamazoolinux.org/prese...track.html
mais je n'arrive toujours pas à trouver un bon ensemble de règles pour
permettre ma connectionSSH. Les règles concernant SSH sont les suivantes :
/sbin/iptables -A INPUT -p tcp --sport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
idées, conseils sont vraiment les bienvenus.
Cordialement,
Jeannot Lelapin
L'ensemble des règles : /etc/iptables.rules
##
#!/bin/bash
## ==
## Load modules
IPTABLES="/sbin/iptables"
DEPMOD="/sbin/depmod"
MODPROBE="/sbin/modprobe"
# Load all required IPTables modules
# Needed to initially load modules
$DEPMOD -a
# Load appropriate modules.
$MODPROBE ip_tables
# Support for connection tracking
$MODPROBE ip_conntrack
$MODPROBE ip_conntrack_ftp
# MODIF BEGIN
$MODPROBE ip_conntrack_irc
# Adds some $IPTABLES targets like LOG, REJECT and MASQUARADE.
$MODPROBE ipt_LOG
$MODPROBE ipt_REJECT
$MODPROBE ipt_MASQUERADE
# Support for owner matching
$MODPROBE ipt_owner
# MODIF END
## ==
## Reset all configurations
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
## ==
## Default Policy
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
## ==
## Some definitions:
##
## Kernel flags
#
/bin/echo "1" > /proc/sys/net/ipv4/ip_dynaddr
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
/bin/echo "1" > ${interface}
done
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
##
# RULES
## LOOPBACK
# Allow unlimited traffic on the loopback interface.
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
## SYN-FLOODING PROTECTION
$IPTABLES -N syn-flood
$IPTABLES -A INPUT -p tcp --syn -j syn-flood
$IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A syn-flood -j DROP
## FRAGMENTS
$IPTABLES -A INPUT -f -j LOG --log-prefix "IPTABLES FRAGMENTS: "
$IPTABLES -A INPUT -f -j DROP
## Make sure NEW tcp connections are SYN packets
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
## DNS
# Allow UDP packets in for DNS client from nameservers.
$IPTABLES -A INPUT -p udp -s 212.27.32.5 --sport 53 -m state --state
ESTABLISHED -j ACCEPT
# Allow UDP packets to DNS servers from client.
$IPTABLES -A OUTPUT -p udp -d 212.27.32.5 --dport 53 -m state --state
NEW,ESTABLISHED -j ACCEPT
## WWW
# Allow www outbound to 80.
$IPTABLES -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j
ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED
-j ACCEPT
## SSH
# Allow ssh outbound.
$IPTABLES -A INPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
# ICMP
# We accept icmp in if it is "related" to other connections
$IPTABLES -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
# We always allow icmp out.
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j
ACCEPT
## LOGGING
# Any udp not already allowed is logged and then dropped.
$IPTABLES -A INPUT -p udp -j LOG --log-prefix "IPTABLES UDP-IN: "
$IPTABLES -A INPUT -p udp -j DROP
$IPTABLES -A OUTPUT -p udp -j LOG --log-prefix "IPTABLES UDP-OUT: "
$IPTABLES -A OUTPUT -p udp -j DROP
# Any icmp not already allowed is logged and then dropped.
$IPTABLES -A INPUT -p icmp -j LOG --log-prefix "IPTABLES ICMP-IN: "
$IPTABLES -A INPUT -p icmp -j DROP
$IPTABLES -A OUTPUT -p icmp -j LOG --log-prefix "IPTABLES ICMP-OUT: "
$IPTABLES -A OUTPUT -p icmp -j DROP
# Any tcp not already allowed is logged and then dropped.
$IPTABLES -A INPUT -p tcp -j LOG --log-prefix "IPTABLES TCP-IN: "
$IPTABLES -A INPUT -p tcp -j DROP
$IPTABLES -A OUTPUT -p tcp -j LOG --log-prefix "IPTABLES TCP-OUT: "
$IPTABLES -A OUTPUT -p tcp -j DROP
# Anything else not already allowed is logged and then dropped.
$IPTABLES -A INPUT -j LOG --log-prefix "IPTABLES PROTOCOL-X-IN: "
$IPTABLES -A INPUT -j DROP
$IPTABLES -A OUTPUT -j LOG --log-prefix "IPTABLES PROTOCOL-X-OUT: "
$IPTABLES -A OUTPUT -j DROP

Poser une question


Jeannot Lelapin
Bonsoir,
On est bien d'accord que les règles Netfilter sont appliquées sur la machine
où se trouve le serveur SSH ?
Si oui, alors il y a confusion entre les ports source et destination.
En entrée arrivent les paquets de la connexion SSH à destination du port 443
donc :
iptables -A INPUT -i eth1 -p tcp --dport 443 --sport 1024:
-m state --state NEW,ESTABLISHED -j ACCEPT
En sortie les paquets de la connexion SSH sortent depuis le port source 443
donc :
iptables -A OUTPUT -o eth1 -p tcp --sport 443 --dport 1024:
-m state --state ESTABLISHED -j ACCEPT
--
TiChou
Bon je suppose que la config firewall se fait sur le serveur...
J'ai pas lu toutes tes regles mais si tu regardes bien juste tes regles
pour ton ssh tu devrais avoir un truc qui te sautes aux yeux... Ton
client SSH ne sait pas quel port il va utiliser pour se connecter a ton
serveur, et c'est certainement pas le 443, c'est seulement le serveur
qui utilise ce port dans ton cas :)
En gros voila les flux (sans compter les eventuels RELATED d'icmp ou
autres)
Client (Port > 1024) ------- NEW -------> Serveur (Port 443)
Client (Port > 1024) <--- ESTABLISHED --- Serveur (Port 443)
Client (Port > 1024) --- ESTABLISHED ---> Serveur (Port 443)
Donc du coté serveur au minimum :
/sbin/iptables -A INPUT -p tcp --dport 443 -m state
--state NEW,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --sport 443 -m state --state
ESTABLISHED -j ACCEPT
Apres si tu veux tuner tes regles avec plus de precisions du style :
/sbin/iptables -A INPUT -p tcp --syn --sport 1024: --dport 443 -m
state --state NEW -j ACCEPT
/sbin/iptables -A INPUT -p tcp --sport 1024: --dport 443 -m state --
state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --sport 443 --dport 1024: -m state --
state ESTABLISHED,RELATED -j ACCEPT
Etc... a toi de voir le niveau de filtrage que tu veux....
--
PS : Pour info est une _vrai_ adresse
donc n'hesitez pas :)
[...]
Ça ne devrait pas plutôt être :
iptable -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
à savoir "dport" en entrée, et "sport" en sortie ?
bonjour,
Si c'est pour des raisons de sécurité ce n'est pas très utile, vu que
ssh ne réagit pas exactement comme une connexion SSL normale. Il est
donc possible par un scan de savoir qu'on a pas un serveur https mais un
un serveur ssh.
De plus, il y a les entêtes ssh (que l'on peut supprimer en modifiant le
source et en recompilant).
Là on lit que le drop est en INPUT vers le port 443
Donc là c'est inversé :
/sbin/iptables -A INPUT -p tcp --sport 1024: --dport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443 --dport 1024: -m state --state
ESTABLISHED -j ACCEPT
Explications :
- C'est le port 443 qui en écoute sur ta machine, c'est le port
destination sur ta machine pour les paquets entrants.
- La connexion d'un client viendra toujours d'un port supérieur à 1024
(sauf certains scan donc autant les éviter).
- le premier paquet entrant sera NEW tous les autres seront en
ESTABLISHED.
--
Julien
Le 08 Sep 2003 20:53:25 GMT, Jeannot Lelapin
iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j
ACCEPT
Les règles à mettre sur le poste client ssh :
iptables -A OUTPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED
-j ACCEPT
iptables -A INPUT -p tcp --sport 443 -m state --state ESTABLISHED -j
ACCEPT
--
"Tout ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire viennent aisément."
(Nicolas Boileau, l'Art poétique)