Pertanyaan: Bagaimana saya menjalankan program sambil memastikan bahwa akses jaringannya terikat melalui antarmuka jaringan tertentu?
Kasus: Saya ingin mengakses dua mesin berbeda dengan IP yang sama (192.168.1.1), tetapi dapat diakses melalui dua antarmuka jaringan yang berbeda (eth1 dan eth2).
Contoh:
net-bind -D eth1 -exec {Program 192.168.1.1}
net-bind -D eth2 -exec {Program 192.168.1.1}
Di atas adalah perkiraan dari apa yang saya suka, terinspirasi oleh pengikatan hardware yang dilakukan melalui primusrun dan optirun .
Tantangan: Seperti yang disarankan dalam utas terkait , antarmuka yang digunakan tidak dipilih oleh program, melainkan oleh kernel (Oleh karena itu sintaks pra-mengikat dalam contoh di atas).
Saya telah menemukan beberapa solusi terkait, yang tidak memuaskan. Mereka didasarkan pada antarmuka jaringan yang mengikat melalui daftar hitam jaringan khusus pengguna; yaitu, menjalankan proses sebagai pengguna yang hanya dapat mengakses satu antarmuka jaringan tertentu.
sumber
Jawaban:
Untuk Linux, ini sudah dijawab pada Superuser - Bagaimana cara menggunakan antarmuka jaringan yang berbeda untuk proses yang berbeda? .
Jawaban yang paling populer menggunakan
LD_PRELOAD
trik untuk mengubah pengikatan jaringan untuk suatu program, tetapi kernel modern mendukung fitur yang jauh lebih fleksibel yang disebut 'ruang nama jaringan' yang diekspos melaluiip
program. Jawaban ini menunjukkan cara menggunakan ini. Dari percobaan saya sendiri, saya telah melakukan yang berikut (sebagai root):Dimungkinkan juga untuk mengelola ruang nama jaringan sampai batas tertentu dengan
unshare
dannsenter
perintah. Ini memungkinkan Anda juga membuat ruang terpisah untuk PID, pengguna, dan titik pemasangan. Untuk informasi lebih lanjut, lihat:sumber
wvdial
misalnya sepertinya tidak mengaturnya sama sekali ... jadi harus didefinisikan dalam namespace itu sendiriip netns remove test_ns
untuk kembali normal? Atau apakah Anda harus melakukan sesuatu yang istimewa?Saya menerima jawaban Graeme; ini hanyalah tindak lanjut untuk menjelaskan perubahan yang saya lakukan terhadap sarannya untuk menyelesaikan masalah saya.
Alih-alih mengikat antarmuka fisik di dalam namespace, saya membuat pasangan antarmuka jaringan virtual, dengan satu ujung di namespace jaringan dan satu di root. Paket-paket kemudian dialihkan melalui jaringan virtual ini dari namespace, ke root namespace dan kemudian ke antarmuka fisik. - Karena itu saya dapat menjalankan semua transfer data biasa saya, dan selain itu memulai proses yang hanya dapat mengakses antarmuka tertentu.
Setelah antarmuka telah diatur untuk eth0 dan eth1, dengan masing-masing namespaces eth0_ns dan eth1_ns, program dapat dieksekusi pada antarmuka yang ditentukan melalui;
sumber
dhclient <bridge>
per di sini .Solusi I: Preloading perpustakaan tertentu
App-Route-Jail : gunakan ld_preload untuk memaksa gateway antarmuka (ide bagus tetapi membutuhkan kemampuan root atau tanda) penggunaan dirinci pada catatan di bawah
Proxybound : gunakan ld_preload untuk memaksa proxy ke aplikasi tertentu (ini menggunakan proxy bukan antarmuka)
Force-Bind : memiliki banyak fitur tetapi bind bocoran (tidak dapat diandalkan)
Bind-Interface-IP : koneksi terlalu sederhana dan bocor (tidak dapat diandalkan)
Bind-IP : terlalu sederhana dan koneksi bocor (tidak dapat diandalkan)
Solusi II: ruang pengguna Linux
Ruang pengguna linux klasik ip-netns : solusi hebat tetapi membutuhkan root dan antarmuka hanya dapat ada pada satu ruang pengguna tunggal
Firejail : Firejail dapat memaksa aplikasi untuk menggunakan jaringan tertentu, tetapi kompatibilitasnya terbatas (contohnya tidak kompatibel dengan antarmuka tun). firejail tidak membutuhkan root
firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Firejail dengan jaring : Firejail dapat memaksa aplikasi untuk menggunakan ruang pengguna tertentu yang dibuat secara terpisah, ini mari kita beri nama spasi tanpa root
firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
Firejail dengan masquerade dan bridge : Firejail dapat memaksa aplikasi untuk menggunakan antarmuka spesifik dengan iptables masquerade , ini hebat dan tidak memerlukan root tetapi ini memerlukan ip_forward dan dapat menyiratkan dampak keamanan
firejail --net=br0 firefox
Solusi III: iptables Linux
Iptables dapat digunakan untuk tujuan ini tetapi ini memerlukan ip_forward dan dapat menyiratkan dampak keamanan jika tidak dikonfigurasi dengan benar, contoh 1 , contoh 2 , contoh 3 , contoh 4
Catatan Solusi (I, II & III):
Wireguard
Jika Anda menggunakan VPN (terutama wireguard) dan Anda ingin menerapkan solusi ini ke antarmuka wireguard ( wireguard dengan ruang pengguna ), Anda dapat mengikuti tautan yang diinstruksikan untuk membuat ruang pengguna yang berisi antarmuka wg (dan dengan demikian terbatas pada antarmuka vpn ) juga ini dapat dikombinasikan dengan
firejail --netns=container
untuk dapat menggunakan ruang pengguna tanpa root.Cara menemukan antarmuka gateway
Ada banyak solusi untuk menemukan gateway di sini adalah beberapa perintah yang memungkinkan untuk menemukan gateway yang digunakan
Cara menggunakan App-Route-Jail
192.168.1.1
ini digunakan sebagai gateway paksa, aturan rute ini tidak akan mempengaruhi aplikasi lain, manipulasi ini harus dilakukan hanya sekali pada boot sistem misalnya jika Anda ingin gunakan solusi ini setiap harisumber