GNU/Linux >> Belajar Linux >  >> Linux

Beri makan semua lalu lintas melalui OpenVPN hanya untuk ruang nama jaringan tertentu

Anda dapat memulai tautan OpenVPN di dalam namespace dan kemudian menjalankan setiap perintah yang Anda inginkan untuk menggunakan tautan OpenVPN di dalam namespace. Detail tentang cara melakukannya disajikan dalam Menjalankan terowongan OpenVPN di dalam ruang nama jaringan, oleh Sebastian Thorarensen.

Saya mencobanya dan berhasil. Idenya adalah untuk menyediakan skrip khusus untuk melakukan fase up dan route-up dari koneksi OpenVPN di dalam namespace tertentu, bukan global. Ini adalah jawaban berdasarkan sumber di atas, tetapi dimodifikasi untuk menambahkan DNS Google ke resolv.conf .

Pertama buat --up skrip untuk OpenVPN. Skrip ini akan membuat antarmuka terowongan VPN di dalam ruang nama jaringan yang disebut vpn , alih-alih namespace default.

$ 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

Kemudian mulai OpenVPN dan beri tahu untuk menggunakan --up kami skrip alih-alih mengeksekusi ifconfig dan route.

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

Sekarang Anda dapat memulai program untuk disalurkan seperti ini:

ip netns exec vpn command

Satu-satunya tangkapan adalah Anda harus menjadi root untuk menjalankan ip netns exec ... dan mungkin Anda tidak ingin aplikasi Anda dijalankan sebagai root. Solusinya sederhana:

sudo ip netns exec vpn sudo -u $(whoami) command

Ternyata Anda bisa letakkan antarmuka terowongan ke dalam ruang nama jaringan. Seluruh masalah saya adalah kesalahan dalam menampilkan antarmuka:

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

Masalahnya adalah "lingkup tautan", yang saya salah paham karena hanya memengaruhi perutean. Ini menyebabkan kernel menyetel alamat sumber semua paket yang dikirim ke terowongan menjadi 0.0.0.0; mungkin server OpenVPN kemudian akan membuangnya sebagai tidak valid per RFC1122; bahkan jika tidak, tujuan jelas tidak dapat menjawab.

Semuanya bekerja dengan benar tanpa adanya ruang nama jaringan karena skrip konfigurasi jaringan bawaan openvpn tidak membuat kesalahan ini. Dan tanpa "lingkup tautan", skrip asli saya juga berfungsi.

(Bagaimana saya menemukan ini, Anda bertanya? Dengan menjalankan strace pada proses openvpn, setel ke hexdump semua yang dibaca dari deskriptor tunnel, lalu mendekode header paket secara manual.)


Kesalahan saat mencoba membuat perangkat veth disebabkan oleh perubahan cara ip menginterpretasikan argumen baris perintah.

Pemanggilan ip yang benar untuk membuat sepasang perangkat veth adalah

ip link add name veth0 type veth peer name veth1

(name instad dari dev )

Sekarang, bagaimana cara mengeluarkan lalu lintas dari namespace ke terowongan VPN? Karena Anda hanya memiliki perangkat tun yang Anda inginkan, "host" harus merutekan. Yaitu. buat pasangan veth dan masukkan satu ke namespace. Hubungkan yang lain melalui perutean ke terowongan. Jadi, aktifkan penerusan, lalu tambahkan rute yang diperlukan.

Sebagai contoh misalkan eth0 adalah antarmuka utama Anda, tun0 adalah antarmuka terowongan VPN Anda, dan veth0 /veth1 sepasang antarmuka yang veth1 ada di ruang nama. Di dalam namespace Anda hanya menambahkan rute default untuk veth1 .

Di host Anda perlu menggunakan perutean kebijakan, lihat di sini misalnya. Yang perlu Anda lakukan:

Tambahkan/tambahkan entri seperti

1   vpn

ke /etc/iproute2/rt_tables . Dengan ini, Anda dapat memanggil tabel (belum dibuat) dengan nama.

Kemudian gunakan pernyataan berikut:

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

Saya tidak dapat mencobanya di sini dengan penyiapan seperti milik Anda, tetapi ini akan melakukan apa yang Anda inginkan. Anda dapat menambahnya dengan aturan filter paket sedemikian rupa sehingga baik vpn maupun jaringan "tamu" tidak terganggu.

N.B. Memindahkan tun0 ke dalam namespace di tempat pertama sepertinya hal yang benar untuk dilakukan. Tapi seperti Anda, saya tidak membuatnya bekerja. Perutean kebijakan tampaknya merupakan hal yang benar berikutnya untuk dilakukan. Solusi Mahendra dapat diterapkan jika Anda mengetahui jaringan di balik VPN dan semua aplikasi lain tidak akan pernah mengakses jaringan tersebut. Namun kondisi awal Anda ("semua lalu lintas, dan hanya lalu lintas, ke/dari proses tertentu melewati VPN") terdengar seolah-olah yang terakhir tidak dapat dijamin.


Linux
  1. VPN Kill Switch untuk OpenVPN Connect Sekarang Tersedia

  2. Akses Baca Saja Ke Semua File Dalam Sub-folder Tertentu?

  3. Menggunakan Tcpdump Untuk Mencatat Semua Aktivitas Jaringan Melalui Server Router?

  1. Bagaimana saya bisa mendaftar semua IP di jaringan yang terhubung, lebih disukai melalui Terminal?

  2. Mengapa lalu lintas jaringan Linux hanya melewati eth0?

  3. Ubah pemilik dan grup hanya untuk pemilik tertentu

  1. 10 Perintah Linux Untuk Diagnostik Jaringan

  2. 6 opsi filter lalu lintas jaringan tcpdump

  3. Menggunakan alat SS untuk pemecahan masalah jaringan