Saya memiliki dua antarmuka jaringan pada PC Linux, dan saya perlu mengatur antarmuka secara manual yang akan digunakan proses tertentu.
Program ini tidak memiliki opsi serupa, jadi saya percaya bahwa itu harus diatur secara eksternal.
Bagaimana saya bisa melakukannya?
Sunting: Saya tidak mencoba untuk membuat proses server mengikat ke antarmuka tertentu, melainkan untuk membuat program klien menghubungi server menggunakan antarmuka tertentu.
linux
networking
Andrea Spadaccini
sumber
sumber
Jawaban:
Anda dapat mengganti kode saat runtime dengan menggunakan LD_PRELOAD (@windows Anda dapat menggunakan teknik serupa yang disebut jalan memutar , cukup mewah). apa yang dilakukan adalah memberi tahu tautan dinamis untuk pertama-tama memuat semua lib ke dalam proses yang ingin Anda jalankan dan kemudian menambahkan lebih banyak di atasnya. Anda biasanya menggunakannya seperti ini:
dan dengan itu Anda mengubah apa yang
ls
dilakukannya.untuk masalah Anda, saya akan mencoba http://www.ryde.net/code/bind.c.txt , yang dapat Anda gunakan seperti:
di sini adalah bagaimana Anda membangunnya:
howto yang lebih panjang adalah http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html
peretasan dan alat serupa:
sumber
force_bind
proyek dengan Catalin M. Boie mendukung ipv6ip netns dapat melakukan ini.
TL; DR: Buat ruang nama jaringan, kaitkan antarmuka dengan mereka dan kemudian jalankan "ip netns exec NAME cmd ..."
Periksa apakah distro Anda mendukung ip netns ... (Backtrack 5r3 tidak, sedangkan Kali tidak;))
DALAM RINCIAN LEBIH LANJUT:
Mengapa ini lebih baik daripada mengikat ip melalui LD_PRELOAD? Karena LD_PRELOAD tidak mengontrol rute yang digunakan proses. Ini akan menggunakan rute pertama.
Dan karena selalu menggunakan rute yang sama, itu akan default ke antarmuka yang terdaftar ke rute. (Yang bukan yang kita inginkan)
sumber
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
Saya tidak berpikir mungkin untuk memaksa suatu proses untuk menggunakan antarmuka tertentu.
Namun, saya pikir Anda mungkin bisa bermain dengan ipchain / iptables dan memaksakan bahwa port tertentu yang didengarkan proses Anda hanya akan mendapatkan paket yang datang melalui antarmuka tertentu.
HOWTO Berguna: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html
sumber
Berdasarkan @olivervbk, jawaban di bawah adalah milikku!
Jalankan semua perintah sebagai "root".
Gunakan perintah ...
... untuk mengetahui nama antarmuka jaringan yang ingin Anda gunakan.
Jalankan perintah di bawah ini sebagai templat ...
CATATAN I: Tanda "-b -u" pada perintah "sudo" memungkinkan aplikasi untuk berjalan menggunakan pengguna Anda (bukan "root") dan di latar belakang melepaskan terminal. The
2> /dev/null 1> /dev/null &
potongan adalah untuk mencegah output dari "[APP_NAME]" yang dicetak di terminal.CATATAN II: Nilai-nilai ip "10.1.1.10" dan "10.1.1.1" adalah arbitrer.
CATATAN III: Untuk bekerja untuk saya, saya harus menjalankan
dhcpcd [INTERFACE_NAME]
perintah.Untuk menghapus namespace gunakan ...
... atau...
... untuk menghapus semua yang ada.
sumber
Biasanya jika suatu program tidak memiliki opsi untuk mengatur antarmuka mendengarkan, itu mendengarkan pada SEMUA antarmuka. (Anda dapat memverifikasi ini dengan
lsof -i
).Membuat aturan firewall iptables yang menjatuhkan lalu lintas masuk ke port-portnya pada antarmuka yang tidak Anda inginkan terlihat adalah hal yang paling mudah untuk dilakukan.
sumber
Alternatif I:
Menggunakan ld_preload untuk memaksa antarmuka gateway https://github.com/Intika-Linux-Network/App-Route-Jail
Memaksa aplikasi untuk menggunakan antarmuka jaringan tertentu
Kita perlu menemukan gateway apa yang digunakan antarmuka jaringan kemudian memaksa gateway itu ke aplikasi kita yang dipenjara dan dengan demikian memaksa aplikasi untuk mengikat ke antarmuka jaringan tertentu
Per gerbang aplikasi
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 hariAlternatif II:
Firejail https://firejail.wordpress.com/ dapat memaksa aplikasi untuk menggunakan jaringan tertentu, tetapi kompatibilitasnya terbatas.
sumber
Mengapa Anda ingin program menggunakan antarmuka selain yang terhubung ke server untuk berbicara dengan server itu? Dan jika sistem tidak menggunakan antarmuka yang terhubung ke server untuk berbicara ke server itu, itu adalah masalah tingkat-tabel (tabel routing) dan tidak ada hubungannya dengan proses yang ingin berbicara dengan server itu.
Server yang berbeda pada jaringan IP memiliki alamat IP yang berbeda. Kernel harus mengetahui antarmuka mana yang digunakan untuk mencapai alamat IP tertentu berdasarkan tabel routing. Jika Anda mencoba berbicara dengan dua server berbeda yang memiliki alamat IP yang sama, sistem akan menjadi bingung (karena, antara lain, itu hanya mengindeks koneksi secara internal berdasarkan alamat tujuan). Anda dapat membuatnya bekerja, tetapi ini adalah perbaikan tingkat sistem yang melibatkan penempatan satu server di jaringan logis terpisah yang hanya terhubung ke mesin melalui perangkat lunak NAT.
Jadi jika mereka memiliki alamat IP yang berbeda, gunakan rute untuk memilih antarmuka yang benar. Jika mereka memiliki alamat IP yang sama, Anda perlu menggunakan NAT sehingga mereka tampaknya memiliki alamat IP yang berbeda untuk sistem.
sumber