Posts Tagged ‘serveur’

problème serveur : les utilisateurs ont un problème de routage asymétrique

mardi, janvier 6th, 2009

Si les utilisateurs ont un problème de route asymétrique entre l’envoie d’un paquet et sa réception ce qui entraîne une rupture de connexion de la part du FireWall, il faut commencer par regarder la configuration des interfaces car c’est à cet endroit que nous effectuons un routage.
Pour rappel, le FireWall divise en quatre grandes classes l’ensemble des classe IP de l’UFC (chacune à sa VRF).
Sur le FW, plusieurs de ces classes sont réunis et il faut faire extrêmement attention à ne pas créer sur la machine VPN un routage inter-classe qui entraînera pour le moins un dysfonctionnement pour l’utilisateur (au pire un dysfonctionnement d’une partie du réseau de l’UFC).
Avec le code suivant :
auto eth0.168
iface eth0.168 inet static
address 172.20.16.220
netmask 255.255.255.0
network 172.20.16.0
broadcast 172.20.16.255
up ip route add default via 172.20.16.254 dev eth0.168 table admin.pres
up ip rule add fwmark 18 table admin.pres
down ip rule del fwmark 18
down ip route del table admin.pres

Nous avons deux règles très importantes :
la première :
up ip route add default via 172.20.16.254 dev eth0.168 table admin.pres
qui implique une route par défaut pour tous les utilisateurs VPN du tag 18 (admin.pres).
la seconde :
up ip rule add fwmark 18 table admin.pres
car c’est par elle que l’on affecte au client le tag 18.

Si le code dans le fichier /etc/network/interfaces ressemble à
up ip route add default via 172.20.16.254 dev eth0.168 table admin.pres
ip up rule add fwmark 18 table admin.pres

Tous les clients de ce réseaux ne seront pas affecté au tag 18 et donc tout leur trafic transitera par l’interface de routage par défaut de la machine qui est sans aucun doute dans une VRF distincte et donc entraînera un dysfonctionnement des connexion de ces clients vers l’extérieur de leur réseau de connexion.

liste des serveurs VPN et des REALMS

vendredi, juillet 4th, 2008

VPN1 : Besançon 194.57.91.250, realm @ufc @lifc-lab @lifc-edu, @femto, @cri, @admin-bu et @admin-presidence.
VPN2 : Montbéliard 194.57.89.97, realm @ufc
VPN3 : Belfort 194.57.89.105, realm @ufc et @iutbm (à venir @lifc-lab)

Problème serveur : récupération sur radius de l’IP de l’utilisateur

vendredi, juin 13th, 2008

L’architecture du service VPN (station de travail -> VPN1/2/3/… -> RADIUS -> LDAP/RADIUS/… ) pose le problème suivant : le client RADIUS est le serveur VPN. De ce fait, RADIUS reçoit par défaut  l’adresse IP du NAS (machine VPN) alors qu’il serait intéressant d’obtenir également l’adresse IP du client réel, c’est-à-dire, la station de travail.

Sur le serveur VPN, le démon XL2TP lance le service PPP qui permet à l’utilisateur de transmettre des informations, notamment login/mot de passe. Le service PPP, inclut dans ses sources une partie RADIUSCLIENT (les binaires radiusclient1 que l’on charge sur le serveur VPN sont donc inutiles) qui adresse au serveur RADIUS via le protocole RADIUS les informations reçues par le serveur VPN.

Or nous avons besoin pour certaines applications du VPN de connaître (reconnaître) l’adresse IP de l’utilisateur (client final à ne pas confondre avec le client du serveur RADIUS) pour l’autoriser ou non à établir une connexion.
Or les arguments transmis par le VPN au serveur RADIUS sont les suivants :

Service-Type = Framed-User
Framed-Protocol = PPP
User-Name = "utilisateur@realm"
User-Password = "mot_de_passe"
NAS-IP-Address = IP_serveur_VPN
NAS-Port = 1

Le serveur RADIUS n’a donc pas d’information sur l’IP de l’utilisateur.

Jean-Michel Caricand a créé et appliqué un patch de quelques lignes pour transmettre cette information.
En effet, dans le fonctionnement de XL2TP (L2TP) sur le serveur VPN, nous pouvons transmettre des attributs statiques à l’aide de l’argument “ipparam”. Si cet argument est transmis, l’attribut qui suit est également transmis. On retrouve cela dans les fichiers de configuration avec le plus souvent une chaîne de caractères (par exemple pour éviter les récursions sur L2TP).
Notre idée est simple : introduire après l’argument ipparam l’adresse IP de l’utilisateur.
cela nous donne le patch :

--- xl2tpd-1.1.12.orig/control.c        2007-10-20 06:22:55.000000000 +0200
+++ xl2tpd-1.1.12/control.c     2008-06-12 15:01:16.000000000 +0200
@@ -954,6 +954,14 @@ int control_finish (struct tunnel *t, st
}
if (c->lns->debug)
po = add_opt (po, "debug");
+
+        po = add_opt (po, "ipparam");
+        po = add_opt (po, "%s", IPADDY (t->peer.sin_addr));
+
+        l2tp_log (LOG_DEBUG,
+             "Use ipparam option with %s value\n",
+             IPADDY (t->peer.sin_addr));
+
if (c->lns->pppoptfile[0])
{
po = add_opt (po, "file");

maintenant, nous avons bien une information supplémentaire très facile à traiter :

Service-Type = Framed-User
Framed-Protocol = PPP
User-Name = "utilisateur@realm"
User-Password = "motdepasse"
Calling-Station-Id = "IP_utilisateur"
NAS-IP-Address = IP_serveur_VPN
NAS-Port = 1

installation d’un serveur VPN : ajout d’un REALM

mercredi, mai 21st, 2008

Ajout d’un REALM “le-realm” sur un réseau “ttt.ttt.ttt.nnn 255.255.255.ZZZ”, vlan XXX

creation du vlan sur le commutateur CISCO
conf t
vlan XXX
name blabla
exit
int vlanXXX
desc blabla
ip vrf forwarding FW_YYYYY
ip address ttt.ttt.ttt.ttt 255.255.255.ZZZ
no shutdown
exit
interface GigabitEthernet3/29
switchport trunk allowed vlan add XXX
interface GigabitEthernet3/38
switchport trunk allowed vlan add XXX

sur le serveur VPN
emacs /etc/network/interfaces
auto eth0.XXX
iface eth0.XXX inet static
address ttt.ttt.ttt.ttu
netmask 255.255.255.ZZZ
network ttt.ttt.ttt.0
broadcast ttt.ttt.ttt.ttv
up ip route add default via ttt.ttt.ttt.ttt dev eth0.XXX table le.realm
up ip rule add fwmark MMM table le-realm
down ip rule del fwmark MMM
down ip route del table le.realm

emacs /etc/iproute2/rt_tables
10 femto.ext
11 lifc.lab
12 lifc.edu
13 ufc.generic
MMM le.realm

modification de la base de données realmacl
add realm
add network
=> choix du nas
=> tranche ip
=> marque iptable

sur le serveur RADIUS (exemple avec le realm ufc-pub sur 194.57.81.0/24 coupé en trois parties) :
/etc/raddb/radiusd.conf
realm ufc-pub {
format = suffix
delimiter = "@"
ignore_default = no
ignore_null = no
}

ippool ufc_pub_pool {
name = ufc_pub_pool
range-start = 194.57.81.1
range-stop = 194.57.81.10
netmask = 255.255.255.0
cache-size = 800
session-db = ${raddbdir}/db-ufc_pub_pool.ippool
ip-index = ${raddbdir}/db-ufc_pub_pool.ipindex
override = no
maximum-timeout = 0
}

ippool ufc_pub_pool1 {
name = ufc_pub_pool1
range-start = 194.57.81.11
range-stop = 194.57.81.251
netmask = 255.255.255.0
cache-size = 800
session-db = ${raddbdir}/db-ufc_pub_pool1.ippool
ip-index = ${raddbdir}/db-ufc_pub_pool1.ipindex
override = no
maximum-timeout = 0
}
...
}

authorize {
ufc-pub
}

accounting {
ufc_pub_pool
ufc_pub_pool1
}

post-auth {
ufc_pub_pool
ufc_pub_pool1
}

créer et attribuer à radiusd.radiusd les fichier ${raddbdir}/db-ufc_pub_pool.ippool et ${raddbdir}/db-ufc_pub_pool.ipindex.

dans le fichier /etc/raddb/users on attribue les méthodes d’authentification, d’autorisation et les pool pour le DHCP :
DEFAULT Realm == "ufc-pub", NAS-IP-Address == 194.57.91.251, Pool-Name := "ufc_pub_pool", Auth-Type = "LDAP_UFC", Autz-Type = "LDAP_UFC"
Fall-Through = No
DEFAULT Realm == "ufc-pub", NAS-IP-Address == 194.57.91.250, Pool-Name := "ufc_pub_pool1", Auth-Type = "LDAP_UFC", Autz-Type = "LDAP_UFC"
Fall-Through = No
DEFAULT Realm == "ufc-pub", NAS-IP-Address == 194.57.89.65, Pool-Name := "ufc_pub_pool2", Auth-Type = "LDAP_UFC", Autz-Type = "LDAP_UFC"
Fall-Through = No

Ne pas oublier le fichier /etc/raddb/clients.conf :
client 194.57.91.250 {
secret = blabla
shortname = test-vpn
nastype = other
}

client 194.57.91.251 {
secret = blabla
shortname = vpn1
nastype = other
}

client 194.57.89.65 {
secret = blabla
shortname = vpn2
nastype = other
}

comme nous avons un identificateur de realm il faut aussi (même si ce realm est géré en local sur ce radius) configurer le fichier /etc/raddb/proxy.conf :
realm ufc-pub {
type = radius
authhost = LOCAL
accthost = LOCAL
# strip
}

Installation d’un serveur VPN : la base

mercredi, mai 21st, 2008

installation serveur VPN debian Etch (exemple avec vpn2.univ-fcomte.fr en 194.57.89.65)

swap 2Go primaire
/boot 0.1Go primaire
/ 1Go primaire
/usr 5Go logique
/tmp 1Go logique
/var 24Go logique
/backup 37Go logique

vi /etc/apt/sources.list
mettre un # devant le cdrom

apt-get install vlan
modprobe 8021q
echo "8021q" >> /etc/modules

modifier le fichier /etc/network/interfaces
#auto eth0
#iface eth0 inet static

auto eth1
iface eth1 inet static
address 194.57.89.65
netmask 255.255.255.240
network 194.57.89.64
broadcast 194.57.89.79
gateway 194.57.89.78
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 194.57.91.200
dns-search univ-fcomte.fr
#mtu 1400

un /etc/init.d/network restart ne suffit pas (eth0 reste configuré) => reboot de la machine.
=> corrigé par la procédure suivante :
– stopper l’interface (ifdown eth…)
– modifier les interfaces (suppression/ajout/modif)
– relancer l’interface (ifup eth…)

configurer le commutateur pour mettre le port correspondant à eth0 en trunk

modification du fichier /etc/sysctl.conf
ajout de :
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.conf.all.log_martians=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.ip_forward=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

sysctl -p

apt-get install ssh x-window-system vim emacs openswan traceroute wireshark tcpdump

apt-get install sendmail logwatch tripwire rsync ntp
modif du fichier sendmail :
DS[smtp.univ-fcomte.fr]
DMvpn2.univ-fcomte.fr

/etc/init.d/sendmail restart

vi /etc/aliases
root : vpn-master@univ-fcomte.fr
newaliases

mettre à jour le serveur DNS avec vpn2.univ-fcomte.fr 194.57.89.65

config de /etc/ntp.conf
server ntp.univ-fcomte.fr prefer
server cri-08.univ-fcomte.fr

apt-get remove exim4

rsync -av 194.57.91.250:/etc/ipsec* /etc/
config avec la valeur ip du serveur

vi /etc/apt/sources.list
deb http://172.20.65.21/debian/ etch-lifc main
apt-get update
wget http://172.20.65.21/etch/lifc-apt.key
apt-key add lifc-apt.key
apt-get install xl2tpd radiusclient1
apt-get remove l2tpd
rsync -av 194.57.91.250:/etc/radiusclient /etc/

ajout du serveur VPN dans les clients RADIUS sur le serveur RADIUS.

Configuration serveur : connexion client XP/VISTA

jeudi, mai 15th, 2008

Depuis la sortie de VISTA SP1, la connexion IPSEC ne s’effectue plus correctement car il manque une commande (forceencaps=yes) dans la configuration des connexions pour les clients XP/VISTA.

Si, dans la configuration du serveur nous modifions légèrement la connexion pour les clients XP/VISTA en ajoutant :
conn vpn-l2tp-XP
# force l'encapsulation en UDP
forceencaps=yes

alors la connexion d’un VISTA SP1 fonctionne.
De fait, il faudra faire attention en cas de problème de connexion à bien ajouter dans REGEDIT la valeur (pour VISTA) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent
(pour XP) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPSec valeur DWORD AssumeUDPEncapsulationContextOnSendRule à 2 comme cela est spécifié dans l’article Problème VISTA/XP SP2 : modification de la base de registre

Pour le moment nous avons deux choix au niveau du serveur :
– imposer la manipulation de regedit pour les clients XP et garder un type de connexion commune pour XP et VISTA
– régénérer des certificats pour les clients VISTA et créer une connexion spécifique pour VISTA et conserver la connexion XP actuelle.
Le choix sera déterminé semaine 21 suivant les essais faits avec XP SP2 et SP3 et VISTA sans SP1 et avec SP1. Pour le moment seuls les clients XP SP2 et VISTA sans SP1 peuvent utiliser les serveurs IPSEC.

Les résultats des tests démontrent que pour Windows XP SP1/SP2 et SP3 nous pouvons conserver la même configuration client et serveur => aucun changement à effectuer sur les postes clients XP ni de changement de certificat.

Pour Windows VISTA sans SP1 ou avec SP1, il faut mettre à jour la base de registre.

Problème WIFI SSID vpn-ufc : DNS / adresse IP

jeudi, mai 15th, 2008

Attention, lorsque vous configurez l’adresse du serveur VPN en utilisant le SSID vpn-ufc présent sur les bornes de l’Université de Franche-Comté, vous ne devez pas mettre le nom du serveur mais son adresse IP.
ex : 194.57.91.251 au lieu de test.vpn.univ-fcomte.fr
ex : 194.57.91.250 au lieu de vpn1.univ-fcomte.fr

En effet, ce SSID ufc-vpn n’a accès qu’aux serveurs VPN et donc n’a pas accès aux différents serveurs de nom (que ce soit ceux de l’UFC ou de votre provider).

LINUX serveur : script

vendredi, mai 2nd, 2008

Un script spécifique lors de la création d’un lien PPPXX à été écrit pour éliminer dans IPTABLES (mangle) les restes des connexions mal fermé. Le problème est l’accumulation dans la tabe mangle de connexion lié au même PPP alors que la connexion en cours à besoin d’un ajout en cours pour sa propre connexion PPP.

Le script effectue donc une élimination de toutes les lignes dans mangle traitant du PPP en cours ; ensuite il y a ajout de la bonne ligne PPP dans la table mangle.

Le fichier se trouve dans : ip-pre-up.d/vpn-pre-connect

Configuration serveurs : RADIUS et iptables

lundi, avril 14th, 2008

Le serveur RADIUS assure le AAA (Authorization, Authentication et Accounting). Pour ce faire, le service RADIUS recoit des informations du serveur IPSEC à travers la couche L2TP/PPP. C’est effectivement par ce biais que le client peut émettre une demande d’authentification supplémentaire au seul certificat.

sur le serveur IPSEC, nous avons dans /etc/options.l2tpd.lns qui est appelé par xl2tpd (pppoptfile = /etc/ppp/options.l2tpd.lns) les instructions suivantes :
plugin radius.so
plugin radattr.so

qui suffisent à utiliser un serveur RADIUS depuis L2TP.
Le fichier /etc/radiusclient.conf donne :
authserver "serveur radius"
acctserver "serveur radius"

Le reste des options étant des définitions standards, tels les dictionnaires
dictionary /etc/radiusclient/dictionary
dans lequel on retrouve :
INCLUDE /etc/radiusclient/dictionary.rfc2868
INCLUDE /etc/radiusclient/dictionary.microsoft
INCLUDE /etc/radiusclient/dict.perso

Le dictionnaire de la RFC 2868 est récupéré sur une machine sur laquelle se trouve un serveur RADIUS, mais il faut modifier certains type : “integer has_tag” devient “integer” et “string has_tag” devient “string”. Sans ces modifications, une erreur apparait dans les logs au lancement de l2tp. Il faut aussi enlever de ces fichiers dictionnaire les lignes de début et de fin de dictionnaire comme BEGIN-VENDOR et END-VENDOR .
Le dictionnaire de la RFC 2668 nous permet de manipuler les VLANs (Tunnel-Type 13 et Tunnel-Medium-Type IEEE-802 et la valeur du VLAN par le champ Tunnel-Private-Group-Id). Sans ces champs, il est impossible de définir les VLANs.

Cette approche à toute son utilité si nous voulions récupérer un numéro de VLAN depuis le serveur LDAP de l’UFC ou dans un fichier local (ou base de données). Or, notre approche du problème est légerement différente puisque nous n’utilisons pas de prédéfinition de VLAN pour un utilisateur, mais plutôt une définition de REALM permettant pour un même utilisateur d’accéder à différents VLANs.

Le serveur IPSEC est prêt à se servir du serveur RADIUS et les informations que nous récupérons sont :
nom de l’utilisateur, le realm, une date d’expiration, le réseau, la marque iptables, les indications de validité du compte et du realm.
Si le RADIUS du projet VPN est chainé à un RADIUS local de laboratoire, celui-ci peut renvoyer une valeur pour l’adresse IP du client, le RADIUS de laboratoire effectuant l’aspect DHCP. La valeur de l’IP ainsi retournée doit correspondre au réseau.
La marque iptables possède toute une histoire. Sur le serveur IPSEC, nous avons deux cartes réseaux. La première définie le réseau de connexion du serveur au monde extérieur et un route -n nous donne :
0.0.0.0 194.57.91.254 0.0.0.0 UG 0 0 0 eth1
La seconde est configuré en mode trunk et possède tous les VLANs rattachés au VPN. De fait, cette interface possède des sous-interfaces sur des VLANs (ex :
eth0.410 Lien encap:Ethernet HWaddr 00:B0:D0:68:72:BD
inet adr:172.20.252.253 Bcast:172.20.252.255 Masque:255.255.255.0
)
Mais il s’est posé un problème important ; dès la fin de la première connexion, les connexions suivantes n’étaient plus routées correctement. Pour corriger ce problème, nous avons défini un routage sélectif par marquage des paquets suivant leur origine.
auto eth0.410
iface eth0.410 inet static
address 172.20.252.253
netmask 255.255.255.0
network 172.20.252.0
broadcast 172.20.252.255
up ip route add default via 172.20.254 dev eth0.410 table ufc.generic
up ip rule add fwmark 13 table ufc.generic
down ip rule del fwmark 13
down ip route del table ufc.generic

Et on marque les paquets à l’initialisation de la session PPP faite par le client suivant le REALM demandé et accepté.
Avec l’exécutable perl /etc/ppp/ip-up.d/vpn-connect, nous créons un fichier /var/run/radattr.pppXX qui contient les informations retournées par RADIUS (ex :
Framed-IP-Address 172.20.128.37
Framed-IP-Netmask 255.255.255.0
Ufc-Iptables-Mark 12
)
Lors de la deconnexion, c’est le fichier /etc/ppp/ip-down.d/vpn-disconnect qui est exécuté.
Nous avons ainsi les logs de l’exécution des scripts :
Apr 10 16:37:35 test-vpn vpn-connect: /sbin/iptables -t mangle -A PREROUTING -s 172.20.128.37 -i ppp0 -j MARK --set-mark 12
Apr 10 16:37:40 test-vpn vpn-disconnect: iptables -D PREROUTING -s 172.20.128.37 -i ppp0 -j MARK --set-mark 0xc
Sur le serveur, il ne faut pas oublier de définir les valeurs données dans le fichier /etc/network/interfaces ; cela s’effectue en ajoutant les valeurs dans /etc/iproute2/rt_tables :
10 femto.ext
11 lifc.lab
12 lifc.edu
13 ufc.generic

Ainsi le traffic PPP du client est marqué correctement et est routé en utilisant le routeur du VLANs sur lequel il est raccordé.

Configuration serveurs : architecture

lundi, avril 14th, 2008

Le projet VPN repose non pas sur un seul serveur, mais sur des serveurs hébergants des services.
Chacun de ces services peut être colocalisé avec d’autres, mais pour des raisons d’administration et de risques (panne, piratgae) ceux-ci sont répartis.
Le serveur IPSEC a une adresse IP publique atteignable depuis l’extérieur de l’UFC sur le protocole ESP (50) ;
Le serveur d’authentification n’est atteignable que par le serveur IPSEC (classe privée). Il héberge un serveur RADIUS ;
La base de données POSTGRESQL qui contient les droits des utilisateurs est atteignable par le serveur RADIUS.

schéma de principe lors de la connexion d\'un client