Iptables: "-p udp --state ESTABLISHED"

18

mari kita lihat dua aturan iptables yang sering digunakan untuk mengizinkan DNS keluar:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 
   -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

Pertanyaan saya adalah: Bagaimana tepatnya saya harus memahami kondisi ESTABLISHED di UDP? UDP tidak memiliki kewarganegaraan.

Inilah intuisi saya - Saya ingin tahu, apakah atau di mana ini salah:

Halaman manual memberitahu saya ini:

negara

Modul ini, ketika dikombinasikan dengan pelacakan koneksi, memungkinkan akses ke
status pelacakan koneksi untuk paket ini.

  - negara ...

Jadi, iptables pada dasarnya mengingat nomor port yang digunakan untuk paket keluar (apa lagi yang bisa diingat untuk paket UDP?) , Dan kemudian memungkinkan paket masuk pertama yang dikirim kembali dalam jangka waktu singkat? Seorang penyerang harus menebak nomor porta (apakah itu benar-benar terlalu sulit?)

Tentang menghindari konflik:

Kernel melacak port mana yang diblokir (baik oleh layanan lain, atau oleh paket UDP keluar sebelumnya), sehingga port ini tidak akan digunakan untuk paket DNS keluar baru dalam jangka waktu? (Apa yang akan terjadi, jika saya secara tidak sengaja mencoba memulai layanan pada port tersebut dalam jangka waktu - apakah upaya itu akan ditolak / diblokir?)

Temukan semua kesalahan dalam teks di atas :-) Terima kasih,

Chris

Chris Lercher
sumber

Jawaban:

12

Jadi, iptables pada dasarnya mengingat nomor port yang digunakan untuk paket keluar (apa lagi yang bisa diingat untuk paket UDP?),

Saya cukup yakin untuk UDP port sumber dan tujuan dan alamat disimpan.

Jika Anda ingin memeriksa tabel state instal conntrack dan / atau netstat-nat.

(Apa yang akan terjadi, jika saya secara tidak sengaja mencoba memulai layanan pada port tersebut dalam jangka waktu - apakah upaya itu akan ditolak / diblokir?)

Karena Anda menggunakan OUTPUT dan INPUT Anda berbicara tentang layanan lokal. Port sudah digunakan Saya tidak percaya sistem Anda akan memungkinkan Anda untuk memulai layanan lain karena sesuatu sudah mendengarkan pada port itu. Saya kira Anda dapat menghentikan layanan pertama dan memulai layanan lain jika Anda benar-benar ingin, dalam hal ini mungkin responsnya akan sampai ke layanan Anda. Apa yang dilakukan layanan dengan paket tergantung pada apa isi paket itu, dan layanan apa itu.

Sakit kepala
sumber
Jadi jika saya mulai mengatakan instance Tomcat pada port 8080, saya akan memiliki peluang 1: (65535-1023) bahwa startup akan gagal, jika secara tidak sengaja query DNS dijalankan pada port yang sama? Atau hanya menunggu sampai jangka waktu berakhir? Berapa lama jangka waktunya secara default?
Chris Lercher
6
Di Linux saya percaya kisaran port ephemeral umumnya 32768-61000 (lihat / proc / sys / net / ipv4 / ip_local_port_range) ini tidak termasuk port contoh 8080 Anda. Ini cenderung sangat tidak umum untuk menyiapkan layanan untuk mendengarkan port dalam rentang fana. Waktu yang dinyatakan oleh entri UDP dalam tabel biasanya adalah 30 detik (lihat / proc / sys / net / netfilter / nf_conntrack_udp_timeout)
Zoredache
2
+1 Terima kasih, terutama untuk jalur / proc!
Chris Lercher
1
Jika ada yang ingin memperpanjang udp_timeout, gunakanecho "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran
8

NB: Jawaban ini telah diedit.

Terlepas dari apa yang dikatakan halaman manual, ESTABLISHED tampaknya berarti "stateful". Untuk UDP yang berarti (seperti yang Anda sarankan) mengingat setiap paket UDP keluar ("src ip, src port dst ip, dst port" tuple) untuk sementara waktu dan mengenali responsnya.

FWIW, aturan normal saya untuk lalu lintas DNS akan seperti ini:

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

yaitu mengontrol lalu lintas pada OUTPUTrantai, dan kemudian membiarkan iptablesmodul negara menangani semua yang lain diINPUT rantai.

Lihat juga pertanyaan terkait ini .

Alnitak
sumber
1
Saya sadar bahwa saya juga harus mengizinkan TCP. Tapi apa artinya RELATED untuk UDP? Manpage: "BERHUBUNGAN artinya paket memulai koneksi baru, tetapi dikaitkan dengan koneksi yang ada, ..." Koneksi untuk UDP? Mungkin itu benar-benar lebih masuk akal daripada DIDIRIKAN, tetapi itulah yang ingin saya cari tahu.
Chris Lercher
Saat saya menggunakan aturan Anda, tetapi batasi INPUT udp menjadi TERKAIT, kueri DNS saya tidak berfungsi. Sepertinya saya harus mengizinkan ESTABLISHED. Apakah ada alasan untuk mengizinkan RELATED (untuk UDP)?
Chris Lercher
ok, sepertinya DIDIRIKAN berarti lebih dari yang dikatakan halaman manual. Bagaimanapun, jika Anda menggunakan filter OUTPUT seperti milik saya dan tidak menerima lalu lintas inbonud maka aturan INPUT adalah satu-satunya yang Anda perlukan.
Alnitak
1
Mengingat apa yang kami temukan, paket udp terkait tidak ada AFAIK. Namun (misalnya) jika Anda pernah melakukan FTP keluar dari kotak itu, Anda memerlukan aturan keadaan TERKAIT untuk saluran data. Aturan tunggal "ESTABLISHED, RELATED" adalah AFAIK aturan tunggal paling optimal untuk masuknya lalu lintas.
Alnitak
1
sebenarnya, RELATEDpaket UDP mungkin ada untuk RTP.
Alnitak
1

Pengembang iptables telah mempertimbangkan bahwa keadaan "ESTABLISHED" adalah situasi ketika paket telah dilihat di kedua arah, apa pun protokol antara dua klien.

ekstensi state adalah bagian dari conntrack. Kernel memahami status dari tabel

/proc/net/nf_conntrack

Contoh status iptable untuk UDP di tabel nf_conntrack dari sudut pandang pengirim. Bayangkan Anda mengirim permintaan DNS pada UDP

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Paket telah dikirim. Tidak dibalas dan oh, tabel memiliki data untuk apa yang diharapkan sebagai balasan (paket untuk jawaban DNS).

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Jawabannya telah tiba, bendera yang tidak dibalas hilang, itu berarti koneksi UDP ini dalam keadaan ESTABLISHED untuk sejumlah kecil waktu yang ditentukan dalam sistem Anda.

Nicolas Guérinet
sumber