ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมดด้วย iptables หรือไม่


คำตอบ:


27

ลองใช้การเข้าถึงรูท:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

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

ดูคำตอบของ Miphix สำหรับวิธีเพิ่มข้อยกเว้นสำหรับ SSH


2
เมื่อฉันทำบรรทัดแรกของกฎของคุณฉันมีการเชื่อมต่อจากจุ๊
Holms

7
คำถามคือ "ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมด" และไม่ใช่ "ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมดยกเว้น SSH" :)
Yohann

ผมอ่านคำเตือนของ @holms เกี่ยวกับกฎข้อแรกสายเกินไป ...
DenisKolodin

โปรดทราบว่านี่ไม่มีผลกระทบกับการจราจร ipv6 อ่านคำตอบของฉันด้านล่างหากคุณเปิดใช้งาน ipv6
bhelm

13

หากคุณทำงานจากระยะไกลผ่าน SSH คุณอาจต้องการเพิ่ม ( -Iแทรกก่อนกฎอื่น ๆ ทั้งหมดINPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

ถ้าบริการ SSH 22ของคุณฟังพอร์ตอื่นคุณจะต้องใช้พอร์ตแทนว่า

มิฉะนั้นคุณอาจสูญเสียการเข้าถึงโดยไม่ตั้งใจ


3

โปรดระวังว่าคำตอบอื่น ๆ ไม่ครอบคลุม IPv6! หากระบบของคุณยอมรับทราฟฟิก IPv6 จะไม่มีกฎ iptables เดียวที่จะใช้กับทราฟฟิกของ ipv6

แทนที่จะใช้ iptables / ip6tables โดยตรงฉันแนะนำให้ใช้ iptables-restore และบันทึก เครื่องมือเหล่านี้อนุญาตให้ระบุการกำหนดค่า iptables ด้วยกฎหลายข้อและโหลดได้อย่างง่ายดายด้วยคำสั่งเดียว

สร้างไฟล์ (ฉันชื่อ it iptables.rules) ด้วยเนื้อหาดังต่อไปนี้:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

หมายเหตุฉันได้เพิ่มตัวอย่างพิเศษบางอย่างถ้าคุณต้องการอนุญาต ICMP และทราฟฟิกไปยังพอร์ตเฉพาะ

ตอนนี้คุณสามารถโหลดด้วยคำสั่งเหล่านี้:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

ตอนนี้กฎของคุณยังครอบคลุมถึง ipv6 และง่ายต่อการจัดการ

หมายเหตุเพิ่มเติมสำหรับผู้ใช้ Debian: หากคุณพอใจกับกฎของคุณคุณสามารถapt install iptables-persistentคืนค่ากฎได้หลังจากรีบูต กฎไม่ได้ถูกบันทึกโดยอัตโนมัติเมื่อปิดระบบดังนั้นให้เรียกใช้netfilter-persistent saveเพื่ออัปเดตกฎถาวร


1

คำตอบทั้งสองข้างต้นถูกต้อง แต่ก็ไม่แม่นยำพอที่จะให้คำตอบได้ (ขออภัยฉันมีชื่อเสียงไม่เพียงพอที่จะเพิ่มความคิดเห็นดังนั้นเขียนคำตอบที่สมบูรณ์)

ฉันกรณีของฉันฉันได้พบเซิร์ฟเวอร์ apache overloaded, ลอยด้วยงาน cron, cpu ใช้มากเกินไป ขีด จำกัด เธรดถูกเก็บไว้ในฐานข้อมูล SQL แต่ฉันได้พบกับขีด จำกัด ของการเชื่อมต่อ ฉันต้องการ จำกัด การเชื่อมต่อ apache ขาเข้าจากโลคัลโฮสต์ (ส่วนนี้เป็นทางเลือก) แต่ให้เชื่อมต่ออื่น ๆ ทั้งหมดได้ รวมถึงสิ่งที่ถูกสร้างขึ้นจริง

ฉันทำมันด้วยคำสั่ง

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

หมายความว่า: สำหรับแพ็กเกจ tcp ที่เข้ามาแต่ละพอร์ต 80 โหลดstateโมดูลและหากนี่เป็นแพ็กเกจแรก (การเชื่อมต่อขาเข้า) ปฏิเสธมัน สำหรับโฮสต์ในพื้นที่คุณอาจใช้-s 127.0.0.0/8

และสำหรับการใช้งานจริงในบางกรณีคุณอาจเพิ่ม 'INVALID' ในอเมริกาNEW,INVALIDเนื่องจากสามารถส่งแพคเกจ "ประสงค์ร้าย" ได้พยายามเลี่ยงกฎของคุณ และแทนที่ด้วย-j DROPเพื่อบันทึกทราฟฟิกขาออกของคุณ (จะไม่ส่งสัญญาณการปฏิเสธ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.