Projet

Général

Profil

VirtualisationService » Historique » Version 14

yannick deroche, 25/09/2013 15:57

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 12 yannick deroche
              + il en existe pas mal: Apache avec module RP, NGINX avec module RP, F5 BigIP VE (version limité à 90j) ...
43 12 yannick deroche
44 12 yannick deroche
--> mon conseil: un pfSense en machine virtuelle qui porte l'@IP publique (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 1 Laurent GUERBY
TODO
49 1 Laurent GUERBY
50 5 Raphaël Durand
h2. Configuration d'un reverse proxy nginx
51 5 Raphaël Durand
52 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.
53 5 Raphaël Durand
Le systeme fonctionne par Virtual Host (comme sous Apache)
54 5 Raphaël Durand
55 5 Raphaël Durand
Pour chaque Virtual Host, il faut créer un fichier de ce type dans /etc/nginx/sites-enabled
56 5 Raphaël Durand
57 5 Raphaël Durand
<pre>
58 5 Raphaël Durand
server {
59 5 Raphaël Durand
        listen   80;
60 7 Raphaël Durand
        server_name  *.exemple.tld;
61 5 Raphaël Durand
        location / {
62 5 Raphaël Durand
                proxy_pass         http://10.255.254.1;
63 5 Raphaël Durand
    }
64 5 Raphaël Durand
}
65 5 Raphaël Durand
server {
66 5 Raphaël Durand
        listen 443;
67 7 Raphaël Durand
        server_name  *.exemple.tld;
68 5 Raphaël Durand
        ssl                     on;
69 5 Raphaël Durand
        ssl_certificate     certificat_ssl.crt;
70 5 Raphaël Durand
        ssl_certificate_key certificat_ssl.crt;
71 5 Raphaël Durand
        location / {
72 5 Raphaël Durand
                proxy_pass         https://10.255.254.1;
73 5 Raphaël Durand
    }
74 5 Raphaël Durand
}
75 5 Raphaël Durand
</pre>
76 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.
77 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.
78 5 Raphaël Durand
79 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.
80 5 Raphaël Durand
81 10 Philippe Latu
h2. Redirection de port(s) via iptables.
82 10 Philippe Latu
83 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.
84 10 Philippe Latu
85 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.
86 10 Philippe Latu
87 10 Philippe Latu
h3. 1/ Régles à copier dans la section de la table NAT
88 10 Philippe Latu
89 10 Philippe Latu
<pre>for ((i = 1; i <= 100; i++)); do  
90 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";
91 10 Philippe Latu
done >> /etc/iptables/rules-to-add</pre>
92 10 Philippe Latu
93 10 Philippe Latu
h3. 2/ Régle à copier dans la section de la table netfilter
94 10 Philippe Latu
95 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>
96 10 Philippe Latu
97 10 Philippe Latu
h3. 3/ Fichier de règles «résumé» utilisable avec le paquet Debian iptables-persistent
98 10 Philippe Latu
99 10 Philippe Latu
<pre>#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
100 10 Philippe Latu
# NAT
101 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102 10 Philippe Latu
*nat
103 10 Philippe Latu
:PREROUTING ACCEPT [0:0]
104 10 Philippe Latu
:POSTROUTING ACCEPT [0:0]
105 10 Philippe Latu
:OUTPUT ACCEPT [0:0]
106 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107 10 Philippe Latu
#  P O S T R O U T I N G
108 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109 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
110 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]
111 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
112 10 Philippe Latu
#  P R E R O U T I N G
113 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
114 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
115 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
116 10 Philippe Latu
<snip/>
117 10 Philippe Latu
#
118 10 Philippe Latu
COMMIT
119 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120 10 Philippe Latu
#  N e t f i l t e r
121 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122 10 Philippe Latu
*filter
123 10 Philippe Latu
:INPUT DROP [0:0]
124 10 Philippe Latu
:FORWARD DROP [0:0]
125 10 Philippe Latu
:OUTPUT ACCEPT [0:0]
126 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127 10 Philippe Latu
#  I N P U T
128 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129 10 Philippe Latu
# Suivi de communication chaîne INPUT
130 10 Philippe Latu
-A INPUT -p icmp -m conntrack --ctstate ESTABLISHED -j ACCEPT
131 10 Philippe Latu
-A INPUT -p icmp --icmp-type destination-unreachable -m conntrack --ctstate RELATED -j ACCEPT
132 10 Philippe Latu
-A INPUT -p icmp --icmp-type time-exceeded -m conntrack --ctstate RELATED -j ACCEPT
133 10 Philippe Latu
-A INPUT -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
134 10 Philippe Latu
-A INPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT
135 10 Philippe Latu
-A INPUT -p tcp --syn -m conntrack --ctstate RELATED -j ACCEPT
136 10 Philippe Latu
# Boucle locale
137 10 Philippe Latu
-A INPUT -i lo -j ACCEPT
138 10 Philippe Latu
# ICMP
139 10 Philippe Latu
-A INPUT -i bond+ -p icmp --icmp-type echo-request -m limit --limit 5/sec -m conntrack --ctstate NEW -j ACCEPT
140 10 Philippe Latu
# SSH
141 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 "
142 10 Philippe Latu
-A INPUT -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
143 10 Philippe Latu
-A INPUT -i [Nom-interface-réseau-public] -p tcp --dport 22 --syn -m recent --set --name SSH -j ACCEPT
144 10 Philippe Latu
# POUBELLE
145 10 Philippe Latu
-A INPUT -m conntrack --ctstate INVALID -m limit --limit 1/min -j LOG --log-prefix "INPUT/rejected.iptables: "
146 10 Philippe Latu
-A INPUT -m conntrack --ctstate INVALID -j DROP
147 10 Philippe Latu
-A INPUT -p tcp -j REJECT --reject-with tcp-reset -m limit --limit 5/s
148 10 Philippe Latu
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -m limit --limit 5/s
149 10 Philippe Latu
-A INPUT -m limit --limit 1/min -j LOG --log-prefix "INPUT/poubelle: "
150 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
151 10 Philippe Latu
#  F O R W A R D
152 10 Philippe Latu
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
153 10 Philippe Latu
# Suivi de communication chaîne FORWARD
154 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate ESTABLISHED -j ACCEPT
155 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate RELATED --icmp-type destination-unreachable -j ACCEPT
156 10 Philippe Latu
-A FORWARD -p icmp -m conntrack --ctstate RELATED --icmp-type time-exceeded -j ACCEPT
157 10 Philippe Latu
-A FORWARD -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
158 10 Philippe Latu
-A FORWARD -p tcp -m conntrack --ctstate ESTABLISHED ! --syn -j ACCEPT
159 10 Philippe Latu
-A FORWARD -p tcp -m conntrack --ctstate RELATED --syn -j ACCEPT
160 10 Philippe Latu
# Boucle locale
161 10 Philippe Latu
-A FORWARD -i lo -j ACCEPT
162 10 Philippe Latu
# Accès SSH VMs
163 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
164 10 Philippe Latu
# Poubelle
165 10 Philippe Latu
-A FORWARD -m conntrack --ctstate INVALID -m limit --limit 5/min -j LOG --log-prefix "FORWARD/rejected: "
166 10 Philippe Latu
-A FORWARD -m conntrack --ctstate INVALID -j DROP
167 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/min -j LOG --log-prefix "FORWARD/TCP.rejected: "
168 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/sec -j REJECT --reject-with tcp-reset
169 10 Philippe Latu
-A FORWARD -p tcp -m limit --limit 5/min -j LOG --log-prefix "FORWARD/UDP.rejected: "
170 10 Philippe Latu
-A FORWARD -p udp -m limit --limit 5/sec -j REJECT --reject-with icmp-port-unreachable
171 10 Philippe Latu
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "FORWARD/poubelle: "
172 10 Philippe Latu
#
173 10 Philippe Latu
COMMIT</pre>
174 10 Philippe Latu
175 1 Laurent GUERBY
h2. Documentation
176 1 Laurent GUERBY
177 1 Laurent GUERBY
TODO
178 1 Laurent GUERBY
nginx
179 1 Laurent GUERBY
apache
180 4 Laurent GUERBY
varnish
181 1 Laurent GUERBY
iptables
182 1 Laurent GUERBY
shorewall
183 1 Laurent GUERBY
netcat
184 2 Laurent GUERBY
185 2 Laurent GUERBY
h2. Bénévoles
186 2 Laurent GUERBY
187 2 Laurent GUERBY
TODO toulibre ou capitole du libre