Leiten Sie den DNS-Verkehr über die Tunnelschnittstelle um. Der gesamte andere Verkehr verwendet die Kernel-Routingtabelle.

Leiten Sie den DNS-Verkehr über die Tunnelschnittstelle um. Der gesamte andere Verkehr verwendet die Kernel-Routingtabelle.

Wie leite ich nur den DNS-Verkehr um, um bei Aktivität eine Tunnelschnittstelle zu verwenden?

Für alle anderen Arten von Datenverkehr sollte stattdessen die Routing-Tabelle des Kernels verwendet werden. Wenn die Tunnelschnittstelle nicht aktiv ist, sollte DNS-Datenverkehr stattdessen die Routing-Tabelle des Kernels verwenden. Ist dies mit iptables möglich?

Hinweis: Ich verwende Strongswan 5.9.1. Wenn es also eine Möglichkeit gibt, diese Funktion von Strongswan aus zu konfigurieren, würde ich das gerne tun. Allerdings verwende ich das System als routenbasierte Richtlinie. Außerdem markiere ich derzeit Pakete mit Strongswan, bin mir aber nicht sicher, ob das damit zusammenhängt.

Schnittstellen:

# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
ens3             UP             192.168.0.15/24 fe80::e74:fcff:fe28:cb00/64
ens4             UP             2.2.1.2/30 fe80::e74:fcff:fe28:cb01/64
virbr0           DOWN           192.168.122.1/24
virbr0-nic       DOWN
ip_vti0@NONE     DOWN
vti01@NONE       UNKNOWN        172.21.0.3/32 fe80::200:5efe:202:102/64

Routen:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 ens3
2.2.0.1         0.0.0.0         255.255.255.255 UH    101    0        0 ens4
2.2.1.0         0.0.0.0         255.255.255.252 U     101    0        0 ens4
3.3.0.0         2.2.0.1         255.255.255.252 UG    101    0        0 ens4
3.3.1.0         2.2.1.1         255.255.255.252 UG    101    0        0 ens4
10.212.134.0    192.168.0.1     255.255.255.0   UG    100    0        0 ens3
172.21.0.0      0.0.0.0         255.255.255.248 U     0      0        0 vti01
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 ens3
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

Ich habe versucht, die folgende Regel anzuwenden:

# iptables -t mangle -A OUTPUT -p udp --dport 53 --out-interface vti01

Ich kann die Regel sehen, aber wenn ich sie beobachte, gelangen keine Pakete in die Regel, wenn ich eine Dig-Anfrage auf demselben Host mache.

# watch -n1 iptables -t mangle -nvL

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0            udp  --  *      vti01   0.0.0.0/0            0.0.0.0/0            udp dpt:53

Was vermisse ich?

Antwort1

Dank geht an @AB. Die von mir verwendeten Befehle waren die folgenden (Beachten Sie, dass ich die Tabellen-ID auf den gleichen Wert gesetzt habe wie die DNS-Protokollnummer [53]):

ip route add table 53 0.0.0.0/0 dev vti01
ip rule add iif lo ipproto udp dport 53 lookup 53
sysctl -w net.ipv4.conf.vti01.rp_filter=2

Um den Status zu überprüfen, habe ich Folgendes ausgeführt:

ip route list table 53
ip rule list | grep 53

Ich konnte dies in meinem benutzerdefinierten _updown-Skript implementieren, sodass Strongswan diese Einträge jedes Mal erstellt und entfernt, wenn der Tunnel hoch- oder herunterfährt, und es funktioniert

#!/bin/bash

set -o nounset
set -o errexit

VTI_IF="vti01"
PORT="53"
TABLE="53"

case "${PLUTO_VERB}" in
    up-client)
        ip tunnel add $VTI_IF local 2.2.1.2 remote 3.3.0.2 mode vti key 41
        ip link set $VTI_IF up
        ip addr add  172.21.0.3 dev $VTI_IF
        ip route add 172.21.0.0/29 dev $VTI_IF
        ip route add table $TABLE 0.0.0.0/0 dev $VTI_IF
        ip rule add iif lo ipproto udp dport $PORT lookup $TABLE
        sysctl -w "net.ipv4.conf.$VTI_IF.rp_filter=2"
        sysctl -w "net.ipv4.conf.$VTI_IF.disable_policy=1"
        sysctl -w "net.ipv4.conf.$VTI_IF.rp_filter=0"
        sysctl -w "net.ipv4.conf.$VTI_IF.forwarding=1"
        ;;
    down-client)
        ip rule del iif lo ipproto udp dport $PORT lookup $TABLE
        ip route del table $TABLE 0.0.0.0/0 dev $VTI_IF
        ip tunnel del $VTI_IF
        ;;
esac

Dann rufe ich mein Skript in meiner swanctl.conf-Datei auf. So sieht eine Verbindung aus. Der Abschnitt unter dem untergeordneten Element „updown=“ gibt an, wie das Skript aufgerufen wird.

connections {
    remote-sa {
        version = 2 
        local {
            id = 2.2.1.2
        }   
        local_addrs = 2.2.1.2
        remote_addrs = 3.3.0.2
        proposals = aes256-sha256-ecp384
        local {
            auth = psk 
        }   
        remote {
            auth = psk 
        }   
        children {
            remote-sa-child {
                local_ts = 172.21.0.0/29
                remote_ts = 0.0.0.0/0
                mark_in = 41
                mark_out = 41
                esp_proposals = aes256-sha256-ecp384
                updown = /opt/_updown_vti01 iptables
                start_action = start
                close_action = start
            }
        }
    }   
}

verwandte Informationen