Vorwort
Ich habe inzwischen mehrere Server, die ich Verwalte und welche über TINC ein Layer 2 Netzwerk haben, das für meine LXC Container genutzt wird. Dadurch konnte ich Nginx auf den Server diverse LXC-Container auf unterschiedlichen Servern als Ziel angeben. Nun möchte ich aber auch Nginx in einem LXC-Container umziehen und die Server via Iptables nur noch Port 80 und 443 an diesen leiten lassen. Das hat sich durch das Default Routing Verhalten des LXC-Containers als schwerer erwiesen als gedacht.
Szenario
Server A
- Externe IP: 999.888.777.666
- LXC-Net IP: 10.10.13.3
Server B
- Externe IP: 555.444.333.222
- LXC-Net IP: 10.10.14.4
LXC-Container Nginx
- LXC-Net IPs: 10.10.10.11, 10.10.13.11, 10.10.14.11
Aufbau
Server A und B leiten alle anfragen an ihre externe IP auf Port 80 und 443 mit folgender Iptables Regel weiter:
[pastacode lang=“bash“ manual=“%23Server%20A%0Aiptables%20-I%20PREROUTING%20-d%20999.888.777.666%20-p%20tcp%20-m%20tcp%20–dport%2080%20-j%20DNAT%20–to-destination%2010.10.13.142%3A80%0A%0A%23Server%20B%0Aiptables%20-I%20PREROUTING%20-d%20555.444.333.222%20-p%20tcp%20-m%20tcp%20–dport%2080%20-j%20DNAT%20–to-destination%2010.10.14.142%3A80%0A“ message=““ highlight=““ provider=“manual“/]
Wichtig ist zu beachten, das beide ein anderes Subnetz dafür nutzten. Das wird später nötig, da wir so die Routing Regeln im LXC-Container definieren.
Ausgehend müsst ihr natürlich das MASQUERADE aktivieren.
Im LXC-Container ist wichtig, das wir eine Systemd Version von 235 oder höher brauchen, da sonst die [RoutingPolicyRule] Sektion noch nicht zur Verfügung steht.
Die Netzwerk Konfiguration für Networkd sieht nun so aus:
[pastacode lang=“bash“ manual=“%5BMatch%5D%0AName%3Dlxc-net%0A%0A%5BNetwork%5D%0AAddress%3D10.10.10.11%2F24%0AGateway%3D10.10.10.1%0AAddress%3D10.10.13.11%2F24%0AAddress%3D10.10.14.11%2F24%0A%0A%5BRoute%5D%0AGateway%3D10.10.13.3%0ATable%3D3%0A%0A%5BRoute%5D%0AGateway%3D10.10.14.4%0ATable%3D4%0A%0A%5BRoutingPolicyRule%5D%0AFrom%3D10.10.13.0%2F24%0ATable%3D3%0APriority%3D300%0A%0A%5BRoutingPolicyRule%5D%0AFrom%3D10.10.14.0%2F24%0ATable%3D4%0APriority%3D400%0A“ message=“/etc/systemd/network/lxc-net.network“ highlight=““ provider=“manual“/]
Dadurch werden die Packete, welche Nginx von Server A Empfängt, auch wieder über diesen Versendet und nicht ungewollt über die Default Gateway 10.10.10.1 gesendet.