Projet

Général

Profil

VirtualisationService » Historique » Version 11

Raphaël Durand, 25/09/2013 13:33

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