In manchen Situationen kann es sein, dass ein System mehrere gleichartige Adressen hat, und diese auch ausgehend benutzen soll. Hat man zu wenige Kriterien an denen man Routing und NAT direkt festmachen kann (beispielsweise Ziel-Adresse, Ziel-Port, …) kann man auch auf statistische Kriterien zurückgreifen.
Was bedeutet das konkret? In diesem Beispiel soll ein Lasttest einer Webapplikation mit siege durchgeführt werden. Unser Test-Server soll über mehrere Durchläufe Zugriffe hunderter Nutzer simulieren, während das Verhalten der Applikation beobachtet wird. Dazu ist es nötig, dass das Testsystem nicht nur mit einer IP am Loadbalancer ankommt, sondern mit vielen verschiedenen.
Dazu ist es erst einmal nötig diese IPs zu konfigurieren. In meinem Fall sind es private IPs, die an Alias-Interfaces gebunden werden:
ifconfig eth1:0 192.168.1.130 up
ifconfig eth1:1 192.168.1.131 up
ifconfig eth1:2 192.168.1.132 up
Durch die Verwendung von ifconfig wird auch direkt mit dem ersten Alias-Interface eine Route gesetzt. Ausgehende Verbindungen werden per default mit der ersten auf dem konfigurierten IP initiiert, also mit der 192.168.1.130. Bei manchen Diensten, wie beispielsweise Squid, kann man anhand bestimmter Kriterien definieren, welche Quell-IP genommen wird. siege bietet soetwas leider nicht. In so einem Fall muss der Kernel herhalten, genauer die Kernel-eigene Firewall, welche mit dem Tool iptables administriert werden kann.
iptables bietet das Modul „Statistik“, welches vom eigentlichen Netzwerkpaket unabhängige Kriterien zum Weiterverarbeiten bereitstellt. In unserem Fall wollen wir zufällig eine von den 3 uns zur Verfügung stehenden IP-Adressen auswählen. Dazu nutzen wir Source-NAT. Außerdem sollen diese Regeln nur greifen, wenn ein bestimmter Host adressiert wird (der Loadbalancer der Applikation). Dieser hat im Beispiel die IP 192.168.1.129. Man kann diese Einschränkung natürlich auch weglassen.
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.129 -m statistic --mode random --probability 0.33 -j SNAT --to-source 192.168.1.130
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.129 -m statistic --mode random --probability 0.50 -j SNAT --to-source 192.168.1.131
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.129 -j SNAT --to-source 192.168.1.132
Da die iptables-Regeln der Reihe nach abgearbeitet werden, ist die Wahrscheinlichkeit in jedem Schritt anders. Die erste Regel wird in 33% der Fälle angewandt, die zweite Regel in 50% der Fälle und die dritte Regel in 100% (daher schenken wir uns die Optionen).
Damit sind wir fertig. Baut man nun eine Verbindung zu dem Host auf, wird zufällig eine der drei IPs genutzt.