Mengapa saya tidak bisa menggunakan kebijakan TOLAK pada rantai OUTPUT iptables saya?

11

Saat ini saya memiliki rantai OUTPUT saya yang diatur ke DROP. Saya ingin mengubahnya menjadi TOLAK, sehingga saya memiliki petunjuk bahwa firewall saya menghentikan saya untuk mendapatkan suatu tempat daripada masalah dengan layanan apa pun yang saya coba akses (langsung menolak alih-alih waktu habis). Namun, iptables sepertinya tidak peduli dengan ini. Jika saya mengedit file aturan tersimpan saya secara manual dan mencoba mengembalikannya, saya mendapatkannya iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy namedan menolak memuat aturan. Jika saya mencoba untuk mengatur ini secara manual ( iptables -P OUTPUT REJECT), saya mendapatkan iptables: Bad policy name. Run 'dmesg' for more information.tetapi tidak ada output di dmesg.

Saya telah mengkonfirmasi aturan yang sesuai dikompilasi ke dalam kernel dan saya telah reboot untuk memastikan itu dimuat:

# CONFIG_IP_NF_MATCH_TTL is not set
CONFIG_IP_NF_FILTER=y
***
CONFIG_IP_NF_TARGET_REJECT=y
***
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y

(Tanda bintang ditambahkan untuk menyoroti aturan yang berlaku)

Segala sesuatu yang saya dapat temukan menyatakan bahwa TOLAK adalah kebijakan / target yang valid (secara umum), tetapi saya tidak dapat menemukan apa pun yang mengatakan itu tidak valid untuk rantai INPUT, FORWARD, atau OUTPUT. Google-fu saya tidak membantu. Saya menggunakan Gentoo, jika itu ada bedanya. Adakah yang punya wawasan di sini?

ND Geek
sumber
Bisakah Anda menunjukkan iptablesaturan yang dipermasalahkan?
bahamat

Jawaban:

15

REJECTadalah ekstensi target , sedangkan kebijakan berantai harus menjadi target . Halaman manual mengatakan bahwa (meskipun tidak benar-benar jelas), tetapi beberapa dari apa yang dikatakannya salah.

Kebijakan hanya dapat ACCEPTatau DROPpada rantai bawaan. Jika Anda ingin efek menolak semua paket yang tidak cocok dengan aturan sebelumnya, pastikan aturan terakhir cocok dengan semua dan menambahkan aturan dengan REJECTekstensi target. Dengan kata lain, setelah menambahkan semua aturan yang relevan, lakukan iptables -t filter -A OUTPUT -j REJECT.

Lihat utas "apa kebijakan rantai yang mungkin" pada daftar netfilter untuk lebih jelasnya.

Shawn J. Goff
sumber
Itu masuk akal, dan REJECT generik pada akhirnya harus bekerja. Karena penasaran, apakah definisi ekstensi target di suatu tempat cukup jelas dan saya hanya melewatkannya, atau apakah itu salah satu bit yang kurang terdokumentasi?
ND Geek
1
Membaca halaman manual keseluruhan, jelas bahwa TOLAK adalah ekstensi target, tetapi halaman manual sangat panjang sehingga "TL; DR" cenderung berlaku. Ini juga menyiratkan bahwa DROP, ACCEPT dan QUEUE adalah target kebijakan yang valid; dari kode saat ini, QUEUE bukan!
StarNamer
4

Saya tidak dapat menemukannya didokumentasikan, tetapi referensi di sini menunjukkan bahwa satu-satunya kebijakan yang diizinkan adalah ACCEPT atau DROP. Hal ini ditegaskan dengan melihat sumber dari libiptc(yang bertanggung jawab untuk memanipulasi aturan) sekitar garis 2429, di mana kode memiliki

2429         if (strcmp(policy, LABEL_ACCEPT) == 0)
2430                 c->verdict = -NF_ACCEPT - 1;
2431         else if (strcmp(policy, LABEL_DROP) == 0)
2432                 c->verdict = -NF_DROP - 1;
2433         else {
2434                 errno = EINVAL;
2435                 return 0;
2436         }

Utas asli menyarankan hal terbaik yang harus dilakukan adalah menambahkan TOLAK di akhir rantai yang seharusnya iptables -A OUTPUT -j REJECT.

Perhatikan bahwa kode sebelum ini adalah:

2423         if (!iptcc_is_builtin(c)) {
2424                 DEBUGP("cannot set policy of userdefinedchain `%s'\n", chain);
2425                 errno = ENOENT;
2426                 return 0;
2427         }
2428 

Jadi, Anda tidak dapat menetapkan kebijakan pada rantai yang Ditetapkan Pengguna sama sekali.

StarNamer
sumber
Perintah di utas itu salah; -puntuk mencocokkan protokol; maksudnya -Aseperti jawaban saya mengatakan.
Shawn J. Goff
Cukup menarik. Keingintahuan dalam diri saya bertanya-tanya apakah ada alasan di baliknya, atau jika memang begitulah adanya, mungkin demi kesederhanaan (kode yang lebih sederhana berarti lebih sedikit tempat yang memungkinkan untuk kerentanan). Jika saya bahkan seorang pengembang moderat saya mungkin tergoda untuk meretasnya secara lokal, tetapi karena saya tidak, dan mengingat itu adalah bagian dari keamanan, saya tidak akan menyentuhnya.
ND Geek
2

REJECTpada OUTPUTtidak masuk akal; a REJECTakan mengembalikan paket ICMP yang perlu melintasi jaringan.

Tambahkan baru -j LOGsebagai aturan terakhir Anda (karena itu sebelum DROPkebijakan) untuk melihat apa yang sejauh ini dalam OUTPUTrantai.

Aaron D. Marasco
sumber
1
Tidak bisakah REJECTpaket ICMP kembali pada antarmuka lo? Saya setuju bahwa a LOGberguna untuk pemecahan masalah, tetapi apa yang saya benar-benar harapkan adalah cara untuk mengingatkan saya bahwa "Oh, ya ... itu mungkin diblokir oleh DROPiptables default saya " daripada memecahkan masalah selama 5 menit meminta rekan kerja untuk akses server XYZ menyadari itu mungkin lokal , yang merupakan pendekatan saya yang paling umum, karena hari kerja saya yang biasa jarang mengenai hal-hal yang belum pernah saya buka sebelumnya. Tentu saja mungkin saya perlu mengingatnya dengan lebih baik, tetapi flat REJECTlebih jelas.
ND Geek
Saya tidak berpikir Anda ingin ethXantarmuka untuk menghasilkan lalu lintas di loantarmuka karena berbagai alasan. Mereka sangat mandiri; Anda dapat dengan mudah membuat rantai berlaku untuk yang satu dan bukan yang lain.
Aaron D. Marasco