Ich habe ein kleines Problem damit, eine ordnungsgemäße Konfiguration von iptables unter Ubuntu zu erhalten. Aber vorher möchte ich die Netzwerkkonfiguration beschreiben:
Ich verwende eine xDSL-Leitung mit Modem+Router+DHCP, die das Subnetz 192.168.1.0/24 bedient. Mein Laptop und mein PC sind mit diesem Netzwerk verbunden und erhalten die Adressen 192.168.1.6 bzw. 192.168.1.3. Auf dem PC läuft Ubuntu mit VBox und 2 virtuellen Maschinen (beide ebenfalls Ubuntu). Der vboxnet0-Schnittstelle auf dem PC wird die IP 10.10.10.1 zugewiesen und einzelnen virtuellen Maschinen werden die IP-Adressen 10.10.10.10 und 10.10.10.11 zugewiesen. Auf VM1 läuft zu Testzwecken ein Apache-Webserver.
Jetzt kann ich von meinem PC (192.168.1.3) auf die von VM1 Apache gehostete Website unter 10.10.10.10 zugreifen, indem ich die Adresse in den Browser eingebe. Da gibt es keine Probleme.
Ich möchte jedoch von meinem Laptop (192.168.1.6) aus auf dieselbe Website zugreifen können, indem ich dieselbe 10.10.10.10 in die Adressleiste des Browsers eingebe. Dies funktioniert jedoch nicht. Aus irgendeinem Grund komme ich nicht durch das Netzwerk. Es scheint, dass die IP-Adresse im Netzwerk 192.168.1.x einfach unbekannt ist. Wenn es eine Möglichkeit gibt, dies auf einfache Weise über iptables zu konfigurieren, wäre dies ein guter Anfang.
Wenn dieser Schritt nun möglich ist, möchte ich außerdem ein komplexeres Setup konfigurieren können. Mit der Adresse 192.168.1.3 und der richtigen Portadresse möchte ich in der Lage sein, bestimmte Serviceanfragen an die richtige VM-Instanz weiterzuleiten. Beispielsweise sollte 192.168.1.3:80 an VM1 gehen und die von Apache gehostete Website abrufen. 192.168.1.3:4000 (beispielsweise) sollte an VM2 gehen und den dort gehosteten SFTP-Dienst abrufen. Kurz gesagt, ich möchte auf dem PC ein zielportspezifisches Routing durchführen, um eine bidirektionale Kommunikation zwischen Computern zu ermöglichen, die an 192.168.1.x-Netzwerke angeschlossen sind, und VMs, die im 10.10.10.x-Netzwerk ausgeführt werden. Gibt es hierfür eine einfache Lösung mit iptables?
hier ist ein Beispiel, das ich mir inzwischen ausgedacht habe, aber bei dem ich die Weiterleitung nicht richtig zum Laufen gebracht habe. Ich bin sicher, dass hier jede Menge Fehler sind – es ist mein erster Tag mit iptables.
clear
# cleaning Firewall Rules , change ACCEPT to DROP if you want to shield
# the server, then you open ports as you need
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Accepts all established inbound connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# opening INPUT ports (22,80,8080)
iptables -A INPUT --protocol tcp --dport 22 -j ACCEPT && echo "rule input 22 ok"
iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT && echo "rule input 80 ok"
iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT && echo "rule input 443 ok"
iptables -A INPUT --protocol tcp --dport 8080 -j ACCEPT && echo "rule input 8080 ok"
#allow Loopback and networks
iptables -A INPUT -i lo -j ACCEPT && echo "rule 7 ok"
#Accept any input from 10.10.10.0 network in vboxnet0 interface
iptables -A INPUT -s 10.10.10.0/24 -i vboxnet0 -j ACCEPT && echo "rule 8 ok"
#enable Port forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Opening PREROUTING - Filtering : this make the port forwarding trick.
# Forward as many ports you want to certain machines of the network to provide services such web server, ftp server, etc...
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 192.168.1.0/24 --dport 8080 -j DNAT --to 10.10.10.10:80 && echo "rule 9 ok"
#iptables -t nat -A PREROUTING -p tcp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53 && echo "rule 10 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53 && echo "rule 11 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 21 -j DNAT --to 10.10.10.16:21 && echo "rule 12 ok"
#Opening FORWARD ports for network services on vlan
iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 80 -j ACCEPT && echo "rule 13 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 21 -j ACCEPT && echo "rule 14 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 68 -j ACCEPT && echo "rule 15 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 22 -j ACCEPT && echo "rule 16 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 53 -j ACCEPT && echo "Rule 17 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p udp --dport 53 -j ACCEPT && echo "Rule 18 ok"
# Opening POSTROUTING PROCESSES
# Netmasking is absolutelly necesary to protect vlan from attacks, only it hides their ip....
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE && echo "rule 19 ok"
# Reject all other inbound - default deny unless explicitly allowed policy
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
# test and display the rules if runs properly
iptables -L
Vielen Dank für jede Hilfe
Marek
Antwort1
Zunächst sollten Sie die einfachere Einrichtung der Bridged Networking-Funktion in VirtualBox in Betracht ziehen. Dadurch werden die VMs im Wesentlichen direkt in das LAN eingebunden, sodass sie die Adressen 192.168.1.0/24 erhalten und direkt von anderen Computern im LAN aus darauf zugegriffen werden kann.
Ihre DNAT-Regel sieht korrekt aus, aber ich vermute, dass sie in der FORWARD-Kette blockiert wird. NAT-Pakete müssen immer noch die FORWARD-Kette durchlaufen und müssen daher dort akzeptiert werden, und zwar etwa so:
iptables --append FORWARD --in-interface eth1 --out-interface vboxnet0 --destination 10.10.10.10 --protocol tcp --dport 80 --jump ACCEPT
Ich würde jedoch vorschlagen, dass Sie die FORWARD-Kette standardmäßig auf ACCEPT konfigurieren, während Sie die NAT-Regeln zum Funktionieren bringen. Sobald das NAT funktioniert, beginnen Sie mit der Einschränkung der FORWARD-Kette.