Ich habe eine CentOS 7-Box mit 2 Netzwerkkarten – eine für den Ethernet-Port und eine für den WLAN-Port. Ich möchte einen lxc-Container erstellen, der als Router fungiert und die folgenden Anforderungen erfüllt:
- Beim Ausführen von hostapd sollten alle Daten der mit dem Zugriffspunkt verbundenen Clients über diesen Container geleitet werden.
- Alle anderen installierten lxc-Container sollten auch alle Daten über diesen Routing-Container leiten.
- Wenn der Ethernet-Port mit dem Internet verbunden ist, sollten der Host und alle Container sowie alle mit dem Zugriffspunkt verbundenen Clients über Internetzugriff verfügen.
Um dies zu konfigurieren, habe ich Folgendes getan:
- Den Routing-LXC-Container erstellt
- Der Host verfügt über die Schnittstellen eth0 und wlan0. Ich habe auch br-eth0 und br-wlan0 erstellt, die Brücken sind, und ihnen jeweils diese beiden Schnittstellen hinzugefügt.
- br-eth0 ist als DHCP-Client konfiguriert, um über die eth0-Netzwerkkarte eine Verbindung zu meinem externen Router herzustellen
- br-wlan0 hat eine statische IP von 10.0.0.1, und dnsmasq hört auf dieser Schnittstelle und vergibt IP-Adressen im Subnetz 10.0.0.0/24
- Ich habe den lxc-Routing-Container so konfiguriert, dass zwei Schnittstellen erstellt werden, die mit diesen Bridges verbunden sind (leth0, leth1). leth0 ist ein DHCP-Client und leth1 hat eine statische IP-Adresse von 10.0.0.201.
- Ich habe eine weitere Bridge erstellt, br-router, die auch mit einer dritten Schnittstelle im Routing-Container verbunden wurde. Diese Bridge hat eine statische IP-Adresse von 192.168.3.254 im Host und die Schnittstelle im Routing-Container (leth2) hat eine statische IP-Adresse von 192.168.3.1
- Der Routing-Container führt auch dnsmasq aus, lauscht auf der leth2-Schnittstelle und stellt IP-Adressen im Subnetz 192.168.3/24 (.3 - .200) bereit, sodass allen anderen lxc-Containern, die diese Brücke einbinden, eine beliebige IP-Adresse in diesem Subnetz zugewiesen wird.
- Ich habe Masquerading auf leth0 im Routing-Container aktiviert.
- Ich habe das Standard-Gateway im Host auf 192.168.3.1 konfiguriert, sodass der gesamte Datenverkehr innerhalb des Hosts durch den Routing-Container geleitet wird.
Zu Testzwecken habe ich auch einen zweiten lxc-Container erstellt, der eine einzelne Schnittstelle enthält, die br-router in den Container bringt, und dieser Container hostet eine Webseite auf Port 8080. Diese einzelne Schnittstelle (teth0) erhält über DHCP eine IP-Adresse (in diesem Fall 192.168.3.9).
Mit diesem Setup kann ich das Internet erfolgreich vom Host, dem Routing-Container und dem Test-Container aus erreichen. Außerdem kann ich sowohl vom Routing-Container als auch vom Test-Container curlhttp://192.168.3.9:8080und die Webseite erfolgreich abrufen.
Anforderungen 2 und 3 sind also erfüllt. Wenn ich jedoch einen Client mit diesem System verbinde, erhalte ich zwar eine IP-Adresse im Subnetz 10.0.0.0/24 (über dnsmasq, das auf br-wlan0 ausgeführt wird), aber ich habe keine Internetverbindung (mir ist klar, dass ich ohne Routing-Änderungen oder so nicht hätte, deshalb bin ich hier). Ich habe auch versucht, mit Firewalld im Routing-Container auf leth1 eine Portweiterleitung von Port 80 auf 192.168.3.9:8080 durchzuführen, in der Hoffnung, dass ich die Webseite aus dem Testcontainer an einen verbundenen Client senden könnte, indem ichhttp://10.0.0.201– allerdings ohne Erfolg. (allerdings ermöglicht mir dieser Versuch der Portweiterleitung tatsächlich den Zugriff auf die Website über die Adresse 201 des Hosts.)
Ich bin sicher, dass es eine Kombination aus Routing-Änderungen, IP-Tabellenregeln und Portweiterleitungsregeln gibt, die dafür sorgen würden, dass alles reibungslos funktioniert, aber nach ein paar Tagen des Experimentierens kann ich es beim besten Willen nicht herausfinden. Ich bin noch ziemlich unerfahren, was das ganze Netzwerk angeht, also hoffe ich, dass mir jemand da draußen helfen kann. Hoffentlich konnte ich ein ausreichend gutes Bild der aktuellen Konfiguration zeichnen.
Danke!