Linux, dhclient: Cara mengetahui apakah konfigurasi DHCP saya valid (tanpa gangguan jaringan)

1

Saya bekerja pada sistem Linux dengan pengaturan jaringan "klasik", yaitu tidak ada daemon konfigurasi berfitur lengkap yang berjalan seperti NetworkManager. Sebagian besar konfigurasi dilakukan oleh dhclient.

Saya perlu mendeteksi situasi di mana saya harus menjalankan kembali dhclient. (subnet berbeda karena perubahan konfigurasi kabel atau jaringan). Saya ingin menjalankan pemeriksaan setiap 10 menit tanpa memutus koneksi yang ada.

Apa yang saya butuhkan pada dasarnya adalah jawaban untuk pertanyaan seperti Apakah Alamat IP dan Gateway saya valid untuk Jaringan yang saya hubungkan? atau Jika saya akan memperbarui Sewa DHCP saya, apakah saya akan mendapatkan IP yang sama lagi? . Untuk menjawab pertanyaan pertama, seseorang hanya bisa melakukan ping beberapa IP publik seperti 8.8.8.8, tapi saya butuh solusi yang juga berfungsi di jaringan pribadi besar yang saya tidak tahu. Bahkan gateway default mungkin tidak selalu bisa pingable.

Satu saya tahu ip saya tidak valid saya akan melakukan "dhclient -r eth0; dhclient eth0" untuk memperbarui sewa. Namun, ini memutus saya dari internet untuk waktu yang singkat, jika saya sudah terhubung dengan benar.

Saya menemukan bahwa dhcping adalah alat yang baik untuk menanyakan server DHCP tanpa benar-benar menggunakan hasilnya. Namun, saya mendapatkan hasil yang aneh, yang bahkan mungkin memenuhi syarat untuk pertanyaan lain. Tampaknya dhcping hanya berfungsi dengan baik jika saya tahu ip server sebelumnya, jadi ada alat yang hilang untuk DHCP DISCOVER. (dan menggunakan alamat server broadcast tidak dapat diandalkan)

Saya tahu saya bisa melakukan hdcp find dengan nmap, namun menginstal nmap bukan ide yang baik karena alasan keamanan.

Pertanyaan yang ingin saya tanyakan:

  • Apakah ada cara untuk memvalidasi ip terkonfigurasi saya dalam konteks jaringan yang terhubung?
  • Apakah ada peluang untuk memperbaharui sewa dhclient sesuai permintaan?
  • Apakah ada alat yang melakukan siaran dhcp dan menyiarkan hasilnya?

Adendum :

Berbeda dengan hasil tes pertama saya, hanya memanggil dhclient -v tidak menyelesaikan masalah saya. Untuk memperjelas ini, masalah awal saya adalah dhclient berjalan dalam mode latar belakang (tanpa benar-benar memperbarui sewa sepanjang waktu). Memanggil dhclient menghasilkan:

dhclient (30887) sudah berjalan - keluar.

Ini tidak sepenuhnya repoducable. Terkadang berhasil. (Inilah mengapa saya pertama kali berpikir opsi -v akan membuat perbedaan, itu tidak)

Jadi pertanyaan saya adalah: Jika saya mendapatkan masalah yang sudah berjalan ini, walaupun dclient saat ini tidak melakukan apa-apa, bagaimana memicu pembaruan untuk proses latar belakang?

(Alasan di balik ini adalah, bahwa klien DHCP harus mengikat ke port 68. Ketika port ini terikat oleh daemon latar belakang dhclient, contoh lain tidak dapat dieksekusi di latar depan)

philipp
sumber

Jawaban:

2

Jawaban untuk dua pertanyaan pertama adalah sama: gunakan

dhclient -v eth0

( -v adalah singkatan dari verbose, tidak semua distro Linux memilikinya), bukan dhclient -r eth0; dhclient eth0 . Formulir yang lebih pendek ini pertama-tama meminta penugasan ulang alamat IP saat ini, dan kemudian memulai negosiasi dengan router hanya jika ini tidak dapat menetapkan alamat IP yang diminta, baik karena sudah diambil atau karena berada di luar jangkauan DHCP gateway.

Saya sarankan Anda menggunakan flag -v sehingga Anda dapat melihat pertukaran ini, itu cukup eksplisit.

Adapun poin ketiga Anda, ada AFAIK tidak ada opsi lari-kering untuk klien dhcp. Jika Anda benar-benar bersikeras akan hal itu, Anda dapat melakukan hal berikut: mengatur antarmuka macvlan , dan memulai instance dhcp untuk antarmuka baru ini:

ip addr flush dev eth0
ip link add link eth0 mac0 mode macvlan
dhclient -v mac0

Pada titik ini, Anda dapat melihat konfigurasi yang disediakan oleh server DHCP lokal, jaringan, netmask, gateway dan server DNS pada antarmuka virtual baru . Ketika kamu selesai,

ip link del dev mac0
dhclient -v eth0

akan mengembalikan persis konfigurasi yang Anda miliki sebelumnya, jika server DHCP dapat hidangan keluar alamat IP lama Anda. Kalau tidak, Anda akan terjebak dengan yang baru ;-). Semua ini sepele untuk skrip, sungguh.

Dan, BTW, jika masalah Anda adalah masih adanya koneksi ssh , saya sarankan Anda memeriksa mosh sebagai gantinya.

MariusMatutiae
sumber
Terima kasih atas jawaban yang bagus dan komprehensif ini! Agak membingungkan bahwa perubahan perilaku dhclient hanya dengan menambahkan -v flag, tapi ini persis apa yang saya butuhkan. Dan btw, ini bukan tentang ssh, tapi saya senang Anda menyebutkan mosh. Ini tampaknya menjadi proyek yang menarik.
philipp
@philipp Maaf telah membawa Anda ke dalam kesalahan: dhclient mengubah perilaku ketika Anda menjatuhkan flag -r ; yang -v bendera hanya menampilkan negosiasi. Ketika Anda melakukan dhclient -r eth0 ,; dhclient eth0 doa kedua tidak dapat meminta sewa alamat IP lamanya, karena Anda baru saja melepaskannya.
MariusMatutiae
Terima kasih: memang tidak ada perbedaan, dan ini masih bukan solusi untuk masalah saya. Saya masih mendapatkan pesan "sudah berjalan" sebagian besar waktu, yang merupakan masalah root saya. Saya menambahkan ini ke pertanyaan saya
philipp
0

Solusi terbaik yang saya temukan sejauh ini adalah menggunakan implementasi dhcp find di python:

https://code.activestate.com/recipes/577649-dhcp-query/

Yang cukup bagus, karena saya sudah menggunakan python. Tapi mungkin saya masih kehilangan solusi sederhana dan ini semua terlalu rumit.

sunting: Ini tidak terlalu membantu. Masalah utama saya adalah bahwa proses latar belakang dhclient menempati port 68, yang mencegah proses lain yang melakukan penemuan DHCP, dan saya tidak tahu cara apa pun untuk membuat proses latar belakang membebaskannya tanpa menjatuhkan konfigurasi jaringan.

philipp
sumber