Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
OpenVPN: Henne-Ei-Problem
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German)
View previous topic :: View next topic  
Author Message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3208
Location: de

PostPosted: Sun Aug 12, 2018 9:43 am    Post subject: OpenVPN: Henne-Ei-Problem Reply with quote

Guten Vormittag.

Ich hoffe mal, dass ich hier mehr Feedback bekomme als im "Networking & Security"-Subforum.

Konkret hab ich das da gebastelt:
https://forums.gentoo.org/viewtopic-t-1083512-highlight-.html

Oder die Kurzerklärung:
Auf meiner NAS hab ich einen Netnamespace angelegt. Eine Macvlan-Bridge ermöglicht den Netzzugang aus dem Netnamespace nach draußen. Im Namespace lass ich einen OpenVPN-Client laufen. Dadurch hab ich praktisch ein 2. Gateway für mein Netzwerk, was sämtlichen Traffic über einen VPN-Provider leitet. Also:

  • Client im Heimnetz (Gateway: 192.168.1.1) ----------> Fritzbox -------------> Internet (DSL-Provider)
  • Client im Heimnetz (Gateway: 192.168.1.111) ----------> Nas (Net-NS) -------------> OpenVPN-Client ---------> Internet (VPN-Provider)


Das klappt soweit auch wunderbar. Das Script dazu:
netns-vpn:
#!/bin/bash

declare NETNS
DEV_VLAN="vlan0"
NET_VLAN="192.168.1.111/24"
MAC_ETH0="11:22:33:44:55:66"

######## Functions ###########
startup()
{
    sysctl -w net.ipv4.ip_forward=1 || exit
    nft flush ruleset
    nft -f /etc/nftables/nat.nft
}

add_netspace()
{
    ip netns show | grep $NETNS > /dev/null 2>&1 && return
    echo "Netspace $NETNS nicht gefunden. Erstelle neuen Netspace."
    ip netns add $NETNS || exit
}

add_linkdevice()
{
    # Devicecheck im VPN-Netspace
    ip netns exec $NETNS ip -4 addr show dev $DEV_VLAN > /dev/null 2>&1 && return
    echo "Device $DEV_VLAN nicht im Netns $NETNS gefunden. Erstelle $DEV_VLAN."

    # Devicecheck oder Anlegen im Default-NS
    ip -4 addr show dev $DEV_VLAN > /dev/null 2>&1 || ip link add $DEV_VLAN link eth0 address $MAC_ETH0 type macvlan mode bridge || exit
       
    # Device in NS verschieben
    ip link set $DEV_VLAN netns $NETNS || exit
}

start_device()
{
    if [[ $(ip netns exec $NETNS ip link show dev lo) == *DOWN* ]]; then
        ip netns exec $NETNS ip link set lo up || exit
    fi

    if [[ $(ip netns exec $NETNS ip -br link show dev $DEV_VLAN) == *DOWN* ]]; then
        ip netns exec $NETNS ip link set $DEV_VLAN up || exit
    fi

    if [[ ! $(ip netns exec $NETNS ip -4 -br addr show dev $DEV_VLAN) == *$NET_VLAN* ]]; then
        ip netns exec $NETNS ip -4 addr add $NET_VLAN dev $DEV_VLAN || exit
    fi
}

set_route()
{
    if [[ ! $(ip netns exec $NETNS ip route show default) == "default via 192.168.1.1"* ]]; then
        ip netns exec $NETNS ip route add default via 192.168.1.1 dev $DEV_VLAN || exit
    fi
}

start_openvpn()
{
    ip netns exec $NETNS openvpn \
        --config /etc/openvpn/$NETNS.ovpn \
        --script-security 2 \
        --redirect-gateway \
        --down "/bin/ip route delete default via 192.168.1.1 dev $DEV_VLAN"
#        --route-up '/bin/ip route delete default via 192.168.109.1'

}

cleanup()
{
    ip netns delete $NETNS
    sysctl -w net.ipv4.ip_forward=0
    nft flush ruleset
}

######## main ###########
if [[ -z $1 ]]; then
    echo "Usage: $0 namespace"
    exit
fi
NETNS="$1"
trap cleanup EXIT SIGINT SIGTERM

startup
add_netspace
echo "Netnamespace $NETNS bereit."
add_linkdevice
echo "Device $DEV_VLAN im Netnamespace $NETNS bereit."
start_device
echo "Device $(ip netns exec $NETNS ip -4 -br addr show dev $DEV_VLAN)"
set_route
echo "Setze Route $(ip netns exec $NETNS ip route show default)"
start_openvpn


Funktionsweise:
  1. Forwarding aktivieren (wollte mal nftables verwenden. NAT-Config kann ich gern später posten.)
  2. Netnamespace erstellen
  3. vlan0 als Macvlan-Bridge gegen eth0 linken. Mac-Adresse an vlan0 zuweisen. vlan0 in den Netnamespace verschieben.
  4. Im Netnamespace: lo aktivieren, vlan0 mit IP versehen und aktivieren
  5. Defaultroute setzen über vlan0 an 192.168.1.1 (Fritzbox) und openvpn starten (das muss sich ja verbinden und wiederverbinden können).
  6. Wenn OpenVPN beendet wird, dann die Defaultroute löschen, um sicherzustellen, dass Traffic, der nur über VPN laufen soll, nicht über das Fritzbox-Gateway rauskommt.


Und an der Stelle hab ich ein grundlegendes Problem:
Zum Aufbauen der Verbindung benötigt OpenVPN logischerweise Zugang zum Internet. Genau in diesem Zeitfenster ist aus dem Netnamespace das normale Internet erreichbar. Entsprechend wird mir die IP meines ISP zurückgegeben. Leider bricht in meinem Test-VPN-Zugang die Verbindung häufiger ab. Und manchmal versucht dann das OpenVPN minutenlang, eine Verbindung aufzubauen.

Frage
Wie kann ich der OpenVPN-Anwendung einen exklusiven Zugang einräumen, dass nur die ins ungesicherte Internet (vlan0) kann und alle anderen Anwendung ausschließlich über das VPN (tun0) rausdürfen.
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3208
Location: de

PostPosted: Sun Aug 12, 2018 9:48 am    Post subject: Reply with quote

Hab grad Selecting Gateway on Application Level gefunden.

Das könnte ein Ansatz sein. D.h. Kein Default-Gateway einrichten sondern nur ein Gateway für eine bestimmte IP. Dem vlan0 eine zweite IP zuweisen und "irgendwie" OpenVPN an die 2. IP binden.

Edit: Gefunden.

Wie kann man jetzt sicherstellen, dass alle anderen Anwendungen nur die primäre IP verwenden?
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3208
Location: de

PostPosted: Mon Aug 13, 2018 7:34 pm    Post subject: Reply with quote

Irgendwie steck ich jetzt schon wieder in einer Sackgasse. Ich hab 'ne 2. IP auf vlan0 angelegt und dafür eine Route gebastelt.

ip a:
17: vlan0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 1a:07:a8:2c:04:77 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.111/24 scope global vlan0
       valid_lft forever preferred_lft forever
    inet 192.168.1.112/24 scope global secondary vlan0
       valid_lft forever preferred_lft forever


ip route show:
192.168.1.0/24 dev vlan0 proto kernel scope link src 192.168.1.111
192.168.1.112 via 192.168.1.1 dev vlan0


Ziel ist, dass nur Anwendungen, die die 192.168.1.112 als Source IP nutzen, ins Netz kommen. Klappt aber irgendwie nicht.

Code:
ping -I 192.168.1.112 192.168.1.1
PING 192.168.1.1 (192.168.1.1) from 192.168.1.112 : 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.784 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.451 ms

ping -I 192.168.1.112 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 192.168.1.112 : 56(84) bytes of data.
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable


Wo ist mein Denkfehler? Wieso klappt das Routing nicht?

Update:
Denkfehler gefunden: die erste Adresse ist die Zieladresse nicht, die Quelladresse.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum