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 |