ฉันต้องการสร้างกฎ iptables ง่ายๆเพื่อปฏิเสธการเชื่อมต่อขาเข้าทั้งหมดและอนุญาตให้ส่งออก ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันต้องการสร้างกฎ iptables ง่ายๆเพื่อปฏิเสธการเชื่อมต่อขาเข้าทั้งหมดและอนุญาตให้ส่งออก ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
ลองใช้การเข้าถึงรูท:
# 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
หากคุณทำงานจากระยะไกลผ่าน SSH คุณอาจต้องการเพิ่ม ( -I
แทรกก่อนกฎอื่น ๆ ทั้งหมดINPUT
):
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
ถ้าบริการ SSH 22
ของคุณฟังพอร์ตอื่นคุณจะต้องใช้พอร์ตแทนว่า
มิฉะนั้นคุณอาจสูญเสียการเข้าถึงโดยไม่ตั้งใจ
โปรดระวังว่าคำตอบอื่น ๆ ไม่ครอบคลุม 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
เพื่ออัปเดตกฎถาวร
คำตอบทั้งสองข้างต้นถูกต้อง แต่ก็ไม่แม่นยำพอที่จะให้คำตอบได้ (ขออภัยฉันมีชื่อเสียงไม่เพียงพอที่จะเพิ่มความคิดเห็นดังนั้นเขียนคำตอบที่สมบูรณ์)
ฉันกรณีของฉันฉันได้พบเซิร์ฟเวอร์ 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
เพื่อบันทึกทราฟฟิกขาออกของคุณ (จะไม่ส่งสัญญาณการปฏิเสธ)