OpenVPN selektiv #2

Es war wahrlich eine schwere Geburt, aber hier sind sie, die iptables Regeln, hinzuzufügen zum openvpn-up Skript.


# Flush iptables-rules
iptables -F; iptables -t nat -F; iptables -t mangle -F;

vpn_user="SetUserNameHere"

# Mark these packets so that iproute can route it through tunnel
iptables -A OUTPUT -t mangle -o eth0 -m owner --uid-owner "$vpn_user" -j MARK --set-mark 1
# Fix DNS not working -- nslookup does not show 8.8.8.8 as response - don't know why
iptables -A OUTPUT -t nat -m owner --uid-owner "$vpn_user" -p udp --dport 53 -m mark --mark 1 -j DNAT --to-destination 8.8.8.8
# Now rewrite the source-address of packets
iptables -A POSTROUTING -t nat -o "$dev" -j SNAT --to "$ifconfig_local"
# Killswitch. Drop any packets which do not go over the openvpn connection
iptables -A POSTROUTING -t mangle -m owner --uid-owner "$vpn_user" ! -o "$dev" -j DROP
ip6tables -A POSTROUTING -t mangle -m owner --uid-owner "$vpn_user" ! -o "$dev" -j DROP
# Connections marked with mark 1 traverse table tunnel, which was previously created by openvpn
ip rule add fwmark 1 table tunnel

vpn_user entsprechend anpassen.

Im 1. Teil haben wir bereits die Grundlagen hinter uns gebracht, nänmlich auf einem Server eine OpenVPN Client Verbindung aufzubauen, ohne das default Gateway zu ändern.
Die iptables funktionieren wie folgt:

  • Alle Pakete, die der User $vpn_user erzeugt und den Server auf regulärem Weg verlassen wollen, das heißt nicht über den VPN, werden mit 0x1 markiert.
  • Das nächste ist ein Fix, damit die DNS Namensauflösung funktioniert.
  • In der Kette Postrouting, Tabelle nat, wird die Quell-IP-Adresse aller Pakete, die den VPN Tunnel verlassen, auf dessen lokale IP-Adresse gesetzt.
  • Zu guter Letzt wird sämtlicher Traffic des $vpn_user, der ein anderes Interface als den gesicherten OpenVPN-Tunnel nehmen möchte, verworfen.
  • Abschließend wird die Markierung 0x1 zur vorher erstellten Routingtabelle tunnel hinzugefügt, was zur Folge hat, dass jedes Paket, welches mit 0x1 markiert wurde, diese Tabelle durchquert. In diesem Fall steht im tunnel die lokale Gateway-IP des OpenVPN-Tunnelinterfaces tun0


Ressourcen:
Iptables Doku - Mark
Iptables Doku - Owner
Iptables Doku - SNAT
Making all network traffic for a Linux user use a specific network interface
Output traffic on different interfaces based on destination port