선택한 앱에만 VPN 연결 사용

선택한 앱에만 VPN 연결 사용

나는 다음을 따르려고 노력하고 있습니다 :https://superuser.com/a/1262250/41337그러나 나는 그것을 작동시킬 수 없습니다.

나는 다음을 원한다:

interface=eth0

down() {
    ip netns delete myvpn
    ip link delete vpn0
    iptables -D INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
    iptables -t nat -D POSTROUTING -s 10.200.200.0/24 -o $interface -j MASQUERADE
}

up() {
    ip netns add myvpn
    ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
    ip netns exec myvpn ip link set lo up
    ip link add vpn0 type veth peer name vpn1
    ip link set vpn0 up
    ip link set vpn1 netns myvpn up
    ip addr add 10.200.200.1/24 dev vpn0
    ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
    ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
    iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
    iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o $interface -j MASQUERADE
    sysctl -q net.ipv4.ip_forward=1
    mkdir -p /etc/netns/myvpn
    echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
    ip netns exec myvpn ping 8.8.8.8
}

down
up

다른 터미널에서는 다음을 실행합니다.

$ sudo tcpdump -ni any host 8.8.8.8
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
22:49:44.817183 vpn0  In  IP 10.200.200.2 > 8.8.8.8: ICMP echo request, id 18314, seq 1, length 64
22:49:45.822772 vpn0  In  IP 10.200.200.2 > 8.8.8.8: ICMP echo request, id 18314, seq 2, length 64
22:49:46.842785 vpn0  In  IP 10.200.200.2 > 8.8.8.8: ICMP echo request, id 18314, seq 3, length 64

이로 인해 누락된 단계가 있다고 믿게 됩니다. 네트워크 트래픽이 eth0에서 나가지 않습니다.

이것들은 모두 작동합니다:

ip netns exec myvpn ping 10.200.200.1
ip netns exec myvpn ping 10.200.200.2
ping 10.200.200.2

실패합니다.

ping 10.200.200.1

답변1

이 명령은 ...

ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1

...실패해야 합니다.

Error: Nexthop has invalid gateway.

인터페이스를 설정하지 않았기 때문입니다 vpn1 up(따라서 10.200.200.1액세스할 수 없습니다). 주소를 할당한 후 즉시 이 작업을 수행해야 합니다.

ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip link set vpn1 up

다음 스크립트는 저에게 효과적입니다. 이는 다음 변경 사항을 제외하면 스크립트와 거의 동일합니다.

  • ip set link up앞서 언급한 누락된 명령을 추가했습니다.
  • ip netns exec myvpn ip ...모든 인스턴스를 다음 으로 교체했습니다 .ip -n myvpn ...
  • 나는 이 netns주장을 사용했다ip link add
#!/bin/bash

interface=eth0

down() {
    ip netns delete myvpn
    ip link delete vpn0
    iptables -D INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
    iptables -t nat -D POSTROUTING -s 10.200.200.0/24 -o $interface -j MASQUERADE
}

up() {
    ip netns add myvpn
    ip -n myvpn addr add 127.0.0.1/8 dev lo
    ip -n myvpn link set lo up
    ip link add vpn0 type veth peer name vpn1 netns myvpn
    ip link set vpn0 up
    ip addr add 10.200.200.1/24 dev vpn0
    ip -n myvpn addr add 10.200.200.2/24 dev vpn1
    ip -n myvpn link set vpn1 up
    ip -n myvpn route add default via 10.200.200.1 dev vpn1
    iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
    iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o $interface -j MASQUERADE
    ip netns exec myvpn ping -c 10 8.8.8.8
}

sysctl -q net.ipv4.ip_forward=1

down
trap down EXIT
up

내 시스템에서 이 스크립트를 실행하면 다음이 생성됩니다.

Cannot remove namespace file "/var/run/netns/myvpn": No such file or directory
Cannot find device "vpn0"
iptables: Bad rule (does a matching rule exist in that chain?).
iptables: Bad rule (does a matching rule exist in that chain?).
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=9.80 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=15.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=9.06 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=116 time=12.5 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=116 time=15.2 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=116 time=8.27 ms
64 bytes from 8.8.8.8: icmp_seq=8 ttl=116 time=11.3 ms
64 bytes from 8.8.8.8: icmp_seq=9 ttl=116 time=14.8 ms
64 bytes from 8.8.8.8: icmp_seq=10 ttl=116 time=7.21 ms

--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9012ms
rtt min/avg/max/mdev = 7.211/11.621/15.819/2.871 ms

관련 정보