터널 인터페이스를 통해 DNS 트래픽을 리디렉션하고, 다른 모든 트래픽은 커널 라우팅 테이블을 사용하도록 리디렉션합니다.

터널 인터페이스를 통해 DNS 트래픽을 리디렉션하고, 다른 모든 트래픽은 커널 라우팅 테이블을 사용하도록 리디렉션합니다.

활성화된 경우 터널 인터페이스를 사용하도록 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

규칙을 볼 수 있지만 확인해 보면 동일한 호스트에서 발굴 요청을 수행할 때 어떤 패킷도 규칙에 들어가지 않습니다.

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

관련 정보