Projet

Général

Profil

VirtualisationService » Historique » Version 19

Élie Bouttier, 06/01/2014 20:56

1 1 Laurent GUERBY
{{>toc}}
2 1 Laurent GUERBY
3 1 Laurent GUERBY
h1. VirtualisationService
4 1 Laurent GUERBY
5 1 Laurent GUERBY
h2. Objet
6 1 Laurent GUERBY
7 19 Élie Bouttier
Dans l'environnement tetaneutral.net un adhérent a le choix d'utiliser plusieurs IPv4 publiques et un bridge avec son interface pour virtualiser mais ceci consomme plusieurs IPv4 publiques.
8 1 Laurent GUERBY
9 19 Élie Bouttier
Une alternative est de n'utiliser qu'une IPv4 publique et de creer des VMs sur un bridge interne (qui n'a pas l'interface de sortie comme port) avec des IPv4 privées et de se servir de l'hote pour router les requetes de service suivant les ports. Par exemple 
10 1 Laurent GUERBY
11 1 Laurent GUERBY
- tcp/2222 => ssh host
12 1 Laurent GUERBY
- tcp/2223 => ssh VM1
13 1 Laurent GUERBY
- tcp/2224 => ssh VM2
14 1 Laurent GUERBY
- tcp/2225 => ssh VM3
15 8 Fabien Dupont
- tcp/80 => reverse proxy (nginx, apache, varnish, ...) sur host pour redispatch par domaine sur VM1+VM2
16 19 Élie Bouttier
- tcp/443 => idem (ouais mais faut gérer le SSL alors !?)
17 1 Laurent GUERBY
- udp/1194 => serveur openvpn sur VM3
18 1 Laurent GUERBY
19 19 Élie Bouttier
En IPv6 il n'y a pas de probleme car l'adhérent a un /56 donc pas de limite aux IPs de service, il suffit de demander l'activation du routage IPv6 coté tetaneutral.net
20 1 Laurent GUERBY
21 3 Raphaël Durand
h2. Solutions
22 3 Raphaël Durand
23 14 yannick deroche
+Solarus :+
24 19 Élie Bouttier
- Pour mutualiser une IPv4 sur HTTP on peut mettre en place un proxy nginx. J'en ai déjà un en place sur mon serveur. Je peux le prêter ou en faire un tuto pour en monter un.
25 19 Élie Bouttier
- Pour le reste des flux, je conseille de monter un NAT/PAT et configurer les redirections de port entrants. On peut faire ça avec IPtables sous Linux ou BSD. On peut utiliser une machine virtuelle ou un OpenWRT si on veut le faire sur une machine séparée.
26 8 Fabien Dupont
27 14 yannick deroche
+Fab :+
28 19 Élie Bouttier
- En cas de reverse proxy HTTP, faut gérer le SSL pour le HTTPS...galère, galère
29 19 Élie Bouttier
- On peut déjà migrer tous les services internes à TTNN sur des IP RFC 1918, quitte à superviser les VM/machines via un rebond SSH (possible dans cmk) ou qu'en IPv6 (possible aussi)
30 19 Élie Bouttier
- Pour tout ce qui est serveur de mail, on peut proposer un (ou même plusieurs) MTA qui accepte tous les domaines des MTA hébergés sur les VMs et qui redispatche (une sorte de reverse proxy mail, en fait) (remarque de Solarus : Attention à la mutualisation des MTA sur un proxy SMTP, notamment la gestion des spams entrants et sortants et le risque de blacklistage des adresses)
31 19 Élie Bouttier
- Pour certaines VMs/machines qui n'hébergent pas de services ouverts ont peut sensibiliser les adhérents à l'IPv6 only (c'est ce que je fait sur ma VM)
32 1 Laurent GUERBY
33 1 Laurent GUERBY
+Yannick:+
34 19 Élie Bouttier
* utilisation d'un firewall logiciel en VM (pfSense, IPcop, Zentyal ...) qui porte l'adresse IP publique et avec utilisation de règle de NAT/PAT (translation d'adresse et de port)
35 1 Laurent GUERBY
              + simple d'utilisation, interface graphique disponible pour les allergiques de la CLI
36 19 Élie Bouttier
              + Existe en "virtual appliance" pré-packagés pour les environnement virtuels
37 19 Élie Bouttier
              + il esxiste même des version virtualisées de Firewall physique de grands constructeurs (Fortinet, Juniper...)
38 8 Fabien Dupont
39 19 Élie Bouttier
* utilisation d'un reverse proxy pour porter l'@IP publique et rediriger le trafic en fonction du protocole et ce qui est appelé.
40 19 Élie Bouttier
              +- la conf est un peu plus complexe mais au moins tu peux tout maitriser de la couche 3 à la couche 7 (www.exemple.com/toto --> vers le serveur_1:80 ; www.exemple.com/tata --> serveur_2:80 ...)
41 19 Élie Bouttier
              - par contre, pas de fonction firewall avancée
42 19 Élie Bouttier
              + il en existe pas mal: Squid, Apache avec module RP, NGINX avec module RP, F5 BigIP VE (version limité à 90j) ...
43 14 yannick deroche
44 19 Élie Bouttier
--> mon conseil: un pfSense en machine virtuelle qui porte l'@IP publique et qui fait passerelle entre internet et un lan privé. (en cas de plusieurs services HTTP à écouter sur le port 80 -> reverse-proxy NGINX)
45 12 yannick deroche
46 19 Élie Bouttier
+Élie:+
47 19 Élie Bouttier
Config perso, assez consensuelle visiblement :
48 19 Élie Bouttier
* OpenBSD portant l’IP public
49 19 Élie Bouttier
* DNAT vers les autres VM et l’host (routage normal pour l’IPv6)
50 19 Élie Bouttier
* « backdoor » sur l’host : RFC1918 pour y accéder depuis une machine de ttn en cas de soucis avec l’OpenBSD
51 19 Élie Bouttier
* Je déconseille l’host qui porte l’ip public, c’est vraiment plus difficile à tenir propre, et les erreurs de conf sont bien plus fatales …
52 19 Élie Bouttier
* Une VM « web » qui reçoit le 80 et 443 et fait éventuellement du reverse proxy pour les services fournit par d’autres VM
53 19 Élie Bouttier
* Une seul VM accessible en SSH (« passerelle SSH ») avec fail2ban (nécessité de faire 2 ssh pour les autres VM)
54 19 Élie Bouttier
* Un VPN pour se simplifier la vie au quotidien (<pub>FreeLAN c’est super cool !</pub>, mais j’ai aussi un OpenVPN)
55 19 Élie Bouttier
56 1 Laurent GUERBY
h2. Liens
57 1 Laurent GUERBY
58 16 yannick deroche
Firewall/gateway:
59 16 yannick deroche
pfSense: http://www.pfsense.org/
60 16 yannick deroche
Zentyal: http://www.zentyal.org/
61 16 yannick deroche
Juniper Firefly: http://www.juniper.net/support/downloads/?p=firefly#docs
62 16 yannick deroche
63 16 yannick deroche
Reverse-proxy:
64 16 yannick deroche
Apache: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
65 16 yannick deroche
NGINX: http://wiki.nginx.org/Main
66 16 yannick deroche
Squid: http://www.squidreverseproxy.com/
67 16 yannick deroche
F5: https://www.f5.com/trial/big-ip-ltm-virtual-edition.php
68 1 Laurent GUERBY
69 5 Raphaël Durand
70 6 Raphaël Durand
71 5 Raphaël Durand
h2. Configuration d'un reverse proxy nginx
72 5 Raphaël Durand
73 5 Raphaël Durand
Ci-dessous voici une conf typique pour mettre en place un reverse-proxy nginx afin de partager une IP publique pour plusieurs serveurs.
74 5 Raphaël Durand
Le systeme fonctionne par Virtual Host (comme sous Apache)
75 7 Raphaël Durand
76 19 Élie Bouttier
Pour chaque Virtual Host, il faut créer un fichier de ce type dans /etc/nginx/sites-enabled
77 1 Laurent GUERBY
78 1 Laurent GUERBY
<pre>
79 5 Raphaël Durand
server {
80 5 Raphaël Durand
        listen   80;
81 1 Laurent GUERBY
        server_name  *.exemple.tld;
82 1 Laurent GUERBY
        location / {
83 1 Laurent GUERBY
                proxy_pass         http://10.255.254.1;
84 7 Raphaël Durand
    }
85 1 Laurent GUERBY
}
86 5 Raphaël Durand
server {
87 1 Laurent GUERBY
        listen 443;
88 1 Laurent GUERBY
        server_name  *.exemple.tld;
89 1 Laurent GUERBY
        ssl                     on;
90 5 Raphaël Durand
        ssl_certificate     certificat_ssl.crt;
91 5 Raphaël Durand
        ssl_certificate_key certificat_ssl.crt;
92 5 Raphaël Durand
        location / {
93 5 Raphaël Durand
                proxy_pass         https://10.255.254.1;
94 5 Raphaël Durand
    }
95 5 Raphaël Durand
}
96 5 Raphaël Durand
</pre>
97 19 Élie Bouttier
Les champs à remplir sont 'server_name' avec le domaine du virtual host et 'proxy_pass' avec l'IP privée du serveur.
98 19 Élie Bouttier
Le deuxième bloc servira uniquement si vous voulez faire du HTTPS, il vous restera alors à renseigner les emplacements des certificats.
99 1 Laurent GUERBY
100 19 Élie Bouttier
Cette méthode présente un inconvénient c'est que l'IP des visiteurs n'est pas directement visible,ce qui peut être gênant pour les blogs et les système de commentaires.
101 10 Philippe Latu
102 1 Laurent GUERBY
h2. Redirection de port(s) via iptables.
103 1 Laurent GUERBY
104 19 Élie Bouttier
Cette solution est loin d'être la panacée. Elle permet de multiplexer un service d'une @IP publique vers n @IP privées.
105 10 Philippe Latu
106 19 Élie Bouttier
Voici un exemple de règles pour ouvrir l'accès SSH sur le port 22 d'une centaine de VMs adressées de 172.16.0.1 à 172.16.0.100 à partir d'une @IP publique unique.
107 10 Philippe Latu
108 19 Élie Bouttier
h3. 1/ Régles à copier dans la section de la table NAT
109 10 Philippe Latu
110 10 Philippe Latu
<pre>for ((i = 1; i <= 100; i++)); do  
111 19 Élie Bouttier
   echo "-A PREROUTING -i [Nom-interface-réseau-public] -d [@IP-publique] -p tcp --dport $((2200 + $i)) -j DNAT --to-destination 172.16.0.$i:22";
112 10 Philippe Latu
done >> /etc/iptables/rules-to-add</pre>
113 10 Philippe Latu
114 19 Élie Bouttier
h3. 2/ Régle à copier dans la section de la table netfilter
115 10 Philippe Latu
116 19 Élie Bouttier
<pre>-A FORWARD -i [Nom-interface-réseau-public] -m iprange --dst-range 172.16.0.1-172.16.0.100 -p tcp --syn --dport 22 -m conntrack --ctstate NEW -j ACCEPT</pre>
117 10 Philippe Latu
118 19 Élie Bouttier
h3. 3/ Fichier de règles «résumé» utilisable avec le paquet Debian iptables-persistent
119 10 Philippe Latu
120 10 Philippe Latu
<pre>#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121 10 Philippe Latu
# NAT
122 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
123 10 Philippe Latu
*nat
124 10 Philippe Latu
:PREROUTING ACCEPT [0:0]
125 10 Philippe Latu
:POSTROUTING ACCEPT [0:0]
126 10 Philippe Latu
:OUTPUT ACCEPT [0:0]
127 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
128 10 Philippe Latu
#  P O S T R O U T I N G
129 1 Laurent GUERBY
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130 19 Élie Bouttier
-A POSTROUTING -o [Nom-interface-réseau-public] -p tcp --syn -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
131 19 Élie Bouttier
-A POSTROUTING -o [Nom-interface-réseau-public] -m iprange --src-range 172.16.0.1-172.16.0.100 -j SNAT --to-source [@IP-publique]
132 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
133 10 Philippe Latu
#  P R E R O U T I N G
134 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
135 19 Élie Bouttier
-A PREROUTING -i [Nom-interface-réseau-public] -d [@IP-publique] -p tcp --dport 2201 -j DNAT --to-destination 172.16.0.1:22
136 19 Élie Bouttier
-A PREROUTING -i [Nom-interface-réseau-public] -d [@IP-publique] -p tcp --dport 2202 -j DNAT --to-destination 172.16.0.2:22
137 10 Philippe Latu
<snip/>
138 1 Laurent GUERBY
#
139 10 Philippe Latu
COMMIT
140 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141 10 Philippe Latu
#  N e t f i l t e r
142 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143 10 Philippe Latu
*filter
144 10 Philippe Latu
:INPUT DROP [0:0]
145 1 Laurent GUERBY
:FORWARD DROP [0:0]
146 1 Laurent GUERBY
:OUTPUT ACCEPT [0:0]
147 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
148 10 Philippe Latu
#  I N P U T
149 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
150 19 Élie Bouttier
# Suivi de communication chaîne INPUT
151 10 Philippe Latu
-A INPUT -p icmp -m conntrack --ctstate ESTABLISHED -j ACCEPT
152 10 Philippe Latu
-A INPUT -p icmp --icmp-type destination-unreachable -m conntrack --ctstate RELATED -j ACCEPT
153 10 Philippe Latu
-A INPUT -p icmp --icmp-type time-exceeded -m conntrack --ctstate RELATED -j ACCEPT
154 10 Philippe Latu
-A INPUT -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
155 10 Philippe Latu
-A INPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT
156 10 Philippe Latu
-A INPUT -p tcp --syn -m conntrack --ctstate RELATED -j ACCEPT
157 10 Philippe Latu
# Boucle locale
158 10 Philippe Latu
-A INPUT -i lo -j ACCEPT
159 10 Philippe Latu
# ICMP
160 10 Philippe Latu
-A INPUT -i bond+ -p icmp --icmp-type echo-request -m limit --limit 5/sec -m conntrack --ctstate NEW -j ACCEPT
161 10 Philippe Latu
# SSH
162 10 Philippe Latu
-A INPUT -m recent --update --seconds 60 --hitcount 4 --name SSH -m limit --limit 5/min -j LOG --log-prefix "SSH_brute_force "
163 10 Philippe Latu
-A INPUT -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
164 19 Élie Bouttier
-A INPUT -i [Nom-interface-réseau-public] -p tcp --dport 22 --syn -m recent --set --name SSH -j ACCEPT
165 10 Philippe Latu
# POUBELLE
166 10 Philippe Latu
-A INPUT -m conntrack --ctstate INVALID -m limit --limit 1/min -j LOG --log-prefix "INPUT/rejected.iptables: "
167 10 Philippe Latu
-A INPUT -m conntrack --ctstate INVALID -j DROP
168 10 Philippe Latu
-A INPUT -p tcp -j REJECT --reject-with tcp-reset -m limit --limit 5/s
169 1 Laurent GUERBY
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -m limit --limit 5/s
170 10 Philippe Latu
-A INPUT -m limit --limit 1/min -j LOG --log-prefix "INPUT/poubelle: "
171 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
172 10 Philippe Latu
#  F O R W A R D
173 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
174 19 Élie Bouttier
# Suivi de communication chaîne FORWARD
175 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate ESTABLISHED -j ACCEPT
176 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate RELATED --icmp-type destination-unreachable -j ACCEPT
177 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate RELATED --icmp-type time-exceeded -j ACCEPT
178 10 Philippe Latu
-A FORWARD -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
179 10 Philippe Latu
-A FORWARD -p tcp -m conntrack --ctstate ESTABLISHED ! --syn -j ACCEPT
180 10 Philippe Latu
-A FORWARD -p tcp -m conntrack --ctstate RELATED --syn -j ACCEPT
181 10 Philippe Latu
# Boucle locale
182 10 Philippe Latu
-A FORWARD -i lo -j ACCEPT
183 19 Élie Bouttier
# Accès SSH VMs
184 19 Élie Bouttier
-A FORWARD -i [Nom-interface-réseau-public] -m iprange --dst-range 172.16.0.1-172.16.0.100 -p tcp --syn --dport 22 -m conntrack --ctstate NEW -j ACCEPT
185 10 Philippe Latu
# Poubelle
186 10 Philippe Latu
-A FORWARD -m conntrack --ctstate INVALID -m limit --limit 5/min -j LOG --log-prefix "FORWARD/rejected: "
187 10 Philippe Latu
-A FORWARD -m conntrack --ctstate INVALID -j DROP
188 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/min -j LOG --log-prefix "FORWARD/TCP.rejected: "
189 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/sec -j REJECT --reject-with tcp-reset
190 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/min -j LOG --log-prefix "FORWARD/UDP.rejected: "
191 10 Philippe Latu
-A FORWARD -p udp -m limit --limit 5/sec -j REJECT --reject-with icmp-port-unreachable
192 10 Philippe Latu
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "FORWARD/poubelle: "
193 10 Philippe Latu
#
194 10 Philippe Latu
COMMIT</pre>
195 10 Philippe Latu
196 1 Laurent GUERBY
h2. Documentation
197 1 Laurent GUERBY
198 1 Laurent GUERBY
TODO
199 1 Laurent GUERBY
nginx
200 1 Laurent GUERBY
apache
201 4 Laurent GUERBY
varnish
202 1 Laurent GUERBY
iptables
203 1 Laurent GUERBY
shorewall
204 1 Laurent GUERBY
netcat
205 2 Laurent GUERBY
206 18 Mehdi Abaakouk
[[OperationMutualisationIpv4]] Projet de mutualisation ipv4 chez tetaneutral
207 18 Mehdi Abaakouk
208 19 Élie Bouttier
h2. Bénévoles
209 17 Mehdi Abaakouk
210 17 Mehdi Abaakouk
TODO toulibre ou capitole du libre