Wiki | Contact

Captaine's blog

mardi, juillet 22 2008

Free, routeur NAT et IPv6

Si vous êtes chez Free et que vous avez activé l'option IPv6, et que vous voulez configurer votre serveur Ubuntu fonctionne en tant que routeur (et donc la freebox doit être en mode bridge), voici ce qu'il faut faire.
Le DHCP ne peut pas fournir d'adresse IPv6 car DHCP est un protocole IPv4. Dans le cas des Freebox, c'est la Freebox qui fournit l'adresse IPv6 à chaque ordinateur. Le problème, c'est que les ordinateurs sont cachés derrière le routeur NAT Ubuntu (ou n'importe quel routeur NAT). Il ne reçoivent donc pas les paquets "Router Advertisement" que la Freebox envoie à chaque PC pour qu'il obtienne son adresse IPv6. De plus, les paquets normaux IPv6 de communication (par exemple, les échange de données lors du surf) sont aussi bloqués par le NAT. Il faut donc créer un passage virtuel entre l'interface eth1 branchée à la Freebox, et l'interface eth0 (ou autre, qui est reliée au réseau local) afin que les paquets IPv6 (et seulement eux) puissent traverser le routeur Ubuntu pour aller jusqu'aux PC du réseau local. Cela s'appelle un PONT ou BRIDGE.
apt-get install bridge-utils
Le problème du pont est qu'il n'est pas filtrant, et donc il laisse par défaut passer les paquets IPv4 et v6 et tout ce qui existe d'autre... (Je vous laisse imaginer la pagaille si tous les PC on la même adresse IPv4 public (par exemple 82.244...) de la Freebox..).
C'est pour cela qu'il faut installer ebtables et le configurer pour n'autoriser que les paquets IPv6 à traverser le bridge.
apt-get install ebtables
Pour configurer  tout cela, j'ai mis en place un script (dispo sur mon site) qui met en place le NAT pour l'IPv4, le bridge, le firewall, et le blocage de tout ce qui n'est pas IPv6 sur le bridge :

 #!/bin/sh
#
# Script de démarrage qui lance l'interface réseau internet,
# met en place un firewall basique et un partage de connexion et le pont pour l'IPv6 de Free
#
# Inspiré du script de Mjules_at_ifrance.com
#

# Interface connectée à Internet
interface=eth1

# Interface connectée au réseau local
interfacelan=eth0

start() {

# Désactivation des interfaces réseau
/sbin/ifdown $interface
/sbin/ifdown $interfacelan


# Création du bridge pour faire transiter les paquets IPv6
brctl addbr br0

# activation du bridge
ifconfig br0 up

# Ajout des interfaces au bridge
brctl addif br0 eth1
brctl addif br0 eth0

# Activation des interfaces réseau
/sbin/ifup $interface
/sbin/ifup $interfacelan

# Dans cette partie, on met en place le firewall
#vidage des chaines
iptables -F
#destruction des chaines personnelles
iptables -X

#stratégies par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#init des tables NAT et MANGLE (pas forcément nécessaire)
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT


# Acceptation de toutes les connexions en local (un process avec l'autre)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -j ACCEPT
#iptables -A OUTPUT -o eth0 -j ACCEPT

#création d'une nouvelle règle
iptables -N MAregle

#définition de la règle : accepter les nouvelles connexions ne venant pas de l'interface internet
# et accepter toutes les connexions établies et reliées (ex: une demande de page HTML provoque l'ouverture
# d'une connexion reliée pour acheminer cette page vers l'ordinateur)

iptables -A MAregle -m state --state NEW -i! $interface -j ACCEPT
iptables -A MAregle -m state --state ESTABLISHED,RELATED -j ACCEPT

#application de la règle au partage de connexion
iptables -A INPUT -j MAregle
iptables -A FORWARD -j MAregle

# activation du forwarding dans le noyau
echo 1 >/proc/sys/net/ipv4/ip_forward

# mise en place du partage de connexion sur le réseau local
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o $interface -j MASQUERADE

# Ouvertures de ports pour le routeur
iptables -A INPUT -p TCP --dport ssh -i $interface -j ACCEPT
iptables -A INPUT -p TCP --dport 80 -i $interface -j ACCEPT
iptables -A INPUT -p TCP --dport 443 -i $interface -j ACCEPT

# Port-Forwarding pour adsl TV
iptables -t nat -A PREROUTING -i eth1 -p udp --dport 31336 -j DNAT --to 192.168.0.3:31336
iptables -A FORWARD -i eth1 -p udp --dport 31336 -d 192.168.0.3 -j ACCEPT

# On n'autorise que l'IPv6 sur le bridge br0 (86DD Correspond à la valeur du champ type de protocole de couche 3 dans la trame Ethernet)
ebtables -t broute -A BROUTING -p ! 86DD -j DROP

}

stop() {
echo 0 >/proc/sys/net/ipv4/ip_forward
ifconfig br0 down
brctl delif br0 eth0
brctl delif br0 eth1
brctl delbr br0
ifdown $interface
iptables -F
iptables -X
}

case "$1" in
start)
start
;;

stop)
stop
;;
restart)
stop && start
;;
*)
echo "Usage $0 {start|stop|restart}"
exit 1
esac

exit 0
J'ai mis ce script dans /etc/init.d et il se lance à chaque démarrage grâce à :
sudo update-rc.d scriptconfrouteur start 99 2 . stop 00 2 0 1 6 .
Voilà, c'est tout ce qu'il y a à faire.
Il manque encore des règles ip6tables pour le firewall IPv6. Pour l'instant je les ai mises sur chaque PC derrière le routeur.

lundi, juillet 21 2008

Widget Dotclear 2 pour afficher l'adresse IPv4 ou IPv6 du client

Voici une petite extension (widget) pour Dotclear 2 qui permet à l'internaute de voir son adresse IPv4 ou IPv6 sur le blog : plugin-IPv4IPv6Show-1.1.zip

Voici un petit aperçu : IPv4IPv6 Show

samedi, juillet 12 2008

Script Firewall IPv6 pour un serveur

Voici un petit script pour configurer un Firewall IPv6 sur un serveur :

#!/bin/bash
#-----------------------------------------------------------------------#
#                                                                       #
# Description : Firewal avec ip6tables                                  #
# OS          : Linux                                                   #
# Requires    : ip6tables - ip_conntrack* - modprobe                    #
# Licence     : GPL                                                     #
# Author      : Benoît Pourre <benoitpourre AT rt74.eu>			#
# Web site    : http://www.rt74.eu/                               	#
#                                                                       #
#-----------------------------------------------------------------------#

# Variables
export IF_RESEAU="eth0"

start_fw() 
{
	# On efface toutes les regles existantes
	/sbin/ip6tables -F

	# On supprime d'eventuelles regles personnelles
	/sbin/ip6tables -X

	# Mise en place des regles par defaut (on refuse tout par default)
	/sbin/ip6tables -P INPUT DROP
	/sbin/ip6tables -P FORWARD DROP
	/sbin/ip6tables -P OUTPUT DROP

	# On accepte les connexions sur la boucle locale (sur lo == 127.0.0.1)
	/sbin/ip6tables -A INPUT -i lo -j ACCEPT
	/sbin/ip6tables -A OUTPUT -o lo -j ACCEPT

	# On accepte la sortie de certain protocoles (commenter les lignes selon le besoin)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p UDP --dport domain -j ACCEPT		# Port 53   (Windows udp)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport domain -j ACCEPT		# Port 53   (Windows tcp)
	#/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport netbios-ssn  -j ACCEPT    # Port 139  (smb or windows share)
	#/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport microsoft-ds -j ACCEPT    # Port 445  (smb or windows share)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport http -j ACCEPT		# Port 80   (Http)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport https -j ACCEPT		# Port 443  (Https)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport imap -j ACCEPT		# Port 143  (Imap)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport imaps -j ACCEPT		# Port 993  (Imaps)
	#/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport pop3 -j ACCEPT		# Port 110  (Pop3)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport smtp -j ACCEPT		# Port 25   (Smtp)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport smtps -j ACCEPT		# Port 465  (Smtps)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport ftp-data -j ACCEPT	# Port 20   (Ftp Data)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport ftp -j ACCEPT		# Port 21   (Ftp)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport ssh -j ACCEPT		# Port 22   (Ssh)
	#/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport ldap -j ACCEPT            # Port 389  (ldap)
	#/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport ldaps -j ACCEPT           # Port 636  (ldaps)
	/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport 5222 -j ACCEPT            # Port 5222 (Jabber)
	#/sbin/ip6tables -A INPUT -i $IF_RESEAU -p TCP --dport 6881:6889 -j ACCEPT	# Port 6881 a 6889 (Bittorrent)

	# On autorise les connexions deja etablies ou relatives a une autre connexion a sortir
	/sbin/ip6tables -A OUTPUT -o $IF_RESEAU --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT

	# On autorise les connexions deja etablies a entrer
	/sbin/ip6tables -A INPUT  -i $IF_RESEAU --match state --state ESTABLISHED,RELATED -j ACCEPT

	# On autorise le PC a faire des ping sur des IP exterieur
	/sbin/ip6tables -A OUTPUT -p icmpv6 -j ACCEPT

	# On interdit les PC a l'exterieur de faire des ping
	/sbin/ip6tables -A INPUT -p icmpv6 -j ACCEPT

	# Ecriture de la politique de log
	# Ici on affiche [ip6tables DROP] dans /var/log/message a chaque paquet rejette par ip6tables
	/sbin/ip6tables -N LOG_DROP
	/sbin/ip6tables -A LOG_DROP -j LOG --log-level 1 --log-prefix '[ip6tables DROP]:'
	/sbin/ip6tables -A LOG_DROP -j DROP

	# On met en place les logs en entree, sortie et routage selon la politique LOG_DROP ecrit avant
	/sbin/ip6tables -A FORWARD -j LOG_DROP
	/sbin/ip6tables -A INPUT -j LOG_DROP
	/sbin/ip6tables -A OUTPUT -j LOG_DROP

	# Chargement du module de gestion des connexion state (autorisation des connexions deja etablies a passer le firewall)
	/sbin/modprobe ip_conntrack

	# Chargement du module special pour palier au probleme de connexion FTP passive
	/sbin/modprobe ip_conntrack_ftp
}
stop_fw() 
{

# Vidage des règles pour toutes les tables :
ip6tables -F

# permet l'effacement de toutes les chaînes qui ne sont pas par défaut dans la 
# table filter notamment LOG_ACCEPT
ip6tables -X

# On remet la politique par défaut à  ACCEPT dans les trois tables par défaut
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

}

case "$1" in
	start)
		start_fw
		echo "firewall started"
		;;

	stop)
		stop_fw 
		echo "firewall stopped"
		;;

	restart)
		stop_fw
		echo "firewall stopped"
		start_fw
		echo "firewall restarted"
		;;

	*)
		echo "usage: $0 [start|stop|restart]" >&2
		exit 1

esac
exit 0

Vous pouvez le télécharger Script firewall IPv6 ip6tables ici.

Il faut ensuite le placer dans /etc/init.d. Pour qu'il soit exécuté au démarrage :

sudo update-rc.d script-ip6tables start 99 2 . stop 00 2 0 1 6 .

jeudi, mai 1 2008

Comment installer le plugin ipv6 pour Awstats

Ce plugin permet à AWStats de faire du reverse DNS sur les adresses IPv6.

Il faut d'abord installer les deux paquets suivants :
apt-get install libnet-ip-perl
apt-get install libnet-dns-perl
Ensuite, il faut activer le plugin dans votre fichier de configuration ("/etc/awstats/awstats.mon.domaine.fr.conf") en décommentant la ligne
LoadPlugin="ipv6"
Maintenant il ne reste plus qu'à relancer le scan des logs :
/usr/lib/cgi-bin/awstats.pl -config=mon.domaine.fr -updatecd /usr/share/awstats/lib/

samedi, février 23 2008

Permettre la visualisation IPv6 entre le réseau d'un serveur OpenVPN et le réseau du client OpenVPN

PS : Ce tuto se base sur un PC routeur Ubuntu avec ce script lancé. Cela implique que j'ai un bridge br0 où il n'y a que IPv6 d'autorisé à transiter. L'interface tap0 du VPN va être ajoutée à ce bridge ce qui veut dire que IPv4 sera bloqué à travers le VPN. Mon but est de permettre à un réseau ne pouvant pas avoir IPv6 de l'obtenir à travers ce VPN.

Pour commencer il faut installer avec ce tuto OpenVPN sur le serveur et le client en mode bridge avec la directive dev tap0

Il faut ensuite installer bridge-utils puis créer l'interface tap0 avec le script suivant du coté serveur :

#!/bin/bash

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0" #Wan vers Freebox en IPv6
eth1="eth1" #Lan

for t in $tap; do
openvpn --mktun dev $t
done

brctl addbr $br
brctl addif $br $eth
brctl addif $br $eth1

for t in $tap; do
brctl addif $br $t
done

Puis du côté client :

#!/bin/bash

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

#Lancement d'OpenVPN
openvpn /etc/openvpn/client.conf

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0" #Lan

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
brctl addif $br $t
done
On obtient donc un tunnel IPv6 vers un réseau IPv6 d'une Freebox. Toutes les communications IPv6 vont passer dans le tunnel VPN mais pas l'IPv4.

dimanche, janvier 20 2008

IPV6 sur une Fonera

Il suffit d'installer les paquets suivants :

ipkg install http://www.gcd.org/fonera/kmod-ip6tables_2.4.32-ar531x-1_mips.ipk
ipkg install http://www.gcd.org/fonera/kmod-ipv6_2.4.32-ar531x-1_mips.ipk