ฟีดทราฟฟิกทั้งหมดผ่าน OpenVPN สำหรับเนมสเปซเครือข่ายเฉพาะเท่านั้น


16

ฉันพยายามตั้งค่า VPN (โดยใช้ OpenVPN) เพื่อให้การรับส่งข้อมูลทั้งหมดและเฉพาะทราฟฟิกไปยัง / จากกระบวนการเฉพาะต้องผ่าน VPN กระบวนการอื่น ๆ ควรใช้อุปกรณ์ทางกายภาพต่อไปโดยตรง ฉันเข้าใจว่าวิธีการทำเช่นนี้ใน Linux คือกับเนมสเปซเครือข่าย

หากฉันใช้ OpenVPN ปกติ (เช่น funneling ทุกการเข้าชมจากลูกค้าผ่าน VPN) ก็ทำงานได้ดี โดยเฉพาะฉันเริ่ม OpenVPN ดังนี้:

# openvpn --config destination.ovpn --auth-user-pass credentials.txt

(ปลายทางรุ่น Redacted.ovpn อยู่ท้ายคำถามนี้)

ฉันติดอยู่ในขั้นตอนต่อไปเขียนสคริปต์ที่ จำกัด อุปกรณ์ช่องสัญญาณให้เป็นเนมสเปซ ฉันเหนื่อย:

  1. วางอุปกรณ์ช่องสัญญาณโดยตรงในเนมสเปซด้วย

    # ip netns add tns0
    # ip link set dev tun0 netns tns0
    # ip netns exec tns0 ( ... commands to bring up tun0 as usual ... )
    

    คำสั่งเหล่านี้ทำงานได้สำเร็จ แต่ปริมาณข้อมูลที่สร้างขึ้นภายในเนมสเปซ (เช่นกับip netns exec tns0 traceroute -n 8.8.8.8) ตกลงไปในหลุมดำ

  2. บนสมมติฐานที่ว่า " คุณสามารถ [ยังคง] เพียงกำหนดอีเทอร์เน็ตเสมือน (veth) อินเทอร์เฟซให้กับเครือข่ายเนมสเปซ " (ซึ่งถ้าเป็นจริงจะได้รับรางวัลในปีนี้สำหรับข้อ จำกัด API ที่ไม่จำเป็นอย่างยิ่งที่สุด) วางปลายด้านหนึ่งของคู่สัตวแพทย์ในเนมสเปซ มันไม่ได้ไกลเท่าการจราจรบนพื้น: มันจะไม่ยอมให้ฉันเข้าไปในอุโมงค์! [แก้ไข: สิ่งนี้ดูเหมือนจะเป็นเพราะอุปกรณ์ประปาเท่านั้นที่สามารถใส่ลงในบริดจ์ แตกต่างจากการไร้ความสามารถในการวางอุปกรณ์ตามอำเภอใจในเนมสเปซเครือข่ายซึ่งจริง ๆ แล้วเหมาะสมอะไรที่บริดจ์เป็นแนวคิดอีเทอร์เน็ตเลเยอร์ น่าเสียดายที่ผู้ให้บริการ VPN ของฉันไม่รองรับ OpenVPN ในโหมดแตะดังนั้นฉันจึงต้องการวิธีแก้ปัญหา]

    # ip addr add dev tun0 local 0.0.0.0/0 scope link
    # ip link set tun0 up
    # ip link add name teo0 type veth peer name tei0
    # ip link set teo0 up
    # brctl addbr tbr0
    # brctl addif tbr0 teo0
    # brctl addif tbr0 tun0
    can't add tun0 to bridge tbr0: Invalid argument
    

สคริปต์ที่ส่วนท้ายของคำถามนี้มีไว้สำหรับแนวทางการแพทย์ สคริปต์สำหรับวิธีการโดยตรงอาจพบได้ในประวัติการแก้ไข ตัวแปรในสคริปต์ที่ดูเหมือนว่าจะใช้งานโดยไม่ต้องตั้งค่าก่อนจะถูกตั้งค่าในสภาพแวดล้อมโดยopenvpnโปรแกรม - ใช่มันเป็นเลอะเทอะและใช้ชื่อตัวพิมพ์เล็ก

โปรดให้คำแนะนำโดยเฉพาะเกี่ยวกับวิธีการทำงานนี้ ฉันรู้อย่างเจ็บปวดว่าฉันเขียนโปรแกรมโดยลัทธิการขนส่งสินค้าที่นี่ - มีใครเขียนเอกสารครอบคลุมสำหรับสิ่งนี้หรือไม่? ฉันไม่พบเลย - ดังนั้นการตรวจสอบโค้ดทั่วไปของสคริปต์ก็ชื่นชมเช่นกัน

ในกรณีที่สำคัญ:

# uname -srvm
Linux 3.14.5-x86_64-linode42 #1 SMP Thu Jun 5 15:22:13 EDT 2014 x86_64
# openvpn --version | head -1
OpenVPN 2.3.2 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Mar 17 2014
# ip -V
ip utility, iproute2-ss140804
# brctl --version
bridge-utils, 1.5

เคอร์เนลที่ถูกสร้างขึ้นโดยผู้ให้บริการโฮสติ้งของฉันเสมือน ( Linode ) และแม้จะรวบรวมกับCONFIG_MODULES=yมีโมดูลไม่มีจริง - เฉพาะCONFIG_*ชุดตัวแปรmตามที่/proc/config.gzเป็นCONFIG_XEN_TMEMและฉันไม่จริงมีว่าโมดูล (เคอร์เนลจะถูกเก็บไว้นอกระบบแฟ้มของฉัน/lib/modulesว่างเปล่าและ/proc/modulesบ่งบอกว่าไม่ได้โหลดอย่างน่าอัศจรรย์) ข้อความที่ตัดตอนมาจากการ/proc/config.gzร้องขอ แต่ฉันไม่ต้องการวางสิ่งทั้งหมดที่นี่

netns-up.sh

#! /bin/sh

mask2cidr () {
    local nbits dec
    nbits=0
    for dec in $(echo $1 | sed 's/\./ /g') ; do
        case "$dec" in
            (255) nbits=$(($nbits + 8)) ;;
            (254) nbits=$(($nbits + 7)) ;;
            (252) nbits=$(($nbits + 6)) ;;
            (248) nbits=$(($nbits + 5)) ;;
            (240) nbits=$(($nbits + 4)) ;;
            (224) nbits=$(($nbits + 3)) ;;
            (192) nbits=$(($nbits + 2)) ;;
            (128) nbits=$(($nbits + 1)) ;;
            (0)   ;;
            (*) echo "Error: $dec is not a valid netmask component" >&2
                exit 1
                ;;
        esac
    done
    echo "$nbits"
}

mask2network () {
    local host mask h m result
    host="$1."
    mask="$2."
    result=""
    while [ -n "$host" ]; do
        h="${host%%.*}"
        m="${mask%%.*}"
        host="${host#*.}"
        mask="${mask#*.}"
        result="$result.$(($h & $m))"
    done
    echo "${result#.}"
}

maybe_config_dns () {
    local n option servers
    n=1
    servers=""
    while [ $n -lt 100 ]; do
       eval option="\$foreign_option_$n"
       [ -n "$option" ] || break
       case "$option" in
           (*DNS*)
               set -- $option
               servers="$servers
nameserver $3"
               ;;
           (*) ;;
       esac
       n=$(($n + 1))
    done
    if [ -n "$servers" ]; then
        cat > /etc/netns/$tun_netns/resolv.conf <<EOF
# name servers for $tun_netns
$servers
EOF
    fi
}

config_inside_netns () {
    local ifconfig_cidr ifconfig_network

    ifconfig_cidr=$(mask2cidr $ifconfig_netmask)
    ifconfig_network=$(mask2network $ifconfig_local $ifconfig_netmask)

    ip link set dev lo up

    ip addr add dev $tun_vethI \
        local $ifconfig_local/$ifconfig_cidr \
        broadcast $ifconfig_broadcast \
        scope link
    ip route add default via $route_vpn_gateway dev $tun_vethI
    ip link set dev $tun_vethI mtu $tun_mtu up
}

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

set -ex

# For no good reason, we can't just put the tunnel device in the
# subsidiary namespace; we have to create a "virtual Ethernet"
# device pair, put one of its ends in the subsidiary namespace,
# and put the other end in a "bridge" with the tunnel device.

tun_tundv=$dev
tun_netns=tns${dev#tun}
tun_bridg=tbr${dev#tun}
tun_vethI=tei${dev#tun}
tun_vethO=teo${dev#tun}

case "$tun_netns" in
     (tns[0-9] | tns[0-9][0-9] | tns[0-9][0-9][0-9]) ;;
     (*) exit 1;;
esac

if [ $# -eq 1 ] && [ $1 = "INSIDE_NETNS" ]; then
    [ $(ip netns identify $$) = $tun_netns ] || exit 1
    config_inside_netns
else

    trap "rm -rf /etc/netns/$tun_netns ||:
          ip netns del $tun_netns      ||:
          ip link del $tun_vethO       ||:
          ip link set $tun_tundv down  ||:
          brctl delbr $tun_bridg       ||:
         " 0

    mkdir /etc/netns/$tun_netns
    maybe_config_dns

    ip addr add dev $tun_tundv local 0.0.0.0/0 scope link
    ip link set $tun_tundv mtu $tun_mtu up

    ip link add name $tun_vethO type veth peer name $tun_vethI
    ip link set $tun_vethO mtu $tun_mtu up

    brctl addbr $tun_bridg
    brctl setfd $tun_bridg 0
    #brctl sethello $tun_bridg 0
    brctl stp $tun_bridg off

    brctl addif $tun_bridg $tun_vethO
    brctl addif $tun_bridg $tun_tundv
    ip link set $tun_bridg up

    ip netns add $tun_netns
    ip link set dev $tun_vethI netns $tun_netns
    ip netns exec $tun_netns $0 INSIDE_NETNS

    trap "" 0
fi

netns-down.sh

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

set -ex

tun_netns=tns${dev#tun}
tun_bridg=tbr${dev#tun}

case "$tun_netns" in
     (tns[0-9] | tns[0-9][0-9] | tns[0-9][0-9][0-9]) ;;
     (*) exit 1;;
esac

[ -d /etc/netns/$tun_netns ] || exit 1

pids=$(ip netns pids $tun_netns)
if [ -n "$pids" ]; then
    kill $pids
    sleep 5
    pids=$(ip netns pids $tun_netns)
    if [ -n "$pids" ]; then
        kill -9 $pids
    fi
fi

# this automatically cleans up the the routes and the veth device pair
ip netns delete "$tun_netns"
rm -rf /etc/netns/$tun_netns

# the bridge and the tunnel device must be torn down separately
ip link set $dev down
brctl delbr $tun_bridg

destination.ovpn

client
auth-user-pass
ping 5
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
verb 3
route-metric 1
proto tcp
ping-exit 90
remote [REDACTED]
<ca>
[REDACTED]
</ca>
<cert>
[REDACTED]
</cert>
<key>
[REDACTED]
</key>

เริ่มจากสิ่งที่ชัดเจน: รองรับอุปกรณ์ veth ไหม? โหลดโมดูลเคอร์เนล (veth) ไหม
ตอบโต้

@countermode grep veth /proc/modulesไม่มีรายการ แต่ฉันไม่รู้ว่าเป็นข้อสรุปหรือไม่ อินสแตนซ์ Linode ไม่มีเคอร์เนลติดตั้งภายในพาร์ติชันระบบปฏิบัติการดังนั้นฉันไม่แน่ใจว่าฉันสามารถโหลดโมดูลที่ขาดหายไปได้
zwol

ไม่lsmodผลิตออกใด ๆ ที่ทั้งหมดหรือไม่ มีไดเรกทอรี/lib/modulesหรือไม่?
ตอบโต้

lsmod: command not found. มี/lib/modulesแต่มันไม่มีโมดูลใด ๆอยู่ในนั้นเพียงไดเรกทอรีไดเรกทอรีเคอร์เนลที่ประกอบด้วยmodules.depไฟล์เปล่า ฉันจะแหย่ในความช่วยเหลือเฉพาะของ Linode แล้วดูว่ามันเป็นอย่างไร
zwol

อืม ... แปลกมาก ฉันไม่คุ้นเคยกับ Linode แต่สำหรับฉันมันดูเหมือนกับว่าอุปกรณ์ veth ไม่ได้รับการสนับสนุน
ตอบโต้

คำตอบ:


9

คุณสามารถเริ่มลิงค์ OpenVPN ภายในเนมสเปซแล้วเรียกใช้ทุกคำสั่งที่คุณต้องการใช้ลิงค์ OpenVPN นั้นในเนมสเปซ รายละเอียดเกี่ยวกับวิธีการ (ไม่ใช่งานของฉัน) ที่นี่:

http://www.naju.se/articles/openvpn-netns.html

ฉันลองแล้วใช้งานได้ ความคิดคือการจัดทำสคริปต์ที่กำหนดเองเพื่อดำเนินการขั้นตอนขึ้นและเส้นทางของการเชื่อมต่อ OpenVPN ภายในเนมสเปซที่เฉพาะเจาะจงแทนที่จะเป็นส่วนกลาง ฉันพูดจากลิงค์ข้างต้นในกรณีที่มันจะออฟไลน์ในอนาคต:

ขั้นแรกให้สร้างสคริปต์ --up สำหรับ OpenVPN สคริปต์นี้จะสร้างอินเตอร์เฟส VPN tunnel ภายในเนมสเปซเครือข่ายชื่อ vpn แทนที่จะเป็นเนมสเปซเริ่มต้น

$ cat > netns-up << EOF
#!/bin/sh
case $script_type in
        up)
                ip netns add vpn
                ip netns exec vpn ip link set dev lo up
                mkdir -p /etc/netns/vpn
                echo "nameserver 8.8.8.8" > /etc/netns/vpn/resolv.conf
                ip link set dev "$1" up netns vpn mtu "$2"
                ip netns exec vpn ip addr add dev "$1" \
                        "$4/${ifconfig_netmask:-30}" \
                        ${ifconfig_broadcast:+broadcast "$ifconfig_broadcast"}
                test -n "$ifconfig_ipv6_local" && \
          ip netns exec vpn ip addr add dev "$1" \
                        "$ifconfig_ipv6_local"/112
                ;;
        route-up)
                ip netns exec vpn ip route add default via "$route_vpn_gateway"
                test -n "$ifconfig_ipv6_remote" && \
          ip netns exec vpn ip route add default via \
                        "$ifconfig_ipv6_remote"
                ;;
        down)
                ip netns delete vpn
                ;;
esac
EOF

จากนั้นเริ่ม OpenVPN และบอกให้ใช้สคริปต์ --up ของเราแทนการเรียกใช้ ifconfig และเส้นทาง

openvpn --ifconfig-noexec --route-noexec --up netns-up --route-up netns-up --down netns-up

ตอนนี้คุณสามารถเริ่มโปรแกรมเพื่อรับสัญญาณเช่นนี้:

ip netns exec vpn command

สิ่งที่จับได้เพียงอย่างเดียวคือคุณต้องรูทเพื่อเรียกใช้ip netns exec ...และบางทีคุณไม่ต้องการให้แอปพลิเคชันของคุณทำงานเป็นรูท การแก้ปัญหาง่ายมาก:

sudo ip netns exec vpn คำสั่ง sudo -u $ (whoami)

1
สวัสดีและยินดีต้อนรับสู่เว็บไซต์! เราสนับสนุนให้ผู้ใช้อย่างน้อยสรุป (ถ้าเป็นไปได้) เนื้อหาของลิงก์ที่พวกเขาวางไว้ในคำตอบ สิ่งนี้จะช่วยรักษาคุณภาพคำตอบในกรณีที่ลิงก์ค้าง (เช่นเว็บไซต์ไม่สามารถเข้าถึงได้อีกต่อไป) โปรดปรับปรุงคำตอบของคุณโดยการรวมส่วนที่สำคัญที่สุด / คำแนะนำจากบทความที่เชื่อมโยง
Erathiel

นี่ยอดเยี่ยม แต่คุณต้องใส่เครื่องหมายอัญประกาศล้อมรอบตัวคั่น heredoc เพื่อป้องกันไม่ให้เชลล์ขยายตัวแปรทั้งหมด
ewatt

7

ปรากฎว่าคุณ สามารถใส่ช่องสัญญาณอินเทอร์เฟซในเครือข่ายเนมสเปซ ปัญหาทั้งหมดของฉันเกิดข้อผิดพลาดในการนำอินเตอร์เฟสขึ้นมา:

ip addr add dev $tun_tundv \
    local $ifconfig_local/$ifconfig_cidr \
    broadcast $ifconfig_broadcast \
    scope link

ปัญหาคือ "การเชื่อมโยงขอบเขต" ซึ่งฉันเข้าใจผิดว่ามีผลต่อการกำหนดเส้นทางเท่านั้น มันทำให้เกิด kernel เพื่อกำหนดแหล่งที่อยู่ของแพ็คเก็ตทั้งหมดที่ส่งเข้าไปในอุโมงค์ไป0.0.0.0; สมมุติว่าเซิร์ฟเวอร์ OpenVPN นั้นจะทิ้งสิ่งนั้นไม่ถูกต้องต่อ RFC1122; แม้ว่าจะไม่เป็นเช่นนั้นปลายทางก็จะไม่สามารถตอบกลับได้อย่างชัดเจน

ทุกอย่างทำงานอย่างถูกต้องในกรณีที่ไม่มีเนมสเปซเครือข่ายเนื่องจากสคริปต์การกำหนดค่าเครือข่ายในตัวของ openvpn ไม่ได้ทำผิดพลาดนี้ และหากไม่มี "ลิงก์ขอบเขต" สคริปต์ดั้งเดิมของฉันก็ใช้ได้เช่นกัน

(ฉันจะค้นพบสิ่งนี้ได้อย่างไรคุณถามโดยทำงานstraceในกระบวนการ openvpn ตั้งค่าเป็น hexdump ทุกอย่างที่อ่านจากตัวอธิบายช่องสัญญาณแล้วถอดรหัสส่วนหัวของแพ็กเก็ตด้วยตนเอง)


โอกาสใดที่คุณสามารถเขียนคำแนะนำเกี่ยวกับเรื่องนี้? ฉันกำลังพยายามตั้งค่าสิ่งที่คล้ายกัน แต่ก็ยากที่จะบอกว่าส่วนใดของคำถามของคุณเริ่มต้นได้ดีและเป็นเส้นทางที่นำไปสู่ความล้มเหลว
tremby

@tremby ฉันไม่น่าจะมีเวลาทำเช่นนี้ในอนาคตอันใกล้ แต่คุณอาจพบว่าgithub.com/zackw/tbbscraper/blob/master/scripts/openvpn-netns.cมีประโยชน์
zwol

ใช่ฉันไม่แน่ใจว่าโปรแกรม C 1100 บรรทัดจะช่วยได้ วิธีการเกี่ยวกับการกำหนดค่าสุดท้ายสคริปต์และคาถาที่ได้งานสำหรับคุณหรือไม่ ... หรือว่าโปรแกรม C คือการดำเนินการขั้นสุดท้ายของคุณในเรื่องนี้?
tremby

@tremby ใช่โปรแกรม C นั้นคือการใช้งานครั้งสุดท้ายของฉัน (ในสถานการณ์การใช้งานของฉันจะต้องมี setuid คุณเห็น) คุณอาจจะสามารถวางสิ่ง - ถ้าความคิดเห็นขนาดใหญ่ที่ด้านบนไม่ได้อธิบายวิธีการใช้ให้ฉันรู้
zwol

@tremby ในทางเลือกให้ดูที่ "สคริปต์ที่เรียกใช้จากภายใน openvpn" เริ่มต้นที่github.com/zackw/tbbscraper/blob/master/scripts/ …เพื่อดูว่าเนมสเปซเครือข่ายมีการตั้งค่าและฉีกขาดอย่างไร และการร้องขอจริงของไคลเอ็นต์ ovpn อยู่ที่github.com/zackw/tbbscraper/blob/master/scripts/ … ส่วนที่เหลือของรหัสสามารถถือเป็นการใช้ mini-shell เพื่อให้การดำเนินการเหล่านั้นน่าเบื่อน้อยลงในการเขียน
zwol

4

ข้อผิดพลาดในการพยายามสร้างอุปกรณ์สัตวแพทย์เกิดจากการเปลี่ยนแปลงวิธีการ ipตีความอาร์กิวเมนต์บรรทัดคำสั่ง

คำร้องขอที่ถูกต้องของipเพื่อสร้างอุปกรณ์สัตวแพทย์คู่หนึ่งคือ

ip link add name veth0 type veth peer name veth1

( nameinstad จากdev )

ตอนนี้วิธีการรับปริมาณการใช้งานจาก namespace ไปยังอุโมงค์ VPN? เนื่องจากคุณมีอุปกรณ์รับสัญญาณที่พร้อมให้บริการคุณจึงต้อง "โฮสต์" เช่นสร้างคู่สัตวแพทย์และใส่หนึ่งใน namespace เชื่อมต่ออื่น ๆ ผ่านการกำหนดเส้นทางไปยังอุโมงค์ ดังนั้นให้เปิดใช้งานการส่งต่อแล้วเพิ่มเส้นทางที่จำเป็น

เพื่อเป็นตัวอย่างสมมติว่าeth0เป็นอินเทอร์เฟซหลักของคุณคืออินเทอร์เฟซช่องสัญญาณtun0VPN ของคุณและveth0/ veth1คู่ของอินเทอร์เฟซที่veth1อยู่ในเนมสเปซ ภายในเนมสเปซที่คุณเพิ่มเพียงเส้นทางเริ่มต้นveth1ที่คุณเพิ่มเพียงเส้นทางเริ่มต้นสำหรับ

บนโฮสต์คุณต้องใช้การกำหนดเส้นทางนโยบายดูที่นี่เป็นตัวอย่าง สิ่งที่คุณต้องทำ:

เพิ่ม / ต่อท้ายรายการเช่น

1   vpn

ถึง /etc/iproute2/rt_tablesไปยังโดยสิ่งนี้คุณสามารถเรียกตาราง (ยังสร้างได้) ตามชื่อ

จากนั้นใช้คำสั่งต่อไปนี้:

ip rule add iif veth0 priority 1000 table vpn
ip rule add iif tun0 priority 1001 table vpn
ip route add default via <ip-addr-of-tun0> table vpn
ip route add <ns-network> via <ip-addr-of-veth0> table vpn

ฉันไม่สามารถลองที่นี่ด้วยการตั้งค่าเหมือนของคุณ แต่ควรทำสิ่งที่คุณต้องการ คุณสามารถเพิ่มได้โดยกฎตัวกรองแพ็คเก็ตเช่นนั้นทั้ง VPN และ "แขก" สุทธิจะถูกรบกวน

NB การย้ายtun0เข้าไปในเนมสเปซในตอนแรกดูเหมือนว่าถูกต้องแล้ว แต่เหมือนคุณฉันไม่ได้ไปทำงาน การกำหนดเส้นทางนโยบายดูเหมือนสิ่งถูกต้องต่อไป โซลูชันของ Mahendra นั้นใช้ได้หากคุณรู้ว่าเครือข่ายที่อยู่เบื้องหลัง VPN และแอปพลิเคชันอื่น ๆ ทั้งหมดจะไม่เข้าถึงเครือข่ายเหล่านั้น แต่สภาพของคุณเริ่มต้น ( "ทั้งหมดของการจราจรและเพียงการจราจรไปยัง / จากกระบวนการที่เฉพาะเจาะจงไปผ่าน VPN") เสียงเป็นถ้าไม่สามารถได้รับการรับประกันหลัง


ขอบคุณสิ่งนี้ทำให้ฉันเพิ่มขึ้นอีกเล็กน้อย แต่ตอนนี้ฉันติดอยู่ที่ส่วน "แล้วคุณใช้สะพานเชื่อมอุปกรณ์สัตวแพทย์เข้ากับอุโมงค์" - โปรดดูคำถามที่แก้ไขแล้ว
zwol

ตามคำตอบที่ฉันเพิ่งโพสต์สิ่งทั้งหมดนี้เกิดขึ้นจากความผิดพลาดโง่ ๆ ในสคริปต์ต้นฉบับของฉัน - "ลิงก์ขอบเขต" ไม่ได้หมายความว่าฉันคิดว่ามันหมายถึงอะไร แต่ฉันจะมอบรางวัลให้คุณเพราะคุณทุ่มเททำงานอย่างหนักเพื่อช่วยฉันทดสอบความเป็นไปได้ต่าง ๆ และฉันก็อาจจะยอมแพ้ถ้าคุณไม่มี
zwol

เฮ้แซคขอบคุณมาก เนมสเปซและการกำหนดนโยบายเป็นสิ่งที่น่าสนใจสำหรับการวิจัย ฉันจะไม่ใช้ความพยายามอย่างมากในเรื่องนี้ถ้ามันไม่ได้ตื่นเต้นด้วยตัวเอง
ตอบโต้

0

หากรู้จักเครือข่ายที่คุณเข้าถึงผ่าน VPN คุณสามารถแก้ไขตารางเส้นทางของคุณเพื่อให้ได้สิ่งที่คุณต้องการ

  1. จดบันทึกเส้นทางเริ่มต้นปัจจุบันของคุณ

    # ip route | grep default default via 192.168.43.1 dev wlo1 proto static metric 1024

  2. ดำเนินการ VPN และสิ่งนี้จะแนะนำรายการการกำหนดเส้นทาง

  3. ลบเส้นทางเริ่มต้นปัจจุบัน (ซึ่งเพิ่มโดย VPN) โดยที่เป็นเส้นทางเริ่มต้นก่อนหน้าเพื่อเป็นรายการเริ่มต้นแรกในตาราง

    # ip route | grep default default dev tun0 scope link default via 192.168.43.1 dev wlo1 proto static metric 1024

    # ip route del default dev tun0 scope link

  4. เพิ่มเส้นทางที่กำหนดเองไปยังเครือข่ายที่อยู่ใน VPN เพื่อกำหนดเส้นทางผ่าน tun0

    # ip route add <net1>/16 dev tun0

    # ip route add <net2>/24 dev tun0

  5. เพิ่มรายการเนมเซิร์ฟเวอร์ทั้งสอง (ใน resolv.conf) เช่นกันสำหรับ VPN และการเชื่อมต่อโดยตรง

ตอนนี้การเชื่อมต่อ net1 และ net2 ทั้งหมดจะผ่าน VPN และการรีเซ็ตจะไปโดยตรง (ผ่าน wlo1 ในตัวอย่างนี้)


น่าเสียดายที่เครือข่ายที่เข้าถึงผ่าน VPN ไม่ทราบล่วงหน้าดังนั้นสิ่งนี้จะไม่ทำงานสำหรับฉัน
zwol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.