GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verbinden Sie sich mit dem VPN-Server eines Drittanbieters, verwenden Sie ihn aber nicht als Standardroute?

Hier ist eine vollständige Lösung mit Kontrollgruppen (cgroups), die eine Ressourcenkontrolle pro Prozess ermöglicht. Eine Netzwerkkontrollgruppe ermöglicht das Isolieren der VPN-Route, ermöglicht problemlos die selektive Ausführung aller Prozesse und ihrer untergeordneten Elemente darin, ermöglicht Nicht-Root-Benutzern den Zugriff auf laufende Prozesse innerhalb der cgroup und die Verwendung einer zweiten Instanz von dnsmasq kann DNS isolieren auch Anfragen. Dies setzt voraus, dass Sie openvpn, dnsmasq, cgroup und Version 1.6+ von iptables mit installierter cgroup-Unterstützung haben. Dies wurde alles auf Debian Jessie gemacht

Der erste Schritt besteht darin, die cgroup zu erstellen und die iptables entsprechend einzurichten. Dies sollte bei jedem Neustart erfolgen, daher platziere ich Folgendes in /etc/rc.local

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# create cgroup for 3rd party VPN (can change 'vpn' to your name of choice)
mkdir -p /sys/fs/cgroup/net_cls/vpn

# give it an arbitrary id 
echo 11 > /sys/fs/cgroup/net_cls/vpn/net_cls.classid

# grant a non-root user access (change user:group accordingly)
cgcreate -t user:group -a user:group -g net_cls:vpn

# mangle packets in cgroup with a mark
iptables -t mangle -A OUTPUT -m cgroup --cgroup 11 -j MARK --set-mark 11

# NAT packets in cgroup through VPN tun interface
iptables -t nat -A POSTROUTING -m cgroup --cgroup 11 -o tun0 -j MASQUERADE

# redirect DNS queries to port of second instance, more on this later
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p tcp --dport 53 -j REDIRECT --to-ports 5354
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p udp --dport 53 -j REDIRECT --to-ports 5354

# create separate routing table
ip rule add fwmark 11 table vpn

# add fallback route that blocks traffic, should the VPN go down
ip route add blackhole default metric 2 table vpn

# disable reverse path filtering for all interfaces
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

Der nächste Schritt besteht darin, die Client-Konfigurationsdatei Ihres Drittanbieter-VPN zu bearbeiten, z. /etc/openvpn/client.conf . Lassen Sie den Rest Ihrer Konfiguration unverändert.

# redirect-gateway def1  <--- comment or remove the redirect-gateway line if it exists

# disable automatically configuring routes and run our own routeup.sh script instead
route-noexec
route-up /etc/openvpn/routeup.sh

# run our own update-dnsmasq-conf script on interface up/down; comment out existing up/down lines
up /etc/openvpn/update-dnsmasq-conf
down /etc/openvpn/update-dnsmasq-conf

Wir müssen jetzt die /etc/openvpn/routeup.sh erstellen Skript

#!/bin/bash
# add default route through vpn gateway to our separate routing table
/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn
exit 0

Und wir müssen jetzt eine modifizierte Version von update-resolv-conf erstellen, die normalerweise in /etc/openvpn installiert wird, um die zweite Instanz von dnsmasq zu erstellen. Ich nenne es /etc/openvpn/update-dnsmasq-conf

#!/bin/bash

[ "$script_type" ] || exit 0

split_into_parts()
{
    part1="$1"
    part2="$2"
    part3="$3"
}

case "$script_type" in
  up)
    NMSRVRS=""
    for optionvarname in ${!foreign_option_*} ; do
        option="${!optionvarname}"
        split_into_parts $option
        if [ "$part1" = "dhcp-option" ] ; then
            if [ "$part2" = "DNS" ] ; then
                NMSRVRS="${NMSRVRS:+$NMSRVRS }--server $part3"
            fi
        fi
    done
    dnsmasq $NMSRVRS --no-hosts --no-resolv --listen-address=127.0.0.1 \
        --port=5354 --bind-interfaces --no-dhcp-interface=* \
        --pid-file=/var/run/dnsmasq/dnsmasq2.pid
    ;;
  down)
    kill -9 $(cat /var/run/dnsmasq/dnsmasq2.pid)
    ;;
esac

Und das sollte es sein. Jetzt können Sie Ihre VPN-Verbindung starten und selektiv Prozesse über diese Schnittstelle ausführen (die Option --sticky stellt sicher, dass untergeordnete Prozesse in derselben Kontrollgruppe ausgeführt werden).

cgexec -g net_cls:vpn --sticky chromium &

HINWEIS:Stellen Sie für dnsmasq sicher, dass /etc/resolv.conf auf den lokalen Host (Nameserver 127.0.0.1) verweist. Ihre Haupt-dnsmasq-Instanz verarbeitet Abfragen auf Ihrer normalen Nicht-VPN-Route und verwendet (/var/run/dnsmasq/resolv.conf), die normalerweise aus Ihrem Standard-Gateway oder einem öffentlichen DNS (z. B. 8.8.8.8 von Google) besteht. Die zweite Instanz wird nur von der isolierten Kontrollgruppe verwendet


Linux
  1. Debian – Verbindung zum Internet auf einem mit VPN verbundenen Server ohne Internet?

  2. Wie verbinde ich mich mit dem Hosting-Server?

  3. So verwenden Sie OpenSSH, um eine Verbindung zu Ihrem Linux-Server herzustellen

  4. So legen Sie das Standard-Gateway unter Ubuntu fest

  5. Tarieren Sie ein Verzeichnis, aber speichern Sie keine vollständigen absoluten Pfade im Archiv

RHEL7 FTP-Serverfehler:ftp:connect:No route to host solution

Was ist ein SSH-Befehl und wie wird SSH verwendet, um eine Verbindung zum Remote-Server herzustellen?

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server herzustellen

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server unter Linux oder Windows herzustellen

OpenConnect kann keine Verbindung zum VPN-Server herstellen:Wait.html wird für immer aktualisiert

So stellen Sie das Standard-Gateway ein