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
}
}
}
}