アクティブなときにトンネル インターフェイスを使用するために DNS トラフィックのみをリダイレクトするにはどうすればよいですか?
他のタイプのトラフィックは、代わりにカーネルのルーティング テーブルを使用する必要があります。トンネル インターフェイスがアクティブでない場合は、DNS トラフィックは代わりにカーネルのルーティング テーブルを使用します。これは iptables で可能ですか?
注: 私は Strongswan 5.9.1 を使用しているので、Strongswan からこの機能を構成する方法があれば、それを実行したいと思います。ただし、私はシステムをルート ベースのポリシーとして使用しています。また、現在、パケットを strongswan でマークしていますが、それが関連しているかどうかはわかりません。
インターフェース:
# 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
ルート:
# 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
次のルールを試してみました:
# iptables -t mangle -A OUTPUT -p udp --dport 53 --out-interface vti01
ルールは表示されますが、監視すると、同じホストで dig 要求を実行しても、ルールにパケットが送信されません。
# 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
何が足りないのでしょうか?
答え1
@ABに感謝します。私が使用したコマンドは次のとおりです(テーブルのIDをDNSプロトコル番号[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
ステータスを確認するために以下を実行しました:
ip route list table 53
ip rule list | grep 53
これをカスタム_updownスクリプトに実装して、トンネルがアップまたはダウンするたびにStrongswanがこれらのエントリを構築および削除するようにしました。
#!/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
次に、swanctl.conf ファイルでスクリプトを呼び出します。接続は次のようになります。子の「updown=」の下のセクションは、スクリプトを呼び出す方法です。
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
}
}
}
}