Table des matières
FAI VPN
Fournisseur | VPN | M-A-J | Ports | Qualité | Commentaire |
ItsHidden.com | pptp | 08/2010 | tous ouverts | OK | correct. (+30 ms sur les pings) |
ipredator.se | pptp | 12/2009 | tous ouverts | Bof | trop lent ! (+120 ms sur les pings!) |
blackvpn.com | pptp/OpenVPN | 08/2010 | fermés! | OK | les ports P2P fermés = LowID (pas de redirection) je n'ai pas insisté |
vpntunnel.se | OpenVPN | 08/2010 | tous ouverts | OK | ping un peu lent (+120 ms). A l'usage: c'est bien. |
Client OpenVPN
OpenVPN est mieux, dans le sens où :
- la MTU est standard: 1500 (pas de règle iptables avec MSS…)
- le protocole est mieux fait (alors que “pptp” est un truc batard)
- le service/daemon peut être configuré pour maintenir la connexion 24h/24
- plus simple a configurer, sous Linux.
Généralité
# aptitude update # aptitude install openvpn
On peut s'inspirer de la conf dans le fichier “client.conf” :
# dpkg -S openvpn | grep client.conf openvpn: /usr/share/doc/openvpn/examples/sample-config-files/client.conf
On prépare des répertoires.
Pour les clés:
# cd /etc/openvpn # mkdir keys # chmod og-rx keys
Pour les confs:
# mkdir conf
On mettra les conf dans /etc/openvpn/conf
. Et lorsqu'on voudra les activer (a chaque redemarrage) il faudra creer des liens vers ces confs dans /etc/openvpn
.
Exemple:
# cd /etc/openvpn # ln -s /etc/openvpn/conf/client-vpntunnel-se.conf .
(Il faut que le fichier de conf soit terminé par “.conf”)
Et pour finir:
# /etc/init.d/openvpn restart
et un coup d'oeil dans les logs.
vpntunnel.se
Pour 5 euros pas mois…
On créé d'abord un compte… (on obtient les codes d'accès en passant).
On se prepare a recevoir des fichiers sensibles, et donc:
# cd /etc/openvpn/keys # mkdir vpntunnel.se
On se connecte sur son compte, et on recupère le fichier “ca.crt”
Qu'on place dans /etc/openvpn/keys/vpntunnel.se
Dans le même répertoire, on créé aussi un fichier texte contenant son “username” et “password” comme cela (2 lignes):
username password
On nomme ce fichier user-pass.txt
A partir de l'aide (du fournisseur de VPN), on compose une configuration comme cela:
client float dev tap proto udp remote-random remote melissa.vpntunnel.se 1194 remote melissa.vpntunnel.se 10010 remote melissa.vpntunnel.se 10020 resolv-retry infinite nobind persist-key persist-tun ca keys/vpntunnel.se/ca.crt ns-cert-type server cipher BF-CBC #Blowfish comp-lzo verb 3 auth-user-pass keys/vpntunnel.se/user-pass.txt
le “remote-random” c'est parce qu'il y a plusieurs serveurs VPN en “remote”
Et voila.
Un petit bémol: il detourne ma gateway par defaut. Je préfère faire cela moi-même.
Astuce pour creer des routes:
Ajouter dans la conf:
# TJ # ------------------------ # Execution de script script-security 2 up /etc/openvpn/scripts/up-vpn-itshidden-route down /etc/openvpn/scripts/down-vpn-itshidden-route # ------------------------
Monter les routes a partir des scripts sus-nommé… Par exemple:
#!/bin/sh ip rule add fwmark 0x000f0001 table 200 ip route add default dev $1 table 200 ip route flush cache
Où “$1” est le nom du tunnel (“tap0”) … ( man ip
pour le reste)
Client PPTP
Connexion à un serveur VPN via PPTP, par exemple avec http://www.itshidden.com
Preambule
Il faut d'abord créer un compte sur “itshidden” … ou bien connaitre un autre serveur VPN/PPTP.
Préparer client
# aptitude install pptp-linux
# modprobe ppp-compress-1
Au préalable, il peut etre necessaire d'installer “binutils” ainsi:
# aptitude update && aptitude install binutils
(parce ce que sinon, “pptpsetup” fait un test qui ne marche pas )
Creer un fichier “peer” comme ca:
# pptpsetup --create itshidden --server vpn.itshidden.com --username <login> --password <password> --encrypt
Adapter selon vos besoins:
itshidden
est le nom du serveur/fichier peer.
–encrypt
parce que ce serveur exige un cryptage.
Aprés cette commande, un fichier existe:
# cat /etc/ppp/peers/itshidden # written by pptpsetup pty "pptp vpn.itshidden.com --nolaunchpppd" lock noauth nobsdcomp nodeflate name <login> remotename itshidden ipparam itshidden require-mppe-128
Et d'autres fichiers aussi (au moins pour le <password>)
En prod
peer
La conf est plutot:
pty "pptp vpn-pay.itshidden.com --nolaunchpppd --localbind <ip_interface>" lock noauth nobsdcomp nodeflate name <login> remotename itshidden ipparam itshidden require-mppe-128 ##defaultroute ##replacedefaultroute ##usepeerdns #debug noipv6 persist # et aussi ---- mtu 1492 # <del>mtu 1400</del> <= it's a myth # ----------
Voir la section suivante a propos de la MTU |
ItsHidden.com : Sans “mtu 1492” (inférieure ou égale) , certains sites sont inaccessible, free.fr par exemple. |
Ipredator.se : Sans “mtu 1404” (inférieure ou égale) , certains sites sont inaccessible, free.fr par exemple. |
La MTU, plus c'est grand, mieux c'est.
Mais quand c'est trop grand ça marche pas, et quand c'est trop petit ça marche plus.
Où :
- <login> est le login
- <ip_interface> est l'adresse ip de l'interface de sortie utilisé (ouai, j'ai 17 interfaces réseaux ;) )
Et le vpn n'est pas la route par defaut. |
Les routages sont effectués avec “iptables” et “ip rule”… |
MTU
99%
La MTU pose plusieurs problème …
On en élimine une bonne partie en appliquant 2 choses simultannements:
- une MTU “raisonable” … genre: 1492 (pour ItsHidden.com) ou 1404 (pour Ipredator.se) .
- une règle IPTABLES qui va bien.
Voici la règle “iptables” nécessaire:
# iptables -t mangle -A POSTROUTING -o <IFACE> -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Où <IFACE>
est l'interface du vpn. Le plus souvent: ppp0
1%
Toutefois, il subsiste de mysterieux messages dans les logs:
kernel: [xxxx.xxxxx] mppe_compress[0]: osize too small! (have: 1404 need: 1408)
D'aprés mes recherches, dans le brouillard des archives :
- Soit c'est un problème de MTU, mais je cherche encore quoi !
- Soit c'est un bug inhérent au protocole PPTP (d'aprés ce que j'ai lu, il y aurait un algo qui veut toujours compresser les données, et parfois, il se retrouve avec plus de données qu'au départ.)
- Soit c'est simplement un bug. http://bugs.contribs.org/show_bug.cgi?id=5633
Connexion client
pon
On peut faire plus propre en s'attardant sur la config de “ppp” |
# pon itshidden
Ok ? Verifions:
# plog -f Jul 27 14:34:10 nin2 pppd[7256]: pppd 2.4.4 started by root, uid 0 Jul 27 14:34:10 nin2 pppd[7256]: Using interface ppp0 Jul 27 14:34:10 nin2 pppd[7256]: Connect: ppp0 <--> /dev/pts/3 Jul 27 14:34:14 nin2 pppd[7256]: Warning - secret file /etc/ppp/chap-secrets has world and/or group access Jul 27 14:34:14 nin2 pppd[7256]: Warning - secret file /etc/ppp/chap-secrets has world and/or group access Jul 27 14:34:14 nin2 pppd[7256]: CHAP authentication succeeded Jul 27 14:34:14 nin2 pppd[7256]: MPPE 128-bit stateless compression enabled Jul 27 14:34:14 nin2 pppd[7256]: Cannot determine ethernet address for proxy ARP Jul 27 14:34:14 nin2 pppd[7256]: local IP address 192.168.2.14 Jul 27 14:34:14 nin2 pppd[7256]: remote IP address 192.168.2.1
Et:
# ifconfig ppp0 ppp0 Link encap:Protocole Point-à-Point inet adr:192.168.2.14 P-t-P:192.168.2.1 Masque:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1496 Metric:1 RX packets:113 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:3 RX bytes:31795 (31.0 KiB) TX bytes:66 (66.0 B)
route
Indispensable si l'on fait ça comme un goret:
Effacer la route par defaut actuelle:
# route del default
Mettre la nouvelle:
# route add default gw 192.168.2.1
Adapter la “gateway” selon “ifconfig” et “plog”.
Mais comme les DNS ne peuvent plus me repondre…
# route add <dns1> gw <gw_local> # route add <dns2> gw <gw_local>
Et voila.
Deconnexion client
deroute
Si on est un goret, on fait:
# route del <dns2> gw <gw_local> # route del <dns1> gw <gw_local> # route del default # route add default gw <gw_local>
poff
# poff itshidden
Et voila.
$ plog -f Jul 27 14:47:21 nin2 pppd[7256]: Terminating on signal 15 Jul 27 14:47:21 nin2 pppd[7256]: Modem hangup Jul 27 14:47:21 nin2 pppd[7256]: Connect time 13.2 minutes. Jul 27 14:47:21 nin2 pppd[7256]: Sent 58038 bytes, received 433407 bytes. Jul 27 14:47:21 nin2 pppd[7256]: MPPE disabled Jul 27 14:47:21 nin2 pppd[7256]: Connection terminated. Jul 27 14:47:21 nin2 pppd[7256]: Exit.
Mais y a des relicats…
# route del 94.75.220.x # route del 94.75.220.y
bizarre…
Tips
default "pon"
Par defaut, si on tape “pon” sans precision, c'est le “peer” nommé “provider” qui est connecté.
Donc:
# cd /etc/ppp/peers # mv provider old-provider # ln -s /etc/ppp/peers/itshidden ./provider
crontab et reboot
Pour que la connexion “pon” soit automatique au reboot, faire un truc comme ca:
# crontab -e
Et puis avoir une ligne comme ça:
@reboot su -c "/usr/bin/pon"
Sans le “su” , ca ne fonctionne pas du tout (pppd retourne des erreurs). Je n'ai pas d'explication.
Idem pour d'autres scriptes qui pourraient s'executer à partir de “crontab” et nécessiter “pon/poff/pppd” ….
interfaces
Possible de mettre en oeuvre “ppp/pptp” via le classique fichier /etc/network/interfaces
!
D'abord, ajouter “updetach” dans le fichier “peers” et puis editer le fichier “interfaces” afin d'avoir, par exemple:
auto vpn iface vpn inet ppp provider itshidden
Et enfin:
# ifup vpn
et plus tard:
# ifdown vpn
Mais l'interface “vpn” n'existe nulle part dans “ifconfig” ou “ip link/addr” … c'est le traditionnel ppp0
qui reste la véritable interface.
Bien étrange, et peut être pas si interessant que cela…
Serveur
Liens:
Serveur PPTP et Windows Active Directory
Serveur PPTP et active directory.
environnement
- DomU
- amd 64 bit
- Debian Lenny
En dehors du systeme “Lenny”, les packages autour de “pptp”, “samba”, “winbind”, etc… seront piochés dans “lenny-backports” .
Le domaine: THIERRY-JAOUEN.FR
et c'est là qu'est l'os. le “.FR” créé une confusion entre domaine public et privé.
reseau
- Ip local: (elle est NATé via un firewall)
Pas d'ipv6, donc :
# echo "blacklist ipv6" >> /etc/modprobe.d/blacklist
Mais , associé au domaine “Windows” qui est “thierry-jaouen.fr”
Donc, dans /etc/resolv.conf
:
domain thierry-jaouen.fr search thierry-jaouen.fr thierry-jaouen.localhost nameserver 192.168.6.44 nameserver 8.8.8.8 nameserver 8.8.4.4
le 1er DNS doit être le Windows “Active Directory” |
Dans /etc/hostname
:
vpn-server.thierry-jaouen.fr
Dans /etc/hosts
:
127.0.0.1 localhost 127.0.1.1 vpn-server.thierry-jaouen.fr vpn-server
Windows
Le “Active Directory” Windows doit avoir son DNS configuré pour faire un “reverse” correct de l'ip du serveur vpn.
Windows Server > Demarrer > Outils d'Administration > DNS > Zone Recherche Inverse > 192.168.6.x > Nouveau pointeur PTR > 192.168.6.44 = vpn-server.thierry-jaouen.fr
backports
Dans /etc/apt/sources.list
:
... <snip> ... # backports deb http://backports.debian.org/debian-backports lenny-backports main contrib non-free
Dans /etc/apt/preferences
:
Package: * Pin: release a=lenny-backports Pin-Priority: 200
ferm
Firewall !
Autoriser le forward et interdire la reponse arp pour n'importe quel interface:
Donc, dans /etc/sysctl.conf
:
... <snip> ... net.ipv4.conf.all.arp_ignore=1 net.ipv4.ip_forward=1
Et puis:
# sysctl -p
Preparer quelques modules (avant d'installer ferm):
Donc, dans /etc/modules
:
ip_tables ip_conntrack_ftp ip_nat_ftp ip_conntrack_irc ##ip_nat_pptp ##ip_conntrack_pptp
Et faire (le reste pouvant attendre) :
# modprobe ip_tables
Installer ferm
:
# aptitude -t lenny-backports install ferm
Mettre les règles, dans /etc/ferm/ferm.conf
:
# ------------------------------------ # Regles iptables avec Ferm # ------------------------------------ # LAN thierry jaouen @def $LAN_IF = "eth0"; # VPN @def $VPN_IF = ppp+; # --------------------- chain ( INPUT OUTPUT FORWARD ) policy DROP; # --------------------- # Local # --------------------- chain INPUT if lo ACCEPT; chain OUTPUT of lo ACCEPT; # --------------------- # LAN # --------------------- chain INPUT if $LAN_IF ACCEPT; chain OUTPUT of $LAN_IF ACCEPT; # --------------------- # VPN # --------------------- chain INPUT if $VPN_IF ACCEPT; chain OUTPUT of $VPN_IF ACCEPT; # modifier "mtu" a la volée, sinon, certains sites dont "www.free.fr" sont inaccessible # vpn => lan => internet table mangle chain FORWARD if $VPN_IF of $LAN_IF proto tcp tcp-flags ( SYN RST ) SYN TCPMSS clamp-mss-to-pmtu; chain FORWARD if $VPN_IF of $LAN_IF mod state state ( NEW ESTABLISHED RELATED ) ACCEPT; chain FORWARD if $LAN_IF of $VPN_IF mod state state ( NEW ESTABLISHED RELATED ) ACCEPT; # --------------------- # EOF
Mais pourquoi tout cela ?
D'abord, pour pouvoir ultérieurement appliqués des restrictions: ce n'est pas le cas ici.
Ensuite, pour qu'un site comme “www.free.fr” soit accéssible !
Et oui, avec “free” (et surement quelques centaines de milliers d'autres sites), il y a un problème de MTU. Ce problème disparait avec la règle “MSS” ci-dessus.
Appliquer ferm
:
# ferm ferm.conf
pptpd
*SANS* active directory pour commencer.
aptitude -t lenny-backports install pptpd
Dans /etc/pptpd.conf
:
... <snip> ... localip 192.168.23.254 remoteip 192.168.23.64-191 connections 10 listen 192.168.6.43
Dans /etc/ppp/pptpd-options
:
name pptpd refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 ms-dns 192.168.6.44 ms-dns 8.8.8.8 noproxyarp defaultroute lock nobsdcomp novj novjccomp nologfd auth nopersist
A noter:
- “noproxyarp” et “defaultroute” qui sont a l'opposé de la conf par defaut.
- “novj”, “novjccomp”, “nologfd”, “auth” et “nopersist” qui sont ajoutés.
En pratique “(no)proxyarp” “(no)defaultroute” ne fait rien que je puisse etudier!!! je sais, c'est bizarre. A vous de voir! |
# /etc/init.d/pptpd restart
kerberos
# aptitude -t lenny-backports install krb5-config krb5-user
Serveurs Kerberos pour votre domaine :
pdc1.thierry-jaouen.fr pdc2.thierry-jaouen.fr
Serveur administratif:
pdc1.thierry-jaouen.fr
adapter le fichier /etc/krb5.conf
:
... <snip> ... [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log ... <snip> ... [libdefaults] default_realm = THIERRY-JAOUEN.FR dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h forwardable = yes ... <snip> ... [realms] THIERRY-JAOUEN.FR = { kdc = pdc1.thierry-jaouen.fr kdc = pdc2.thierry-jaouen.fr admin_server = pdc1.thierry-jaouen.fr default_domain = thierry-jaouen.fr } ... <snip> ... [domain_realm] ... <snip> ... .thierry-jaouen.fr = THIERRY-JAOUEN.FR thierry-jaouen.fr = THIERRY-JAOUEN.FR ... <snip> ...
Et puis:
# kinit administrateur@THIERRY-JAOUEN.FR Password for administrateur@THIERRY-JAOUEN.FR:
Verifier que ca fonctionne avec:
# klist
winbind et samba
… nul besoin d'installer samba !
# aptitude -t lenny-backports install winbind
Domaine: (on s'en fout)
THIERRY-JAOUEN
Wins DHCP:
NON
Modifier /etc/samba/smb.conf
:
[global] workgroup = THIERRY-JAOUEN realm = THIERRY-JAOUEN.FR server string = %h server interfaces = 192.168.6.43, lo bind interfaces only = Yes security = ADS password server = 192.168.6.44 log file = /var/log/samba/%m.log max log size = 50 load printers = No printcap name = /dev/null local master = No domain master = No dns proxy = No # TJ ----------- # 2010/11/10 wins support = no #wins server = 192.168.6.44 # -------------- panic action = /usr/share/samba/panic-action %d idmap uid = 30000-40000 idmap gid = 30000-40000 template shell = /bin/bash winbind separator = + winbind enum users = Yes winbind enum groups = Yes printing = bsd print command = lpr -r -P'%p' %s lpq command = lpq -P'%p' lprm command = lprm -P'%p' %j [homes] comment = Home Directories valid users = %S create mask = 0700 directory mask = 0700 browseable = No [printers] comment = All Printers path = /var/spool/samba create mask = 0700 printable = Yes browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/printers
Je crois qu'en dehors de la section “global” , le reste ne sert a rien.
# net rpc join -S pdc1.thierry-jaouen.fr -U administrateur Enter administrateur's password: Joined domain THIERRY-JAOUEN.
# /etc/init.d/winbind restart
# wbinfo -t checking the trust secret for domain THIERRY-JAOUEN via RPC calls succeeded
Ok.
Ainsi que:
# wbinfo -u
… retourne la liste des comptes presents.
# wbinfo -g
… retourne la liste des groupes…
Nous voila pret a associer le serveur “pptpd” et l'“Active Directory” Windows.
pptpd et Active Directory
Il suffit d'ajouter dans /etc/ppp/pptpd-options
:
plugin winbind.so ntlm_auth-helper "/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1"
Pour autoriser que des utilisateurs appartenant au groupe “Group-VPN” :
ntlm_auth-helper "/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1 --require-membership-of=THIERRY-JAOUEN+Group-VPN"
… et puis:
# /etc/init.d/pptpd restart
ItsHidden
Lien: http://www.itshidden.com
limites
Starting Nmap 4.62 ( http://nmap.org ) at 2009-12-03 01:02 CET Interesting ports on xxxxxx: Not shown: 1712 filtered ports PORT STATE SERVICE 6881/tcp closed bittorrent-tracker
Oups… pas de bittorrent