Projet

Général

Profil

VirtualisationService » Historique » Version 16

yannick deroche, 25/09/2013 16:04

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 1 Laurent GUERBY
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 1 Laurent GUERBY
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 8 Fabien Dupont
- 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 1 Laurent GUERBY
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 14 yannick deroche
- 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 1 Laurent GUERBY
- 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 8 Fabien Dupont
- En cas de reverse proxy HTTP, faut gérer le SSL pour le HTTPS...galère, galère
29 8 Fabien Dupont
- 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 3 Raphaël Durand
- 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 12 yannick deroche
- 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 13 yannick deroche
33 14 yannick deroche
+Yannick:+
34 13 yannick deroche
* 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 12 yannick deroche
              + simple d'utilisation, interface graphique disponible pour les allergiques de la CLI
36 12 yannick deroche
              + Existe en "virtual appliance" pré-packagés pour les environnement virtuels
37 1 Laurent GUERBY
              + il esxiste même des version virtualisées de Firewall physique de grands constructeurs (Fortinet, Juniper...)
38 12 yannick deroche
39 13 yannick deroche
* utilisation d'un reverse proxy pour porter l'@IP publique et rediriger le trafic en fonction du protocole et ce qui est appelé.
40 12 yannick deroche
              +- 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 12 yannick deroche
              - par contre, pas de fonction firewall avancée
42 16 yannick deroche
              + il en existe pas mal: Squid, Apache avec module RP, NGINX avec module RP, F5 BigIP VE (version limité à 90j) ...
43 12 yannick deroche
44 15 yannick deroche
--> 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 1 Laurent GUERBY
h2. Liens
47 1 Laurent GUERBY
48 16 yannick deroche
Firewall/gateway:
49 16 yannick deroche
pfSense: http://www.pfsense.org/
50 16 yannick deroche
Zentyal: http://www.zentyal.org/
51 16 yannick deroche
Juniper Firefly: http://www.juniper.net/support/downloads/?p=firefly#docs
52 16 yannick deroche
53 16 yannick deroche
Reverse-proxy:
54 16 yannick deroche
Apache: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
55 16 yannick deroche
NGINX: http://wiki.nginx.org/Main
56 16 yannick deroche
Squid: http://www.squidreverseproxy.com/
57 16 yannick deroche
F5: https://www.f5.com/trial/big-ip-ltm-virtual-edition.php
58 16 yannick deroche
59 16 yannick deroche
60 1 Laurent GUERBY
61 5 Raphaël Durand
h2. Configuration d'un reverse proxy nginx
62 5 Raphaël Durand
63 6 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.
64 5 Raphaël Durand
Le systeme fonctionne par Virtual Host (comme sous Apache)
65 5 Raphaël Durand
66 5 Raphaël Durand
Pour chaque Virtual Host, il faut créer un fichier de ce type dans /etc/nginx/sites-enabled
67 5 Raphaël Durand
68 5 Raphaël Durand
<pre>
69 5 Raphaël Durand
server {
70 5 Raphaël Durand
        listen   80;
71 7 Raphaël Durand
        server_name  *.exemple.tld;
72 5 Raphaël Durand
        location / {
73 5 Raphaël Durand
                proxy_pass         http://10.255.254.1;
74 5 Raphaël Durand
    }
75 5 Raphaël Durand
}
76 5 Raphaël Durand
server {
77 5 Raphaël Durand
        listen 443;
78 7 Raphaël Durand
        server_name  *.exemple.tld;
79 5 Raphaël Durand
        ssl                     on;
80 5 Raphaël Durand
        ssl_certificate     certificat_ssl.crt;
81 5 Raphaël Durand
        ssl_certificate_key certificat_ssl.crt;
82 5 Raphaël Durand
        location / {
83 5 Raphaël Durand
                proxy_pass         https://10.255.254.1;
84 5 Raphaël Durand
    }
85 5 Raphaël Durand
}
86 5 Raphaël Durand
</pre>
87 6 Raphaël Durand
Les champs à remplir sont 'server_name' avec le domaine du virtual host et 'proxy_pass' avec l'IP privée du serveur.
88 5 Raphaël Durand
Le deuxième bloc servira uniquement si vous voulez faire du HTTPS, il vous restera alors à renseigner les emplacements des certificats.
89 5 Raphaël Durand
90 5 Raphaël Durand
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.
91 5 Raphaël Durand
92 10 Philippe Latu
h2. Redirection de port(s) via iptables.
93 10 Philippe Latu
94 10 Philippe Latu
Cette solution est loin d'être la panacée. Elle permet de multiplexer un service d'une @IP publique vers n @IP privées.
95 10 Philippe Latu
96 10 Philippe Latu
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.
97 10 Philippe Latu
98 10 Philippe Latu
h3. 1/ Régles à copier dans la section de la table NAT
99 10 Philippe Latu
100 10 Philippe Latu
<pre>for ((i = 1; i <= 100; i++)); do  
101 10 Philippe Latu
   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";
102 10 Philippe Latu
done >> /etc/iptables/rules-to-add</pre>
103 10 Philippe Latu
104 10 Philippe Latu
h3. 2/ Régle à copier dans la section de la table netfilter
105 10 Philippe Latu
106 10 Philippe Latu
<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>
107 10 Philippe Latu
108 10 Philippe Latu
h3. 3/ Fichier de règles «résumé» utilisable avec le paquet Debian iptables-persistent
109 10 Philippe Latu
110 10 Philippe Latu
<pre>#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111 10 Philippe Latu
# NAT
112 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113 10 Philippe Latu
*nat
114 10 Philippe Latu
:PREROUTING ACCEPT [0:0]
115 10 Philippe Latu
:POSTROUTING ACCEPT [0:0]
116 10 Philippe Latu
:OUTPUT ACCEPT [0:0]
117 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118 10 Philippe Latu
#  P O S T R O U T I N G
119 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120 10 Philippe Latu
-A POSTROUTING -o [Nom-interface-réseau-public] -p tcp --syn -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
121 10 Philippe Latu
-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]
122 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
123 10 Philippe Latu
#  P R E R O U T I N G
124 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
125 10 Philippe Latu
-A PREROUTING -i [Nom-interface-réseau-public] -d [@IP-publique] -p tcp --dport 2201 -j DNAT --to-destination 172.16.0.1:22
126 10 Philippe Latu
-A PREROUTING -i [Nom-interface-réseau-public] -d [@IP-publique] -p tcp --dport 2202 -j DNAT --to-destination 172.16.0.2:22
127 10 Philippe Latu
<snip/>
128 10 Philippe Latu
#
129 10 Philippe Latu
COMMIT
130 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
131 10 Philippe Latu
#  N e t f i l t e r
132 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
133 10 Philippe Latu
*filter
134 10 Philippe Latu
:INPUT DROP [0:0]
135 10 Philippe Latu
:FORWARD DROP [0:0]
136 10 Philippe Latu
:OUTPUT ACCEPT [0:0]
137 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
138 10 Philippe Latu
#  I N P U T
139 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
140 10 Philippe Latu
# Suivi de communication chaîne INPUT
141 10 Philippe Latu
-A INPUT -p icmp -m conntrack --ctstate ESTABLISHED -j ACCEPT
142 10 Philippe Latu
-A INPUT -p icmp --icmp-type destination-unreachable -m conntrack --ctstate RELATED -j ACCEPT
143 10 Philippe Latu
-A INPUT -p icmp --icmp-type time-exceeded -m conntrack --ctstate RELATED -j ACCEPT
144 10 Philippe Latu
-A INPUT -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
145 10 Philippe Latu
-A INPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT
146 10 Philippe Latu
-A INPUT -p tcp --syn -m conntrack --ctstate RELATED -j ACCEPT
147 10 Philippe Latu
# Boucle locale
148 10 Philippe Latu
-A INPUT -i lo -j ACCEPT
149 10 Philippe Latu
# ICMP
150 10 Philippe Latu
-A INPUT -i bond+ -p icmp --icmp-type echo-request -m limit --limit 5/sec -m conntrack --ctstate NEW -j ACCEPT
151 10 Philippe Latu
# SSH
152 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 "
153 10 Philippe Latu
-A INPUT -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
154 10 Philippe Latu
-A INPUT -i [Nom-interface-réseau-public] -p tcp --dport 22 --syn -m recent --set --name SSH -j ACCEPT
155 10 Philippe Latu
# POUBELLE
156 10 Philippe Latu
-A INPUT -m conntrack --ctstate INVALID -m limit --limit 1/min -j LOG --log-prefix "INPUT/rejected.iptables: "
157 10 Philippe Latu
-A INPUT -m conntrack --ctstate INVALID -j DROP
158 10 Philippe Latu
-A INPUT -p tcp -j REJECT --reject-with tcp-reset -m limit --limit 5/s
159 10 Philippe Latu
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -m limit --limit 5/s
160 10 Philippe Latu
-A INPUT -m limit --limit 1/min -j LOG --log-prefix "INPUT/poubelle: "
161 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
162 10 Philippe Latu
#  F O R W A R D
163 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
164 10 Philippe Latu
# Suivi de communication chaîne FORWARD
165 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate ESTABLISHED -j ACCEPT
166 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate RELATED --icmp-type destination-unreachable -j ACCEPT
167 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate RELATED --icmp-type time-exceeded -j ACCEPT
168 10 Philippe Latu
-A FORWARD -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
169 10 Philippe Latu
-A FORWARD -p tcp -m conntrack --ctstate ESTABLISHED ! --syn -j ACCEPT
170 10 Philippe Latu
-A FORWARD -p tcp -m conntrack --ctstate RELATED --syn -j ACCEPT
171 10 Philippe Latu
# Boucle locale
172 10 Philippe Latu
-A FORWARD -i lo -j ACCEPT
173 10 Philippe Latu
# Accès SSH VMs
174 10 Philippe Latu
-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
175 10 Philippe Latu
# Poubelle
176 10 Philippe Latu
-A FORWARD -m conntrack --ctstate INVALID -m limit --limit 5/min -j LOG --log-prefix "FORWARD/rejected: "
177 10 Philippe Latu
-A FORWARD -m conntrack --ctstate INVALID -j DROP
178 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/min -j LOG --log-prefix "FORWARD/TCP.rejected: "
179 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/sec -j REJECT --reject-with tcp-reset
180 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/min -j LOG --log-prefix "FORWARD/UDP.rejected: "
181 10 Philippe Latu
-A FORWARD -p udp -m limit --limit 5/sec -j REJECT --reject-with icmp-port-unreachable
182 10 Philippe Latu
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "FORWARD/poubelle: "
183 10 Philippe Latu
#
184 10 Philippe Latu
COMMIT</pre>
185 10 Philippe Latu
186 1 Laurent GUERBY
h2. Documentation
187 1 Laurent GUERBY
188 1 Laurent GUERBY
TODO
189 1 Laurent GUERBY
nginx
190 1 Laurent GUERBY
apache
191 4 Laurent GUERBY
varnish
192 1 Laurent GUERBY
iptables
193 1 Laurent GUERBY
shorewall
194 1 Laurent GUERBY
netcat
195 2 Laurent GUERBY
196 2 Laurent GUERBY
h2. Bénévoles
197 2 Laurent GUERBY
198 2 Laurent GUERBY
TODO toulibre ou capitole du libre