Di utas saya yang lain, saya berbicara tentang beberapa hal menarik tentang kebijakan dan status iptables , sekarang saya ingin lebih memahami tentang cara kerja DHCP dan bagaimana iptables memahaminya.
ETH0 terhubung ke saklar utama saya yang menerima ip dinamis dari router saya untuk mendapatkan tidak hanya akses internet tetapi juga akses ke jaringan luar saya.
ETH1 adalah kartu internal yang terhubung ke sakelar internal tempat klien X menerima IPS mereka dari server ini
Jaringan ETH1 adalah 192.168.1.0/255.255.255.0 di mana ip server adalah 192.168.1.254.
Dari apa yang saya mengerti, dhcp adalah protokol bootp jadi bahkan jika Anda memiliki kebijakan firewall untuk MENGURANGI segalanya, jaringan Anda akan tetap menerima DHCP, yang dalam tes yang saya buat sepertinya benar.
Dari tcpdump:
root@test:~# tcpdump -i eth1 port 67 or 68
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:34:03.943928 IP 192.168.1.2.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:29:52:8b (oui Unknown), length 303
11:34:03.957647 IP 192.168.1.254.bootps > 192.168.1.2.bootpc: BOOTP/DHCP, Reply, length 300
11:34:06.492153 IP 192.168.1.2.bootpc > 192.168.1.254.bootps: BOOTP/DHCP, Request from 00:0c:29:29:52:8b (oui Unknown), length 303
11:34:06.506593 IP 192.168.1.254.bootps > 192.168.1.2.bootpc: BOOTP/DHCP, Reply, length 300
Saya membuat aturan log sederhana untuk melihat apa yang iptables lakukan:
root@test:~# tail -f /var/log/syslog
Oct 15 11:30:58 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9527 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:31:43 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9529 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:33:32 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9531 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:34:03 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9533 PROTO=UDP SPT=68 DPT=67 LEN=311
Ini aturan iptables saya di momment:
# deny all traffic
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Use stateful inspection feature to only allow incoming connections
# related to connections I have already established myself
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# allow all traffic on lo interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
Jadi, bahkan dengan KEBIJAKAN standar untuk menghapus semua hal, saya masih mendapatkan DHCP di jaringan saya sementara itu membutuhkan waktu lebih lama untuk memperbarui IP dan semacamnya.
Jika saya menambahkan aturan ikuti ke firewall saya:
$IPT -I OUTPUT -o $INTIF -p udp --dport 67:68 --sport 67:68 -j ACCEPT
Dibutuhkan BANYAK WAKTU KURANG untuk memperbarui klien dhcp.
Mempertimbangkan hal di atas:
- mengapa memang butuh waktu lebih lama untuk memperbaruinya bahkan jika tidak diblokir?
- apakah mungkin untuk DROP server dhcp sama sekali tanpa mematikannya?
- apakah mungkin untuk MENERIMA server dhcp di dalam iptables dengan BOOTP? bagaimana itu dilakukan?
Jika Anda tahu tautan bagus, saya tidak akan keberatan mengambil banyak :)
Are you monitoring the network interface in promiscuous mode
saya masih belajar ...Jawaban:
Saya akan menjawab # 2: Tidak.
Ketika mendapatkan alamat IP, daemon dhcp membuat socket mentah ke antarmuka jaringan dan menangani protokol UDP itu sendiri. Dengan demikian paket UDP tidak pernah melalui iptables.
Alasan daemon dhcp harus mengimplementasikan UDP adalah karena kernel hanya dapat menangani UDP (sebenarnya semua TCP / IP suite) ketika antarmuka memiliki alamat IP. Daemon dhcp sebelumnya akan memberikan antarmuka alamat IP 0,0.0.0 tetapi itu tidak lagi berfungsi.
sumber
Menambahkan
harus membuat pembaruan DHCPD lebih cepat :) Ini akan berfungsi baik sisi INPUT dan OUTPUT. Anda dapat DROP dhcpd dengan ebtables, bukan dengan iptables. Mendengarkan DHCPD pada 0.0.0.0, tidak dalam IP
sumber
Pengamatan saya baru-baru ini, di OpenWRT Kamikaze 7.09 = 2.4.34 dan udhcpc dari busybox 1.4.2:
Saya memiliki kebijakan "MENERIMA" dalam rantai OUTPUT, dan ke arah INPUT, awalnya saya mengandalkan aturan klasik tangkap-semua ini:
untuk memungkinkan tanggapan DHCP di (ke udhcpc saya) pada antarmuka WAN. Yaitu, ini adalah di mana server DHCP upstream ISP saya memberikan Alamat IP kepada saya.
Pikirkan perbedaan antara pertukaran DHCP awal (temukan, tawarkan, minta, ACK) dan perpanjangan sewa DHCP (permintaan, ACK).
Setelah boot, udhcpc dimulai dengan pertukaran awal penuh. Pertukaran itu akan berhasil. Dan satu atau dua pembaruan lagi akan berhasil juga - hanya permintaan dan pengakuan. Server DHCP ISP saya biasanya meminta waktu pembaruan sekitar satu jam hingga 1,5 jam, sehingga klien DHCP saya meminta pembaruan setiap 30 hingga 45 menit (perilaku ini didasarkan pada RFC).
Tapi, tentang pembaruan ketiga atau keempat, itu akan mulai menarik. TCPdump akan menunjukkan sekitar tiga upaya pembaruan, diikuti oleh pertukaran awal penuh - yang dalam rentang waktu hanya beberapa menit atau bahkan detik. Seolah udhcpc tidak suka apa yang dikembalikan :-( dan akhirnya akan puas dengan pertukaran penuh. Setelah itu, pembaruan lain dalam setengah jam akan berhasil ... dan cerita akan terulang lagi.
Saya menemukan, bahwa mungkin pelacakan koneksi di kernel yang salah. Seolah-olah entri conntrack berakhir setelah dua jam atau lebih, dan pembaruan DHCP kemudian gagal karena ACK dari server tidak benar-benar membuatnya menjadi udhcpc mendengarkan pada socket. Perhatikan bahwa tcpdump (libpcap) mendengarkan pada antarmuka mentah dan dapat melihat semua paket masuk, sebelum mereka tunduk pada iptables. Setelah udhcpc menyerah pembaruan dan, putus asa, mencoba memulai dari awal menggunakan pertukaran penuh (dimulai dengan DISCOVER), kernel membuat entri conntrack baru dan dapat memahami paket-paket terkait untuk beberapa waktu lagi ...
Benar saja, begitu saya menambahkan sesuatu seperti:
pembaruan tampaknya bekerja selamanya.
Anda mungkin menemukan tcpdump cmdline args berikut berguna:
Catatan: permintaan
-vv
untuk keluaran verbose dissector.eth0.1
adalah port WAN saya (juga antarmuka "NAT luar").Atribut yang menarik dalam paket ACK adalah bidang LT: = disarankan / waktu sewa maksimum yang diberikan dalam detik. Permintaan DHCP dikirim dari port 68 ke port 67. Respons datang dari port 67 ke port 68.
sumber
openwrt:68 -> dhcpserver:67
dan ACK akandhcpserver:67 -> openwrt:68
. Ini dianggap sebagai DIDIRIKAN dan akan berlalu. Jika keadaan conntrack lama kedaluwarsa, ini menetapkan yang baru. Jika ada masalah, itu hanya bisa dengan pertukaran awal seperti DISCOVER0.0.0.0:68 -> 255.255.255.255:67
dan PENAWARAN akandhcpserver:67 -> new-openwrt:68
, yang tidak dihitung sebagai DIDIRIKAN. Ini hanya berfungsi karena DHCP biasanya mem-bypass iptables dengan soket paket di Linux, jika tidak diperlukan aturan masuk yang memungkinkan paket dari port UDP 67 atau ke port UDP 68.