โดยทั่วไป:
การดูและแก้ไขการกำหนดค่าไฟร์วอลล์ต้องใช้สิทธิ์ผู้ดูแลระบบ ( root
) เช่นเดียวกับการเปิดบริการในช่วงหมายเลขพอร์ตที่ จำกัด นั่นหมายความว่าคุณควรล็อกอินroot
หรือใช้sudo
เพื่อรันคำสั่งในฐานะรูท [sudo]
ผมจะพยายามทำเครื่องหมายคำสั่งดังกล่าวมีตัว
สารบัญ:
- เรื่องการสั่งซื้อหรือความแตกต่างระหว่าง
-I
และ-A
- แสดงการกำหนดค่าไฟร์วอลล์ปัจจุบัน
- การตีความ ouput ของ
iptables -L -v -n
- รู้ว่าสภาพแวดล้อมของคุณ
- โซ่ INPUT และไปข้างหน้า
- โมดูลเคอร์เนล
1. เรื่องการสั่งซื้อหรือความแตกต่างระหว่าง-I
และ-A
สิ่งที่ต้องจำคือกฎไฟร์วอลล์ถูกตรวจสอบตามลำดับที่ระบุไว้ เคอร์เนลจะหยุดการประมวลผลเชนเมื่อมีการเรียกใช้กฎที่จะอนุญาตหรือไม่อนุญาตให้ใช้แพ็กเก็ตหรือการเชื่อมต่อ
ฉันคิดว่า ข้อผิดพลาดที่พบบ่อยที่สุดสำหรับผู้ดูแลระบบไฟร์วอลล์มือใหม่คือพวกเขาทำตามคำแนะนำที่ถูกต้องเพื่อเปิดพอร์ตใหม่เช่นที่ด้านล่าง:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
แล้วค้นพบว่ามันจะไม่มีผล
เหตุผลก็คือ-A
ตัวเลือกเพิ่มกฎใหม่หลังจากกฎที่มีอยู่ทั้งหมด
และบ่อยครั้งที่กฎขั้นสุดท้ายในไฟร์วอลล์ที่มีอยู่เดิมเป็นสิ่งหนึ่งที่บล็อกการรับส่งข้อมูลทั้งหมดที่ไม่ได้รับอนุญาตอย่างชัดเจนทำให้เกิด
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
หรือเทียบเท่าใน iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
และกฎใหม่ที่เปิดพอร์ต TCP 8080 จะไม่สามารถเข้าถึงได้ (ตามหลักฐานที่เคาน์เตอร์เหลืออยู่อย่างดื้อรั้นที่ 0 แพ็คเก็ตและศูนย์ไบต์)
โดยการแทรกกฎด้วยกฎ-I
ใหม่จะเป็นครั้งแรกในห่วงโซ่และจะทำงาน
2. แสดงการกำหนดค่าไฟร์วอลล์ปัจจุบัน
คำแนะนำของฉันสำหรับผู้ดูแลระบบไฟร์วอลล์คือดูที่การกำหนดค่าจริงที่เคอร์เนล Linux กำลังทำงานอยู่แทนที่จะพยายามวินิจฉัยปัญหาไฟร์วอลล์จากเครื่องมือที่เป็นมิตร บ่อยครั้งที่คุณเข้าใจปัญหาพื้นฐานคุณสามารถแก้ไขได้อย่างง่ายดายในเรื่องที่เครื่องมือเหล่านั้นสนับสนุน
คำสั่ง[sudo] iptables -L -v -n
คือเพื่อนของคุณ (แม้ว่าบางคนชอบiptables-save
ดีกว่า) บ่อยครั้งเมื่อพูดคุยการกำหนดค่ามันมีประโยชน์ที่จะใช้--line-numbers
ตัวเลือกเช่นเดียวกับเส้นจำนวน การอ้างถึงกฎ #X ทำให้การพูดคุยกันง่ายขึ้น
หมายเหตุ:กฎ NAT จะรวมอยู่ในiptables-save
ผลลัพธ์ แต่ต้องแสดงรายการแยกต่างหากโดยการเพิ่ม-t nat
ตัวเลือกเช่น, [sudo] iptables -L -v -n -t nat --line-numbers
.
การรันคำสั่งหลาย ๆ ครั้งและตรวจสอบตัวนับที่เพิ่มขึ้นอาจเป็นเครื่องมือที่มีประโยชน์เพื่อดูว่ากฎใหม่ได้รับการทริกเกอร์หรือไม่
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
อีกทางหนึ่งผลลัพธ์ของการiptables-save
ให้สคริปต์ที่สามารถสร้างใหม่การกำหนดค่าไฟร์วอลล์ข้างต้น:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
เป็นเรื่องของการตั้งค่าสิ่งที่คุณจะเข้าใจง่ายขึ้น
3. การตีความ ouput ของ iptables -L -v -n
นโยบายกำหนดดำเนินการเริ่มต้นการใช้โซ่เมื่อไม่มีการแข่งขันกฎอย่างชัดเจน ในINPUT
ห่วงโซ่ที่ถูกตั้งค่าให้ยอมรับการรับส่งข้อมูลทั้งหมด
กฎข้อแรกในโซ่ INPUT เป็นกฎที่น่าสนใจในทันทีโดยส่งการรับส่งข้อมูลทั้งหมด (ต้นทาง 0.0.0.0/0 และปลายทาง 0.0.0.0/0) ที่กำหนดไว้สำหรับพอร์ต TCP 22 ( tcp dpt:22
) พอร์ตเริ่มต้นสำหรับ SSH ไปยังเป้าหมายที่กำหนดเอง ( fail2ban-SSH
) . ตามชื่อระบุว่ากฎนี้ได้รับการดูแลโดย fail2ban (ผลิตภัณฑ์ด้านความปลอดภัยที่สแกนไฟล์ล็อกระบบเพื่อหาสิ่งที่ไม่เหมาะสมและบล็อกที่อยู่ IP ของผู้ใช้)
กฎที่จะได้รับการสร้างขึ้นโดย iptables commandline คล้ายกับiptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
หรือพบในการส่งออกของ -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
iptables-บันทึกเป็น บ่อยครั้งที่คุณจะพบหนึ่งในสัญลักษณ์เหล่านั้นในเอกสาร
ตัวนับระบุว่ากฎนี้จับคู่แพ็กเก็ต 784'000 และข้อมูล 65 เมกะไบต์
การรับส่งข้อมูลที่ตรงกับกฎข้อแรกนี้จะถูกประมวลผลโดยfail2ban-SSH
ลูกโซ่ที่เป็นลูกโซ่ที่ไม่ได้มาตรฐานจะได้รับรายการด้านล่างลูกโซ่ OUTPUT
ห่วงโซ่นั้นประกอบด้วยกฎสองข้อกฎหนึ่งสำหรับผู้ใช้แต่ละคน (แหล่งที่มาของที่อยู่ ip 117.253.221.166 หรือ 58.218.211.166) ที่ถูกบล็อก (ด้วยreject-with icm-port-unreachable
)
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
แพ็คเก็ต SSH ที่ไม่ได้มาจากโฮสต์ที่ถูกบล็อกนั้นยังไม่ได้รับอนุญาตหรือไม่ได้รับอนุญาตและตอนนี้จะทำการตรวจสอบห่วงโซ่ที่กำหนดเองเสร็จแล้วจะถูกตรวจสอบกับกฎข้อที่สองในห่วงโซ่ INPUT
แพ็กเก็ตทั้งหมดที่ไม่ได้กำหนดไว้สำหรับพอร์ต 22 ผ่านกฎข้อแรกในห่วงโซ่ INPUT และจะถูกประเมินในกฎ INPUT # 2
กฎหมายเลข INPUT 2 ทำให้สิ่งนี้มีวัตถุประสงค์เพื่อให้เป็นไฟร์วอลล์สถานะแบบเต็มซึ่งติดตามการเชื่อมต่อ ที่มีข้อดีบางอย่างเท่านั้นแพ็กเก็ตสำหรับการเชื่อมต่อใหม่จะต้องมีการตรวจสอบกับชุดเต็มกฎ แต่เมื่อได้รับอนุญาตแพ็กเก็ตเพิ่มเติมที่เป็นของการเชื่อมต่อที่จัดตั้งขึ้นหรือเกี่ยวข้องที่เกี่ยวข้องโดยไม่ต้องตรวจสอบเพิ่มเติม
กฎการป้อนข้อมูล # 2 ตรงกับการเชื่อมต่อที่เปิดและที่เกี่ยวข้องทั้งหมดและการจับคู่แพ็กเก็ตที่กฎนั้นไม่จำเป็นต้องได้รับการประเมินเพิ่มเติม
หมายเหตุ:การเปลี่ยนแปลงกฎในการกำหนดค่าไฟร์วอลล์ stateful จะส่งผลต่อการเชื่อมต่อใหม่เท่านั้นไม่ใช่การเชื่อมต่อที่สร้างไว้แล้ว
ในทางตรงกันข้ามตัวกรองแพ็คเก็ตอย่างง่ายจะทดสอบทุกแพ็คเก็ตกับชุดเต็มของกฎโดยไม่ต้องติดตามสถานะการเชื่อมต่อ ในไฟร์วอลล์ดังกล่าวจะไม่มีการใช้คำหลักสถานะ
กฎอินพุต # 3 ค่อนข้างน่าเบื่อการรับส่งข้อมูลทั้งหมดที่เชื่อมต่อกับลูปแบ็ค ( lo
หรือ 127.0.0.1) ได้รับอนุญาต
กฎอินพุต INPUT 4, 5 และ 6 ใช้เพื่อเปิดพอร์ต TCP 22, 80 และ 443 (พอร์ตเริ่มต้นสำหรับการตอบสนอง SSH, HTTP และ HTTPS) โดยการอนุญาตการเข้าถึงการเชื่อมต่อใหม่
ในไฟร์วอลล์ไร้สัญชาติกฎเหล่านั้นจะปรากฏโดยไม่มีแอตทริบิวต์ของสถานะ:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
หรือ
-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
กฎการป้อนข้อมูลสุดท้าย # 7 เป็นกฎที่บล็อกการรับส่งข้อมูลทั้งหมดที่ไม่ได้รับการเข้าถึงในกฎการป้อนข้อมูล 1-7 ธรรมเนียมปฏิบัติทั่วไป: ทุกสิ่งที่ไม่อนุญาตถูกปฏิเสธ ในทางทฤษฎีกฎนี้อาจถูกละเว้นได้โดยการตั้งค่านโยบายเริ่มต้นเป็นปฏิเสธ
ตรวจสอบห่วงโซ่ทั้งหมดเสมอ
4. รู้จักสภาพแวดล้อมของคุณ
4.1. การตั้งค่าในซอฟต์แวร์ไฟร์วอลล์จะไม่มีผลต่อการตั้งค่าความปลอดภัยที่อื่น ๆ ในเครือข่ายเช่นแม้จะเปิดบริการเครือข่ายด้วยiptables
รายการควบคุมการเข้าถึงที่ไม่ได้แก้ไขบนเราเตอร์หรือไฟร์วอลล์อื่น ๆ ในเครือข่ายของคุณอาจบล็อกการรับส่งข้อมูล ...
4.2. เมื่อไม่มีบริการกำลังฟังอยู่คุณจะไม่สามารถเชื่อมต่อและรับข้อผิดพลาดถูกปฏิเสธไม่ว่าการตั้งค่าไฟร์วอลล์จะเป็นเช่นไร ดังนั้น:
- ยืนยันว่าการให้บริการที่มีการฟัง (บนอินเตอร์เฟซเครือข่าย / IP ที่อยู่ที่ถูกต้อง) และการใช้หมายเลขพอร์ตที่คุณคาดหวังกับหรือการใช้งานอีกทางเลือกหนึ่ง
[sudo] netstat -plnut
ss -tnlp
- หากบริการของคุณยังไม่ควรใช้งานให้ลองเลียนแบบลิสเทนเนอร์แบบง่าย ๆ ด้วยเช่น netcat:
[sudo] nc -l -p 123
หรือopenssl s_server -accept 1234 [options]
หากคุณต้องการฟัง TLS / SSL (ตรวจสอบman s_server
ตัวเลือก)
- ตรวจสอบว่าคุณสามารถเชื่อมต่อจากเซิร์ฟเวอร์เอง
telnet <IP of Server> 123
หรือecho "Hello" | nc <IP of Server> 123
หรือเมื่อทดสอบบริการที่ปลอดภัย TLS / SSL openssl s_client -connect <IP of Server>:1234
ก่อนที่จะลองเดียวกันจากโฮสต์ระยะไกล
4.3. ทำความเข้าใจกับโปรโตคอลที่ใช้โดยบริการของคุณ คุณไม่สามารถเปิด / ปิดการใช้งานบริการที่คุณไม่เข้าใจอย่างเพียงพอ ตัวอย่างเช่น
- ใช้ TCP หรือ UDP หรือทั้งสองอย่าง (เช่นเดียวกับ DNS)
- บริการที่ใช้พอร์ตเริ่มต้นคงที่ (ตัวอย่างเช่นบางพอร์ต TCP 80 สำหรับเว็บเซิร์ฟเวอร์) คืออะไร
- อีกวิธีหนึ่งคือหมายเลขพอร์ตแบบไดนามิกที่เลือกซึ่งสามารถเปลี่ยนแปลงได้ (เช่นบริการ RPC เช่น NFS แบบคลาสสิกที่ลงทะเบียนกับ Portmap)
- FTP ที่น่าอับอายยังใช้สองพอร์ตทั้งหมายเลขพอร์ตคงที่และไดนามิกเมื่อกำหนดค่าให้ใช้โหมดพาสซีฟ ...
- คำอธิบายบริการพอร์ตและโพรโทคอลใน
/etc/services
ไม่จำเป็นต้องตรงกับบริการจริงโดยใช้พอร์ต
4.4. ตัวกรองแพ็กเก็ตเคอร์เนลไม่ใช่สิ่งเดียวที่อาจ จำกัด การเชื่อมต่อเครือข่าย:
- SELinux อาจ จำกัด บริการเครือข่ายด้วย
getenforce
จะยืนยันว่ากำลังใช้งาน SELinux อยู่หรือไม่
- แม้ว่าจะกลายเป็นความคลุมเครือเล็กน้อย TCP Wrappers ยังคงเป็นเครื่องมือที่มีประสิทธิภาพในการบังคับใช้การรักษาความปลอดภัยเครือข่าย ตรวจสอบกับ
ldd /path/to/service |grep libwrap
และ/hosts.[allow|deny]
ไฟล์ควบคุม
5. INPUT
หรือFORWARD
โซ่
แนวคิดของโซ่มีการอธิบายอย่างละเอียดมากขึ้นที่นี่แต่สั้น ๆ ของมันคือ:
การINPUT
เชื่อมโยงคือที่ที่คุณเปิดและ / หรือปิดพอร์ตเครือข่ายสำหรับบริการที่เรียกใช้ในเครื่องบนโฮสต์ที่คุณใช้คำสั่ง iptables
FORWARD
ห่วงโซ่เป็นที่ที่คุณใช้กฎการจราจรกรองที่ได้รับการส่งต่อไปโดย kernel กับระบบอื่น ๆ ระบบที่เกิดขึ้นจริง แต่ยังภาชนะหางและ Virtual เซิร์ฟเวอร์เซิร์ฟเวอร์ของผู้เข้าพักเมื่อเครื่อง Linux ของคุณจะทำหน้าที่เป็นสะพานเราเตอร์ไฮเปอร์ไวเซอร์และ / หรือไม่ที่อยู่เครือข่าย การแปลและการส่งต่อพอร์ต
ความเข้าใจผิดที่พบบ่อยคือเนื่องจากคอนเทนเนอร์นักเทียบท่าหรือแขก KVM ทำงานแบบโลคัลกฎตัวกรองที่ใช้ควรอยู่ในห่วงโซ่ INPUT แต่โดยทั่วไปจะไม่เป็นเช่นนั้น
6. โมดูลเคอร์เนล
เนื่องจากตัวกรองแพ็คเก็ตทำงานภายในเคอร์เนล Linux จึงสามารถรวบรวมเป็นโมดูลแบบไดนามิกได้จึงมีหลายโมดูล การแจกแจงส่วนใหญ่รวมถึง netfilter เป็นโมดูลและโมดูล netfilter ที่ต้องการจะถูกโหลดลงในเคอร์เนลตามต้องการ แต่สำหรับบางโมดูลผู้ดูแลระบบไฟร์วอลล์จะต้องตรวจสอบด้วยตนเองว่าได้รับการโหลดแล้ว เรื่องนี้เกี่ยวข้องกับโมดูลการติดตามการเชื่อมต่อเป็นหลักเช่นnf_conntrack_ftp
ที่สามารถโหลดinsmod
ได้
โมดูลที่โหลดในปัจจุบันในเคอร์เนลที่ใช้งานอยู่สามารถแสดงผลlsmod
ได้
วิธีการเพื่อให้แน่ใจว่าโมดูลจะถูกโหลดอย่างต่อเนื่องตลอดการรีบูตขึ้นอยู่กับการกระจาย Linux