ตั้งค่าไฟร์วอลล์พอร์ตให้ยอมรับการเชื่อมต่อเครือข่ายท้องถิ่นเท่านั้นหรือไม่


18

ฉันจะตั้งค่าไฟร์วอลล์บนระบบใน LAN เพื่อให้บางพอร์ตเปิดเฉพาะการเชื่อมต่อจากเครือข่ายท้องถิ่นและไม่ใช่จากโลกภายนอกได้อย่างไร

ตัวอย่างเช่นฉันมีกล่องที่ใช้Scientific Linux 6.1 (เป็น RHEL based distro) และฉันต้องการเซิร์ฟเวอร์ SSH เพื่อยอมรับการเชื่อมต่อจาก localhost หรือ LAN เท่านั้น ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


24

ด้วยiptablesของเคอร์เนลว่างเปล่าอย่างสมบูรณ์ (iptables -F ) สิ่งนี้จะทำสิ่งที่คุณถาม:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

สิ่งนี้บอกว่าที่อยู่ LAN ทั้งหมดได้รับอนุญาตให้พูดคุยกับพอร์ต TCP 22, localhost ได้รับการพิจารณาแบบเดียวกัน (ใช่, 127. * ไม่ใช่แค่ 127.0.0.1), และแพ็คเก็ตจากที่อยู่อื่น ๆ ที่ไม่ตรงกับกฎสองข้อแรกนั้นถังบิต คุณสามารถใช้ได้REJECTแทนDROPถ้าคุณต้องการการปฏิเสธที่ใช้งานอยู่ (TCP RST) แทนที่จะทำให้ TCP พอร์ต 22 เป็นหลุมดำสำหรับแพ็กเก็ต

หาก LAN ของคุณไม่ได้ใช้ 192.168.0. * block คุณจะต้องเปลี่ยน IP และมาส์กในบรรทัดแรกเพื่อให้ตรงกับโครงร่าง IP ของ LAN

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

RHEL 7+

ในระบบชนิด RHEL ล่าสุดวิธีที่ดีที่สุดในการทำเช่นนั้นคือการใช้firewall-cmdหรือ GUI ที่เทียบเท่า สิ่งนี้จะบอกfirewallddaemon ของระบบปฏิบัติการในสิ่งที่คุณต้องการซึ่งเป็นสิ่งที่เติมและจัดการกับสิ่งที่คุณเห็นผ่านiptables -Lและปรุงแต่งสิ่งที่คุณเห็นผ่านทาง

RHEL 6 และก่อนหน้านี้

สำหรับระบบประเภท RHEL ที่เก่ากว่าวิธีที่ง่ายที่สุดในการแก้ไขเชนไฟร์วอลล์เมื่อสั่งซื้อคือการแก้ไข /etc/sysconfig/iptablesวิธีที่ง่ายที่สุดในการปรับเปลี่ยนโซ่ไฟร์วอลล์เมื่อสั่งซื้อที่สำคัญคือการแก้ไข เครื่องมือไฟร์วอลล์ GUI และ TUI ของ OS นั้นค่อนข้างง่ายดังนั้นเมื่อคุณเริ่มเพิ่มกฎที่ซับซ้อนมากขึ้นเช่นนี้คุณควรกลับไปใช้ไฟล์ปรับแต่งเก่าที่ดีกว่า ระวังเมื่อคุณเริ่มทำสิ่งนี้คุณมีความเสี่ยงที่จะสูญเสียการเปลี่ยนแปลงหากคุณเคยใช้เครื่องมือไฟร์วอลล์ของระบบปฏิบัติการเพื่อแก้ไขการกำหนดค่าเนื่องจากอาจไม่รู้วิธีจัดการกับกฎที่ทำด้วยมือเช่นนี้

เพิ่มสิ่งนี้ลงในไฟล์:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

ตำแหน่งที่คุณเพิ่มเป็นบิตที่ยุ่งยาก หากคุณพบบรรทัดในไฟล์ที่พูดถึง--dport 22เพียงแค่แทนที่ด้วยสามบรรทัดด้านบน มิฉะนั้นอาจเป็นไปได้ก่อนที่บรรทัดแรกที่มีอยู่จะลงท้าย-j ACCEPTด้วย โดยทั่วไปคุณจะต้องได้รับความคุ้นเคยกับวิธีการของiptablesทำงานของจุดที่จุดแทรกที่ถูกต้องจะชัดเจน

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

ความคล้ายคลึงกับคำสั่งด้านบนไม่มีความบังเอิญ ไฟล์นี้ส่วนใหญ่ประกอบด้วยอาร์กิวเมนต์ของiptablesคำสั่ง ความแตกต่างที่สัมพันธ์กับข้างต้นคือiptablesคำสั่งถูกดร็อปและINPUTชื่อลูกโซ่กลายเป็นRH-Firewall-1-INPUTลูกโซ่เฉพาะ RHEL พิเศษ (หากคุณสนใจที่จะตรวจสอบไฟล์โดยละเอียดยิ่งขึ้นคุณจะเห็นก่อนหน้านี้ในไฟล์ที่พวกเขาได้เปลี่ยนชื่อINPUTเชนเป็นหลักเพราะเหตุใดไม่สามารถพูดได้)


4

เครื่องมือระดับต่ำสำหรับการตั้งค่าไฟร์วอลล์ภายใต้ Linux คือiptables iptablesนอกจากนี้ยังมีเครื่องมือระดับสูงกว่าที่มีอยู่ ฉันไม่ทราบว่า Scientific Linux มีเครื่องมือไฟร์วอลล์ที่แนะนำหรือไม่

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

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

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT

1
Gilles คุณไม่ได้อ่านคำถามผิดเล็กน้อยใช่ไหม? ฉันเข้าใจว่ากล่อง Scientific Linux เป็นหนึ่งในคอมพิวเตอร์ใน LAN แต่ไม่ใช่ไฟร์วอลล์
rozcietrzewiacz

@Gilles ใช่กล่องเป็นหนึ่งในคอมพิวเตอร์บน LAN
hpy

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

1

iptablesวิธีที่ต้องการที่จะทำมันขึ้นอยู่กับ ดูเหมือนว่าคนอื่น ๆ จะได้รับการคุ้มครองอย่างเพียงพอดังนั้นเพื่อความสมบูรณ์ฉันจะชี้ให้เห็นวิธีการควบคุมการเข้าถึงทางเลือกที่มีให้สำหรับ daemons จำนวนมากบน distros Linux ส่วนใหญ่ วิธีการควบคุมการเข้าถึงนั้นจัดทำโดยlibwrapห้องสมุด

ในการตรวจสอบว่าภูตที่คุณชื่นชอบมีlibwrapการสนับสนุนหรือไม่ลองทำดังนี้

ldd `which sshd` | grep libwrap

หากคุณได้รับผลลัพธ์ที่ไม่ว่างเช่น

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

ถ้าอย่างนั้นคุณก็ไปดี

มันเกือบจะแน่นอนว่าsshdภูตของคุณมีlibwrapการสนับสนุนและดังนั้นจึงควรศึกษา/etc/hosts.allowและ/etc/hosts.denyไฟล์สำหรับการควบคุมการเข้าถึง สมมติว่าเครือข่าย LAN ท้องถิ่นของคุณคือ192.168.100.0/24คุณสามารถปฏิเสธการเข้าถึงsshdลูกค้าทั้งหมดยกเว้นเครือข่ายท้องถิ่นหรือ LAN ท้องถิ่นโดยใส่สิ่งต่อไปนี้ใน/etc/hosts.denyไฟล์ของคุณ:

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

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

hosts_access(5)สำหรับรายละเอียดทั้งหมดให้ตรวจสอบหน้าคนที่เริ่มต้นด้วย


1

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

เพื่อความปลอดภัยเพิ่มเติมที่สูงกว่านั้นคุณสามารถใช้ซับเน็ตแยกต่างหากสำหรับการเชื่อมต่อใน LAN ในการทำเช่นนั้นสำหรับคอมพิวเตอร์แต่ละเครื่องให้เพิ่มที่อยู่ IP สำรองที่จะใช้ภายใน LAN เท่านั้นโดยไม่ได้รับจากเราเตอร์ สมมติว่าทั้ง LAN ตอนนี้ใช้192.168.0.xxxอยู่และเราเตอร์ (เกตเวย์ไฟร์วอลล์) 192.168.0.1เป็น ดังนั้นเพิ่มที่อยู่ที่สองสำหรับคอมพิวเตอร์แต่ละเครื่อง - ตัวอย่างเช่น:

ifconfig eth0:0 192.168.5.1/24

จากนั้นแก้ไขsshdการกำหนดค่าเพื่อใช้ที่อยู่นี้เท่านั้น (เพื่อไม่ให้มีการเชื่อมต่อ192.168.0.xxx) - แก้ไข/etc/ssh/sshd_configและแก้ไขListenAddressเป็นหนึ่งในเครือข่ายย่อยใหม่ของคุณ ( 192.168.5.1ในตัวอย่างด้านบน) แค่นั้นแหละ! หากคุณไม่ได้กำหนดค่าเกตเวย์เพื่อกำหนดเส้นทางการสื่อสารของซับเน็ตนั้นควรแยกออกจากภายนอก

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