REJECT กับ DROP เมื่อใช้ iptables


คำตอบ:


79

ตามกฎทั่วไปให้ใช้ REJECT เมื่อคุณต้องการให้อีกฝ่ายรู้ว่าพอร์ตไม่สามารถเข้าถึงได้ใช้ DROP สำหรับการเชื่อมต่อไปยังโฮสต์ที่คุณไม่ต้องการให้คนอื่นเห็น

โดยทั่วไปแล้วกฎทั้งหมดสำหรับการเชื่อมต่อภายใน LAN ของคุณควรใช้ REJECT สำหรับอินเทอร์เน็ตด้วยข้อยกเว้นของ ident บนเซิร์ฟเวอร์บางตัวการเชื่อมต่อจากอินเทอร์เน็ตมักจะ DROPPED

การใช้ DROP ทำให้การเชื่อมต่อดูเหมือนจะเป็นที่อยู่ IP ที่ว่างเปล่า สแกนเนอร์อาจเลือกที่จะไม่สแกนที่อยู่ซึ่งยังว่างอยู่ เนื่องจาก NAT สามารถใช้เพื่อเปลี่ยนเส้นทางการเชื่อมต่อบนไฟร์วอลล์การมีอยู่ของบริการที่รู้จักกันดีไม่จำเป็นต้องระบุถึงการมีอยู่ของเซิร์ฟเวอร์บนที่อยู่

รหัสผ่านควรถูกส่งผ่านหรือปฏิเสธในที่อยู่ใด ๆ ที่ให้บริการ SMTP อย่างไรก็ตามการใช้ Ident-ups-ups ค้นหาโดย SMTP ทำหน้าที่ได้ลดลงจากการใช้งาน มีโปรโตคอลการแชทซึ่งขึ้นอยู่กับบริการระบุการทำงาน

แก้ไข: เมื่อใช้กฎ DROP: - แพ็คเก็ต UDP จะลดลงและพฤติกรรมจะเหมือนกันกับการเชื่อมต่อกับพอร์ตที่ไม่มีกำแพงซึ่งไม่มีบริการ - แพ็คเก็ต TCP จะส่งคืน ACK / RST ซึ่งเป็นคำตอบเดียวกับที่พอร์ตเปิดที่ไม่มีบริการที่จะตอบกลับด้วย เราเตอร์บางตัวจะตอบสนองด้วยและ ACK / RST ในนามของเซิร์ฟเวอร์ที่ล่ม

เมื่อใช้กฎ REJECT จะมีการส่งแพ็คเก็ต ICMP เพื่อระบุว่าพอร์ตไม่พร้อมใช้งาน


5
นี่ไม่เป็นความจริง. แม้ว่ากฎบอกว่า "DROP" ระบบจะยังคงตอบกลับแพ็คเก็ตขาเข้าด้วย TCP SYN / ACK ราวกับว่าเปิดอยู่ ในการวางแพ็กเก็ตอย่างแท้จริงระบบจำเป็นต้องตอบกลับด้วย TCP RST / ACK - ซึ่งไม่มีกฎไฟร์วอลล์ ดังนั้นการตั้งค่าไฟร์วอลล์ที่ดีที่สุดจึงเป็นเพียงพอร์ตที่เลือกเท่านั้นที่จะถูกส่งต่อ กฎ DROP ของคุณจะโฆษณาไฟร์วอลล์และสแกนเนอร์พอร์ตของคุณจะรู้ว่าคุณกำลังไฟร์วอลล์บางสิ่งบางอย่างและยังคงตอกย้ำคุณในความหวังที่จะได้รับไฟร์วอลล์ของคุณ
Dagelf

2
ประเด็นของฉันคือมันสามารถตรวจจับได้จากภายนอกไม่ว่าคุณจะทำการไฟร์วอลล์บางสิ่งหรือไม่เนื่องจากข้อเท็จจริงที่ว่าสแต็ค TCP ของคุณทำงานแตกต่างกันเมื่อคุณ DROP ไม่ใช่เมื่อคุณไม่มีบริการที่ทำงานอยู่ในตอนแรก!
Dagelf

2
ไม่เปลี่ยนแปลงความจริงที่ว่ามี botnets ใช้ประโยชน์จากความแตกต่างและตรวจสอบพอร์ตของคุณเป็นผล
Dagelf

1
สิ่งที่คุณทำให้สอดคล้อง หากผู้โจมตีเลือกหมายเลขพอร์ตที่ไม่ได้ใช้และพยายามเชื่อมต่อเขาควรได้รับการตอบกลับเช่นเดียวกับถ้าเขาเลือกหมายเลขที่คุณบล็อกอย่างตั้งใจ การตอบสนองที่แตกต่างบอกเขาว่ามีบางอย่างอยู่ที่นั่น เช่นนั้นเขาสามารถใช้ purtnumber ที่ให้การตอบสนองที่แตกต่างกันเพื่อกำหนดเซิร์ฟเวอร์ฐานข้อมูลที่คุณใช้เขาสามารถปรับแต่งการฉีด SQL ไปยังเซิร์ฟเวอร์นั้น ...
user313114

5
@Dagelf คุณกำลังรับข้อมูลที่ DROP ส่งการตอบกลับที่ไหน? นั่นเป็นข่าวใหญ่และตอบโต้ทุกสิ่งที่ฉันสังเกตเห็นและได้รับการบอกเล่า คุณมีลิงค์ไปยังเอกสารที่อธิบายถึงพฤติกรรมนี้หรือไม่?
Score_ ต่ำกว่า

27

ความแตกต่างคือเป้าหมายของ REJECT จะส่งการตอบปฏิเสธไปยังแหล่งที่มาในขณะที่เป้าหมาย DROP จะไม่ส่งอะไร

สิ่งนี้มีประโยชน์เช่นสำหรับบริการ ident หากคุณใช้ REJECT ลูกค้าก็ไม่จำเป็นต้องรอให้หมดเวลา

เพิ่มเติมเกี่ยวกับสิ่งนี้: http://www.linuxtopia.org/Linux_Firewall_iptables/x4550.html


2
เป้าหมาย DROP ไม่ได้ส่งอะไรเลย ตรวจสอบความคิดเห็นของฉันเกี่ยวกับคำตอบที่ได้รับการยอมรับและไปค้นคว้าหัวข้อด้วยตัวคุณเองหากคุณสนใจในรายละเอียด!
Dagelf

8

โดยปกติแล้วคุณต้องการละเว้นโพรบจากผู้โจมตีไปยังพอร์ตบางแห่งซึ่งฉันหมายความว่าคุณไม่ต้องการส่ง 'การเชื่อมต่อปฏิเสธ' กลับคืน 'การเชื่อมต่อถูกปฏิเสธ' หมายถึง: 'มีเซิร์ฟเวอร์อยู่ที่นี่' และอาจให้ข้อมูลเพิ่มเติมในขณะที่การปล่อยแพ็คเก็ตไม่ได้ให้ข้อมูลเกี่ยวกับเวอร์ชั่นของซอฟต์แวร์ช่องโหว่ที่อาจเกิดขึ้นหรือแม้แต่ข้อเท็จจริงที่ว่าเซิร์ฟเวอร์กำลังฟังคุณอยู่

ข้างต้นเป็นหนึ่งในเหตุผลหลักที่ใช้ DROP แทนการปฏิเสธ


6
หากไม่มีกฎ iptables พอร์ตที่ปิดจะมีค่าเริ่มต้นเป็น REJECT หากคุณ DROP ทุกพอร์ตเป็นทางเลือกที่ดี (โฮสต์ของคุณจะปรากฏขึ้น) แต่ถ้าคุณ DROP เฉพาะพอร์ตที่เฉพาะเจาะจงคุณจะให้ข้อมูลมากกว่า REJECT หากมีคนใช้โพรบแบบครอบคลุมเช่น nmap พอร์ตเฉพาะที่วางแพ็กเก็ตจะปรากฏเป็น "ตัวกรอง" ซึ่งหมายความว่าพวกเขารู้ว่าคุณมีบริการที่คุณซ่อนอยู่
Raptor007

7

ฉันเห็นคำตอบที่ขัดแย้งกันมากมายที่นี่และเนื่องจากนี่เป็นบทความแรกใน Google ที่มีคำหลักที่เหมาะสม นี่คือคำอธิบายที่ถูกต้อง
ง่าย:

DROP ไม่ทำอะไรเลยกับแพ็คเก็ต มันไม่ได้รับการส่งต่อไปยังโฮสต์มันไม่ได้รับคำตอบ manpage ของ IPtables บอกว่ามันลดแพ็กเก็ตลงบนพื้นนั่นคือไม่ทำอะไรเลยกับแพ็กเก็ต

REJECT นั้นแตกต่างจาก DROP ที่มันส่งแพ็กเก็ตกลับมา แต่คำตอบนั้นเหมือนกับว่าเซิร์ฟเวอร์ตั้งอยู่บน IP แต่ไม่มีพอร์ตในสถานะฟัง IPtables จะส่ง RST / ACK ในกรณีของ TCP หรือกับ UDP และพอร์ต ICMP ปลายทางไม่สามารถเข้าถึงได้


2
+1 จากฉัน แต่คำตอบไม่เห็นด้วยจริงๆ ทุกคนเห็นด้วยเท่าที่ฉันเห็นยกเว้นดาเกล - ใครผิด
MadHatter

โอเคต่อไปนี้เป็นเคล็ดลับเล็กน้อยสำหรับคุณ: ทำ "nmap localhost" ตอนนี้เลือกพอร์ตที่ไม่ใช่ "เปิด" ... และเพิ่มกฎที่ "ไม่ทำอะไรเลย" เช่น: "iptables -I INPUT -p tcp --dport 888 -j DROP" ตอนนี้ "nmap localhost" อีกครั้ง คุณเห็นอะไร? ...
Dagelf

4

ถ้าคุณกำลังพยายามที่จะซ่อนการดำรงอยู่ของเครื่องทั้งหมด-j DROPมีความเหมาะสม ตัวอย่างเช่นคุณอาจใช้สิ่งนี้เพื่อใช้บัญชีดำ

หากคุณพยายามซ่อนความจริงที่ว่าพอร์ตเปิดอยู่คุณควรเลียนแบบพฤติกรรมที่จะเกิดขึ้นหากพอร์ตไม่ได้เปิดอยู่:

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

หากเครื่องสแกนพอร์ตเห็นว่ามีกี่พอร์ตกำลังทิ้งแพ็กเก็ตในขณะที่ส่วนใหญ่ปฏิเสธพวกเขามันสามารถสันนิษฐานได้ว่าแพ็กเก็ตที่หลุดนั้นอยู่บนพอร์ตที่เปิดอยู่ แต่ซ่อนอยู่


ถ้าคุณเปิดพอร์ตไม่กี่พอร์ต (เช่น 22, 25, 53, 80, 443) แล้วปล่อยทุกอย่างอื่น ตอนนี้ไม่ว่าฉันจะมี MySQL, PostgreSQL, SQLite หรือ Cassandra ทำงานอยู่ ... สแกนเนอร์ไม่สามารถบอกได้ใช่มั้ย
Alexis Wilke

@AlexisWilke ในกรณีนั้นข้อมูลเพิ่มเติมเพียงอย่างเดียวที่คุณให้กับเครื่องสแกนพอร์ตคือคุณมีไฟร์วอลล์บางประเภทที่มีนโยบาย DROP เริ่มต้น
Raptor007

0

แม้จะมีคำตอบที่ถูกต้องมากมายเพียงสองเซ็นต์ของฉัน:

นี่คือ PoC FW.IDS -DROP-vs-REJECTของฉันที่มีเนื้อหาเกี่ยวกับกฎสำหรับระบบแบน (ไฟร์วอลล์, IDS, ฯลฯ )

ไม่นาน:

  • DROP สามารถใช้สำหรับผู้บุกรุกซ้ำซากหากการห้ามพอร์ตทั้งหมด (ดังนั้นดูเหมือนว่าเซิร์ฟเวอร์จะอยู่ด้านผู้บุกรุก)
  • REJECT --reject-with tcp-reset เป็นตัวเลือกที่ดีที่สุดสำหรับการแบนหลายพอร์ตเนื่องจากดูเหมือนจะทำงานเป็นพอร์ตปิดจริง
  • ถ้าบางพอร์ตกำลังตอบรับ (ผู้บุกรุกรู้ว่าโฮสต์ยังมีชีวิตอยู่) DROPและREJECT(โดยไม่มีtcp-reset) จะให้ "สัญญาณ" แก่ผู้บุกรุกว่ามีบางสิ่งปิดกั้นที่นั่น (เพื่อที่จะกระตุ้นให้เขาสามารถโจมตี ในบางจุด)

-5

ใช่การใช้ DROP นั้นไม่มีจุดหมาย ใช้ปฏิเสธ

แม้เมื่อกฎบอกว่า "DROP" ระบบยังคงตอบกลับ SYN ที่เข้ามาด้วย TCP RST / ACK - ซึ่งเป็นพฤติกรรมเริ่มต้นสำหรับพอร์ตที่ไม่มีบริการที่ทำงานอยู่ (tcpdump และ al ไม่ได้บันทึกสิ่งนี้)

หากบริการกำลังทำงานอยู่ SYN จะพบกับ TCP SYN / ACK

เนื่องจาก DROP ไม่ตอบสนองตามปกติด้วย TCP SYN / ACK แต่ด้วย RST / ACK แทนกฎ DROP ของคุณจะโฆษณาไฟร์วอลล์และสแกนเนอร์พอร์ตของคุณจะรู้ว่าคุณกำลังไฟร์วอลล์บางสิ่งบางอย่างและอาจทำให้คุณผิดหวัง ของการจับไฟร์วอลล์ของคุณลง

นี่คือตอนนี้ nmap สามารถรายงาน "ตัวกรอง" แทนที่จะเป็น "ปิด" ตัวอย่างเช่น:

$ 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

ดังนั้นการตั้งค่าไฟร์วอลล์ "ที่มองไม่เห็น" เพียงอย่างเดียวจึงเป็นสิ่งที่อุปกรณ์เฉพาะตั้งอยู่ระหว่างอุปกรณ์ของคุณและเลือกส่งต่อเฉพาะพอร์ต

หากคุณต้องการยุ่งกับเครื่องสแกนพื้นฐานจริงๆคุณสามารถเชื่อมต่อ TARPIT tcp ซึ่งตั้งค่า TCP Window เป็น 0 เพื่อไม่ให้มีการถ่ายโอนข้อมูลหลังจากเปิดการเชื่อมต่อละเว้นการร้องขอเพื่อปิดการเชื่อมต่อหมายความว่าสแกนเนอร์ต้องรอ เพื่อให้การเชื่อมต่อหมดเวลาหากต้องการตรวจสอบให้แน่ใจ แต่มันเป็นเรื่องเล็กน้อยสำหรับผู้โจมตีที่จะตรวจจับสิ่งนี้และทำให้เวลาของเขาสั้นมาก

ทุกสิ่งที่ถูกพิจารณาคุณอาจจะดีที่สุดเพียงแค่ใช้ REJECT หรือวางอุปกรณ์การส่งต่อพอร์ตเฉพาะระหว่างเซิร์ฟเวอร์ของคุณและอินเทอร์เน็ต

หรือเพียงแค่เรียกใช้บริการบนเครื่องที่เชื่อมต่อกับอินเทอร์เน็ตซึ่งไม่ต้องใช้ไฟร์วอลล์

โดยทั่วไปการปฏิเสธจะดีที่สุดสำหรับเว็บเซิร์ฟเวอร์เนื่องจากบริการใดก็ตามที่พยายามเข้าถึง (อาจบ่อยกว่าคุณ) จะได้รับการตอบกลับอย่างรวดเร็วและผู้ใช้หรือบริการอื่น ๆ จะไม่ถูกรอคอยหากสงสัยว่าเครือข่ายขัดข้อง


5
คำตอบนี้ไม่ถูกต้อง มันสามารถแสดงได้อย่างง่ายดายด้วย tcpdump ว่ากฎ DROP จะส่งผลให้ระบบไม่ส่งคำตอบใด ๆ - อย่างที่คาดไว้ และคำสั่งของคุณ "เพื่อวางแพ็กเก็ตอย่างแท้จริงระบบจำเป็นต้องตอบกลับด้วย TCP RST / ACK" ไม่สมเหตุสมผลเนื่องจากการตอบกลับสิ่งใดที่เห็นได้ชัดว่าไม่ใช่ "วางแพ็กเก็ตจริง" หากคุณ "ปล่อย" แพ็คเก็ตอย่างแท้จริงคุณเพียงแค่ไม่ตอบและนี่เป็นผลกระทบของกฎ DROP
Juliane Holzt

3
คุณสามารถให้แหล่งที่มาสำหรับข้อกล่าวหาที่DROPจะออกSYN/ACK? ฉันไม่เคยเห็นสิ่งนี้ในเครื่องของฉัน
motobói

2
@Dagelf บทความของคุณพูดว่า "DROP (aka DENY, BLACKHOLE) ห้ามส่งแพ็คเก็ตผ่านไม่ส่งการตอบสนอง"
JeanT

มันไม่ได้ส่งการตอบสนองปกติ แต่จะส่งหนึ่งตามที่อธิบายไว้โดยไม่คำนึงถึง
Dagelf

3
เอกสารที่คุณเชื่อมโยงไปยังบอกว่า " DROP ... ส่งการตอบสนอง " และไม่ได้เท่าที่ผมสามารถมองเห็นสนับสนุนการเรียกร้องของคุณที่ส่งกลับDROP ฉันเกินไปไม่เคยเห็นพฤติกรรมนี้ภายใต้รุ่นใดSYN/ACKiptablesหากคุณมีแหล่งข้อมูลที่สนับสนุนการอ้างสิทธิ์ของคุณมันจะมีประโยชน์มากที่สุดในการดู แน่นอนทิ้งแพ็กเก็ตที่ฉันเพิ่งทำไม่สนับสนุนการเรียกร้องของคุณ
MadHatter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.