Je veux mettre en place sslh sur le port 443 pour transférer vers https et openvpn qui résident dans deux conteneurs docker. Comme je veux fournir des ACL basées sur l'IP sur https à long terme, je veux que sslh fournisse la véritable IP du client au serveur web (c'est-à-dire le mode "transparent" de sslh).
Si je comprends bien documentation y cette réponse Dans ce cas, sslh simulera des demandes extérieures sur le réseau interne et la réponse du serveur devra être renvoyée pour traduire le port de communication avec le client.
Mon problème est la configuration d'iptables. Il y a deux possibilités pour exécuter sslh : sur l'hôte ou dans un conteneur à l'intérieur du réseau Docker.
J'ai réussi à faire fonctionner la configuration "par défaut" telle que décrite dans la documentation, c'est-à-dire que sslh sur l'hôte pouvait transférer de manière transparente vers un service sur l'hôte.
Cependant, je ne parviens pas à faire fonctionner transparent sslh, que ce soit sur l'hôte ou dans un conteneur, avec les serveurs conteneurisés. Plus précisément, mes règles iptables pour marquer le trafic qui doit être acheminé vers sslh ne correspondent jamais à un paquet.
Par exemple, pour un serveur web https, je le ferais :
iptables -t mangle -A OUTPUT -p tcp --sport 443 --source 172.25.0.2 --jump SSLH
Utilisation de ce tableau J'ai essayé de discerner comment les périphériques ethernet virtuels du conteneur, le pont docker, le NAT docker et iptables fonctionnent ensemble mais je n'arrive pas à m'y retrouver.
Pour mieux discuter de cette question, supposons ce qui suit :
- hôte (eth0) : 1.1.1.1
- docker-bridge (br0) : 172.25.0.0/16
- serveur web (veth1) : 172.25.0.2:443 (exposé sur l'hôte comme 8443 si nécessaire)
- openvpn (veth2) : 172.25.0.3:1194 (transféré à l'hôte si nécessaire)
- sslh dans le conteneur (mutuellement exclusif avec host sslh) : 172.25.0.4:443 (transmis à l'hôte)
- sslh sur l'hôte (mutuellement exclusif avec le conteneur sslh) : port 443
- client : 8.8.8.8.8
Voici mon modèle défaillant de ce qui devrait se passer lorsqu'un navigateur se connecte à host:443 et que sslh est sur l'hôte en mode transparent.
- sslh se connecte à 172.25.0.2:8443 en se faisant passer pour le client original 8.8.8.8
- le serveur web répond pour le handshake TCP à 8.8.8.8 via veth1
- le paquet va sur br0
- le routage décide de l'envoyer via ent0
- la chaîne de sortie mangle d'iptables le marque comme trafic pour sslh (c'est ce qui ne fonctionne pas pour moi)
- la marque indique qu'il faut acheminer le paquet vers le périphérique local lo à la place.
- sslh le récupère, traduit le port et le renvoie au client.
Mon problème dans la liste ci-dessus est que je ne connais pas les critères de filtrage pour le trafic sortant des serveurs web : Dois-je utiliser le port interne de docker 443 ou le port mappé 8443 ? L'IP du docker 172.25.0.2 ou une autre ? En résumé, la règle de sortie de mangle s'exécutera-t-elle avant ou après le NAT de docker ?
J'ai pensé que je pourrais mettre sslh dans le réseau docker pour éviter de penser au NAT mais je n'arrive toujours pas à faire correspondre les règles iptables.
Je ne sais pas comment procéder.