TOLAKAN vs DROP saat menggunakan iptables

89

Apakah ada alasan mengapa saya ingin memilikinya

iptables -A INPUT -j REJECT

dari pada

iptables -A INPUT -j DROP
Mike B
sumber

Jawaban:

79

Sebagai aturan umum, gunakan TOLAKAN ketika Anda ingin ujung lainnya mengetahui port tidak dapat dijangkau - gunakan DROP untuk koneksi ke host yang tidak Anda inginkan dilihat orang.

Biasanya, semua aturan untuk koneksi di dalam LAN Anda harus menggunakan TOLAK. Untuk Internet, Dengan pengecualian ident pada server tertentu, koneksi dari Internet biasanya DROPPED.

Menggunakan DROP membuat koneksi tampak ke alamat IP yang tidak dihuni. Pemindai dapat memilih untuk tidak melanjutkan memindai alamat yang tampak kosong. Mengingat bahwa NAT dapat digunakan untuk mengalihkan koneksi pada firewall, keberadaan layanan yang terkenal tidak selalu menunjukkan keberadaan server pada alamat.

Ident harus dilewatkan atau ditolak pada alamat apa pun yang menyediakan layanan SMTP. Namun, penggunaan Ident look-up oleh SMTP serve sudah tidak digunakan lagi. Ada protokol obrolan yang juga mengandalkan layanan identitas yang berfungsi.

EDIT: Saat menggunakan aturan DROP: - Paket UDP akan dihapus dan perilaku akan sama dengan menghubungkan ke port yang tidak disembunyikan tanpa layanan. - Paket TCP akan mengembalikan ACK / RST yang merupakan respons yang sama yang akan ditanggapi oleh port terbuka tanpa layanan. Beberapa router akan merespons dengan dan ACK / RST atas nama server yang sedang down.

Saat menggunakan aturan TOLAK, paket ICMP dikirim yang mengindikasikan port tidak tersedia.

BillThor
sumber
5
Ini tidak benar. Bahkan ketika aturan mengatakan "DROP" sistem masih akan membalas paket yang masuk dengan TCP SYN / ACK seolah-olah itu terbuka. Untuk benar-benar menjatuhkan paket, sistem perlu membalas dengan TCP RST / ACK - yang tidak ada aturan firewall. Dengan demikian, pengaturan firewall terbaik adalah di mana hanya port yang dipilih diteruskan. Aturan DROP Anda akan mengiklankan firewall Anda dan port-scanners akan tahu bahwa Anda membuat firewall sesuatu dan terus memalu Anda dengan harapan akan menangkap firewall Anda.
Dagelf
2
Maksud saya adalah, dapat dideteksi dari luar apakah Anda melakukan firewall sesuatu atau tidak karena fakta bahwa TCP stack Anda berperilaku berbeda ketika Anda DROP daripada ketika Anda tidak memiliki layanan yang berjalan di tempat pertama!
Dagelf
2
Tidak mengubah fakta bahwa ada botnet memanfaatkan perbedaan dan memantau port Anda sebagai konsekuensinya.
Dagelf
1
apa pun yang Anda lakukan, konsistenlah. jika penyerang mengambil nomor port yang tidak digunakan dan mencoba untuk terhubung, ia harus mendapatkan respons yang sama seperti jika ia telah memilih nomor yang sengaja Anda blokir. memberi respons berbeda mengatakan kepadanya bahwa ada sesuatu di sana. mis. dia dapat menggunakan purtnumber yang memberikan respons berbeda untuk menentukan server database mana yang Anda gunakan, ia dapat menyesuaikan injeksi SQL ke server itu ...
user313114
5
@Dagelf di mana Anda mendapatkan informasi yang DROP kirim respons? Itu berita besar dan bertentangan dengan semua yang telah saya amati dan diberitahu. Apakah Anda memiliki tautan ke dokumentasi yang menjelaskan perilaku ini?
Score_Di Bawah
27

Perbedaannya adalah bahwa target REJECT mengirimkan respons tolak ke sumber, sementara target DROP tidak mengirim apa pun.

Ini dapat bermanfaat misalnya untuk layanan ident. Jika Anda menggunakan TOLAK maka klien tidak perlu menunggu waktu habis.

Lebih lanjut tentang ini: http://www.linuxtopia.org/Linux_Firewall_iptables/x4550.html

Zizzencs
sumber
2
Target DROP tidak mengirim apa pun. Periksa komentar saya pada jawaban yang diterima dan teliti sendiri topiknya jika Anda tertarik dengan perinciannya!
Dagelf
8

Biasanya, Anda ingin mengabaikan probe dari penyerang ke port tertentu, yang saya maksudkan Anda tidak ingin mengirim kembali 'koneksi ditolak'. 'Sambungan ditolak' berarti: 'ada server di sini', dan mungkin memberikan lebih banyak informasi, sedangkan menjatuhkan paket tidak memberikan petunjuk tentang versi perangkat lunak, kemungkinan kerentanan atau bahkan fakta bahwa server mendengarkan IP Anda.

Di atas adalah salah satu alasan utama untuk menggunakan DROP bukan TOLAK.

wzzrd
sumber
6
Tanpa aturan iptables, port tertutup akan default untuk MENOLAK. Jika Anda DROP setiap port, itu adalah alternatif yang bagus (host Anda muncul di bawah) tetapi jika Anda DROP hanya port tertentu Anda benar-benar memberi mereka lebih banyak informasi daripada MENOLAK. Jika seseorang menggunakan probe selimut seperti nmap, port spesifik yang menjatuhkan paket akan muncul sebagai "difilter", yang berarti mereka tahu Anda memiliki layanan di sana yang Anda sembunyikan.
Raptor007
7

Saya melihat banyak jawaban yang saling bertentangan di sini dan mengingat ini adalah artikel pertama di Google dengan kata kunci yang tepat; ini penjelasan yang benar.
Sederhana:

DROP tidak melakukan apa-apa dengan paket. Itu tidak diteruskan ke tuan rumah, itu tidak dijawab. Halaman manual dari IPtables mengatakan ia menjatuhkan paket ke lantai, artinya ia tidak melakukan apa-apa dengan paket tersebut.

TOLAKAN berbeda dengan DROP yang mengirim paket kembali, tetapi jawabannya adalah seolah-olah server terletak pada IP, tetapi tidak memiliki port dalam keadaan mendengarkan. IPtables akan mengirim RST / ACK jika ada TCP atau dengan UDP port tujuan ICMP tidak dapat dijangkau.

Ecko
sumber
2
+1 dari saya, tetapi jawabannya tidak benar-benar tidak setuju. Mereka semua setuju, sejauh yang saya bisa lihat, kecuali untuk Dagelf - siapa yang salah.
MadHatter
Oke, berikut ini sedikit trik untuk Anda: lakukan "nmap localhost". Sekarang pilih port yang bukan "terbuka" ... dan tambahkan aturan yang "tidak melakukan apa-apa", misalnya: "iptables -I INPUT -p tcp --dport 888 -j DROP". Sekarang "nmap localhost" lagi. Apa yang kamu lihat? ...
Dagelf
4

Jika Anda mencoba untuk menyembunyikan keberadaan mesin Anda sepenuhnya, -j DROPitu tepat. Misalnya, Anda dapat menggunakan ini untuk menerapkan daftar hitam.

Jika Anda mencoba menyembunyikan fakta bahwa port terbuka, Anda harus meniru perilaku yang akan terjadi jika port tidak terbuka:

  • TCP: -p tcp -j REJECT --reject-with tcp-reset
  • UDP: -p udp -j REJECT --reject-with icmp-port-unreachable

Jika pemindai port melihat bahwa beberapa port menjatuhkan paket sementara sebagian besar menolaknya, itu dapat mengasumsikan paket yang dijatuhkan berada pada port yang terbuka tapi tersembunyi.

Raptor007
sumber
Bagaimana jika Anda membuka beberapa port (mis. 22, 25, 53, 80, 443) dan kemudian DROP yang lainnya? Sekarang apakah saya memiliki MySQL, PostgreSQL, SQLite, atau Cassandra berjalan ... pemindai tidak tahu, kan?
Alexis Wilke
@AlexisWilke Dalam kasus itu, satu-satunya informasi tambahan yang Anda berikan pada pemindai port adalah bahwa Anda memiliki semacam firewall dengan kebijakan DROP default.
Raptor007
0

Meskipun banyak jawaban yang benar, hanya dua sen saya:

Berikut ini adalah PoC FW.IDS-DROP-vs-REJECT saya tentang masalah ini sehubungan dengan aturan untuk sistem larangan (firewall, IDS, dll).

Segera:

  • DROP dapat digunakan untuk penyusup residen, jika melarang semua port (jadi sepertinya server turun di sisi penyusup)
  • REJECT --reject-with tcp-reset adalah pilihan terbaik untuk pelarangan multi-port, karena tampaknya berperilaku sebagai port tertutup nyata
  • jika beberapa port menjawab (penyusup tahu bahwa tuan rumah masih hidup), DROPdan REJECT(tanpa tcp-reset) akan memberi "sinyal" kepada penyusup bahwa ada sesuatu yang menghalangi (sehingga dapat merangsang dia untuk melanjutkan "serangan" dengan harapan dapat menyediakan data yang diperlukan) dalam beberapa kasus)
sebres
sumber
-5

Ya, menggunakan DROP tidak ada gunanya. Gunakan TOLAKAN.

Bahkan ketika aturan mengatakan "DROP" sistem masih membalas ke SYN yang masuk dengan TCP RST / ACK - yang merupakan perilaku default untuk port tanpa layanan yang berjalan. (tcpdump et al tidak mencatat ini.)

Jika suatu layanan berjalan, SYN bertemu dengan TCP SYN / ACK.

Karena DROP tidak merespons seperti biasa dengan TCP SYN / ACK, tetapi dengan RST / ACK sebagai gantinya, aturan DROP Anda akan mengiklankan firewall Anda dan port-scanner akan tahu bahwa Anda sedang melakukan firewall sesuatu dan mungkin terus memalu Anda dengan harapan menangkap firewall Anda.

Ini sekarang nmap dapat melaporkan "difilter" bukannya "ditutup" misalnya:

$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -I INPUT -p tcp --dport 1111 -j DROP
$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http
1111/tcp filtered lmsocialserver

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -D INPUT 1

Dengan demikian, satu-satunya pengaturan firewall "tidak terlihat" adalah di mana perangkat khusus duduk di antara perangkat Anda dan hanya secara selangkah memajukan porta.

Jika Anda benar-benar ingin mengacaukan pemindai dasar, Anda bisa TARPIT koneksi tcp, yang mengatur TCP Window ke 0 sehingga tidak ada data yang dapat ditransfer setelah koneksi dibuka, mengabaikan permintaan untuk menutup koneksi, artinya pemindai harus menunggu untuk waktu habis koneksi terjadi, jika ingin memastikan. Tapi itu sepele bagi penyerang untuk mendeteksi ini dan membuat waktu tunggu sangat singkat.

Semua hal dipertimbangkan, Anda mungkin lebih baik menggunakan REJECT - atau meletakkan perangkat port forwarding khusus antara server Anda dan internet.

Atau hanya menjalankan layanan di mesin Anda yang menghadapi internet yang tidak memerlukan firewall.

Umumnya REJECT adalah yang terbaik untuk server web, karena layanan apa pun yang mencoba mengaksesnya (mungkin lebih sering daripada tidak, Anda) akan dengan cepat mendapatkan respons dan pengguna atau layanan lain tidak akan terus menunggu bertanya-tanya apakah ada pemadaman jaringan.

Dagelf
sumber
5
Jawaban ini salah. Dapat dengan mudah ditampilkan dengan tcpdump bahwa aturan DROP akan mengakibatkan sistem tidak mengirim jawaban APAPUN - seperti yang diharapkan. Dan pernyataan Anda "Untuk benar-benar menjatuhkan paket, sistem perlu membalas dengan TCP RST / ACK" tidak masuk akal karena membalas apa pun jelas tidak "benar-benar menjatuhkan paket". Jika Anda "benar-benar menjatuhkan" sebuah paket, Anda tidak menjawab dan ini jelas merupakan efek dari aturan DROP.
Juliane Holzt
3
Bisakah Anda memberikan sumber untuk dugaan yang DROPakan mengeluarkan SYN/ACK? Saya tidak pernah melihat ini di komputer saya.
motobói
2
@Dagelf Artikel Anda mengatakan, "JATUHKAN (alias MENYANGKAL, BLACKHOLE). Melarang paket lewat. Kirim tidak ada respons."
JeanT
Itu tidak mengirim respons normal, tetapi mengirim satu seperti yang dijelaskan, terlepas.
Dagelf
3
Dokumen yang Anda tautkan bertuliskan " DROP ... Send no response ", dan sejauh yang saya lihat, tidak mendukung klaim Anda yang DROPmengembalikan a SYN/ACK. Saya juga belum pernah melihat perilaku ini dalam versi apa pun iptables. Jika Anda memiliki sumber yang mendukung klaim Anda, akan sangat berguna untuk melihatnya; tentu saja, paket dump yang baru saja saya lakukan tidak mendukung klaim Anda.
MadHatter