การแก้จุดบกพร่อง iptables และข้อผิดพลาดไฟร์วอลล์ทั่วไป?


18

นี่เป็นคำถาม Canonical ที่เสนอ เกี่ยวกับการทำความเข้าใจและการดีบักซอฟต์แวร์ไฟร์วอลล์บนระบบ Linux

ในการตอบกลับ คำตอบของ EEAAและความคิดเห็นของ @ Shog ว่าเราต้องการคำถาม & คำตอบที่เหมาะสมสำหรับการปิดคำถามทั่วไปที่ค่อนข้างง่ายเกี่ยวกับ iptables

เป็นวิธีการแก้ปัญหาโครงสร้างการแก้ปัญหากับซอฟต์แวร์ไฟร์วอลล์ Linux, สิ่งnetfilterกรอบแพ็คเก็ตกรองปกติจะเรียกโดยอินเตอร์เฟซ userland iptables ?

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

แม้ว่าคุณจะใช้เครื่องมือเช่นUFW , FirewallD (aka firewall-cmd), Shorewallหรือสิ่งที่คล้ายกันคุณอาจได้รับประโยชน์จากการมองภายใต้ประทุนโดยไม่ต้องใช้เลเยอร์ที่เป็นนามธรรม

คำถามนี้ไม่ได้มีจุดประสงค์เพื่อสร้างไฟร์วอลล์: ตรวจสอบเอกสารประกอบของผลิตภัณฑ์สำหรับตัวอย่างนั้นและมีส่วนร่วมในสูตรการทำiptables Trips & Tricksหรือค้นหาแท็ก คำถามสำหรับคำถามที่มีอยู่บ่อยและได้คะแนนสูง Q & A ของ


1
สิ่งที่เกี่ยวกับ NAT & กฎ stateful ซึ่งสามารถวางไว้ก่อนหน้านี้ในห่วงโซ่เพื่อปรับปรุงประสิทธิภาพและเพิ่มความปลอดภัย?
Matt

1
@Matt: การเพิ่มประสิทธิภาพกฎไฟร์วอลล์เป็นคำถามและคำตอบที่สมบูรณ์ในตัวเองและในคำถาม & คำตอบนี้ฉันจะไม่ขยายคำตอบก่อนหน้านี้ที่ฉันให้ไว้ที่นี่
HBruijn

1
หากคุณยังไม่ถึงกฎที่คุณควรทำใน IPtables ให้เพิ่มกฎการเข้าสู่ระบบที่คล้ายกันและเดินทางไกลขึ้นไปเรื่อย ๆ จนกว่าคุณจะได้รับข้อความ LOG จากนั้นกฎข้อใดข้อหนึ่งด้านล่างนี้จะเป็นกฎที่จับคู่แพ็กเก็ตของคุณไม่ถูกต้อง
Matthew Ife

1
โอ้และการตั้งค่าnet.netfilter.nf_conntrack_log_invalidเป็น 255 จะจับแพ็คเก็ตที่ไม่ถูกต้องได้เป็นอย่างดีซึ่งสามารถช่วยได้หากมันเป็นส่วนหนึ่งของ netfilter ที่ทำให้เกิดพฤติกรรมที่ไม่ดี
Matthew Ife

คำตอบ:


14

โดยทั่วไป:

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

สารบัญ:

  1. เรื่องการสั่งซื้อหรือความแตกต่างระหว่าง-Iและ-A
  2. แสดงการกำหนดค่าไฟร์วอลล์ปัจจุบัน
  3. การตีความ ouput ของ iptables -L -v -n
  4. รู้ว่าสภาพแวดล้อมของคุณ
  5. โซ่ INPUT และไปข้างหน้า
  6. โมดูลเคอร์เนล

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-SSHiptables-บันทึกเป็น บ่อยครั้งที่คุณจะพบหนึ่งในสัญลักษณ์เหล่านั้นในเอกสาร

ตัวนับระบุว่ากฎนี้จับคู่แพ็กเก็ต 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 -plnutss -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


1
เมื่อค้นหาเคาน์เตอร์แพ็คเก็ต / ไบต์ที่เพิ่มขึ้น เครื่องมือที่มีประโยชน์คือใช้นาฬิกาในโหมดที่ต่างกัน watch --difference -n 1 iptables -L FORWARD -v -nดังนั้นอะไรเช่นนี้ การปล่อยให้เครื่องมือรันคำสั่งเป็นระยะและเน้นการเปลี่ยนแปลงทำให้ง่ายขึ้นมาก
Zoredache

1
ฉันเพิ่งเห็นความคิดเห็นของคุณหย่อน นี่เป็นคำตอบที่ดีไม่แน่ใจว่าฉันสามารถเพิ่มได้มาก คุณอาจต้องการรวมการกล่าวถึงการใช้คุณสมบัติการสืบค้นกลับ
Zoredache

ฉันจะเอาiptables-saveท์พุท (เด่นกว่าด้วย-c) ทุกครั้งที่iptables -Lเอาท์พุทหวั่น(มีข้อโต้แย้งต่างๆ) นี้
0xC0000022L

7

ปัญหาทั่วไปที่มีโปรโตคอลแตกต่างกัน

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

อีเมล: ปริมาณผู้ใช้ ISP ที่บล็อก ISP (หรืออย่างน้อยพอร์ตเริ่มต้น TCP 25) ทำให้ไม่สามารถรับหรือส่งอีเมลโดยตรงและลูกค้าของพวกเขาถูกบังคับให้ใช้รีเลย์ SMTP ของ ISP สำหรับอีเมลขาออกทั้งหมดและบางครั้งสำหรับอีเมลขาเข้าเช่นกัน . เกี่ยวข้องกับ§1.1

FTP: FTP เป็นโปรโตคอลแปลก ๆ โดยพิจารณาว่ามีการใช้การเชื่อมต่อสองครั้ง สิ่งแรกคือการเชื่อมต่อการควบคุมโดยค่าเริ่มต้นเซิร์ฟเวอร์ FTP จะฟังบนพอร์ต TCP 21 สำหรับสิ่งนั้น การเชื่อมต่อการควบคุมจะใช้สำหรับการตรวจสอบและออกคำสั่ง การถ่ายโอนไฟล์จริงและสิ่งต่าง ๆ เช่นผลลัพธ์ของรายการไดเรคทอรีไปผ่านการเชื่อมต่อ TCP ที่สองคือการเชื่อมต่อ DATA. ใน FTP ที่แอ็คทีฟนั้นการเชื่อมต่อ DATA จะเริ่มจากเซิร์ฟเวอร์ FTP จากพอร์ต TCP 20 และเชื่อมต่อกับไคลเอนต์ FTP Active FTP ทำงานได้ไม่ดีนักกับผู้ใช้ที่อยู่หลังไฟร์วอลล์และ NAT เกตเวย์ดังนั้นมันจึงถูกเลิกใช้งานส่วนใหญ่ เซิร์ฟเวอร์ FTP ส่วนใหญ่ suppport Passive FTP แทน ด้วย FTP แบบพาสซีฟเซิร์ฟเวอร์ FTP จะเปิดฟังสำหรับการเชื่อมต่อข้อมูลบนพอร์ตที่สองซึ่งไคลเอนต์ FTP สามารถเชื่อมต่อได้ ปัญหาสำหรับไฟร์วอลล์คือพอร์ต DATA สามารถพอร์ต unprivilged ใด ๆ ระหว่าง 1024-65536

ในไฟร์วอลล์ไร้สัญชาติที่โดยทั่วไปจะได้รับการแก้ไขโดยการ จำกัด จำนวนของพอร์ตเรื่อย ๆ ที่เซิร์ฟเวอร์ FTP อาจกำหนดและจากนั้นเปิดพอร์ตเหล่านั้นอย่างชัดเจน กล่าวคือ

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

ในไฟร์วอลล์แบบ stateful คุณไม่จำเป็นต้องเปิดพอร์ต DATA อย่างชัดเจนโมดูลตัวช่วย netfilter จะจดจำพอร์ตไดนามิกที่ได้รับมอบหมายและเปิดพอร์ตนั้นสำหรับไคลเอ็นต์ที่ถูกต้องโดยทำเครื่องหมายการเชื่อมต่อ DATA เหมือนกันRELATEDหลังจากนั้นจะตรงกับกฎทั่วไป :

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

สิ่งนี้ต้องการให้โหลดโมดูลเคอร์เนลที่ถูกต้องในกรณี FTP ด้วยตนเองโดยการเรียกใช้เช่นinsmod nf_conntrack_ftpการทำให้การขึ้นอยู่กับการเริ่มระบบใหม่นั้นขึ้นอยู่กับการกระจาย

หมายเหตุ:โมดูลการติดตามการเชื่อมต่อ FTP จะล้มเหลวเมื่อใช้ FTP กับ SSL เนื่องจากการเชื่อมต่อการควบคุมจะถูกเข้ารหัสและ nf_conntrack_ftp จะไม่สามารถอ่าน PASV repsonse ได้อีกต่อไป

NFSและบริการ RPC ที่คล้ายกัน:ปัญหาเกี่ยวกับบริการ RPC ก็คือโดยการออกแบบพวกเขาไม่ได้ใช้พอร์ตคงที่เฉพาะเจาะจง พวกเขาสามารถเลือกพอร์ตใดก็ได้ที่มีการสุ่มซึ่งจะถูกลงทะเบียนกับ RPC Portmap daemon ไคลเอ็นต์ที่พยายามเชื่อมต่อจะสอบถาม Portmap daemon จากนั้นเชื่อมต่อโดยตรงกับพอร์ตที่ถูกต้อง ที่แก้ไขปัญหาการหมดพอร์ตที่สำรองไว้ ...

จากมุมมองไฟร์วอลล์ต้องเปิดพอร์ต TCP / UDP 111 และพอร์ตจริงที่ใช้บริการ RPC อยู่ในปัจจุบัน ปัญหาของการเปิดพอร์ตสุ่มในไฟร์วอลล์โดยทั่วไปแล้วจะแก้ไขได้ด้วยการ จำกัด การให้บริการ RPC เช่นเซิร์ฟเวอร์ NFS เพื่อใช้พอร์ตคงที่ที่กำหนดไว้ล่วงหน้า


7

Iptables / Firewall "แนะนำ"

ไฟร์วอลล์นั้นเป็นตัวกรองเครือข่ายตามนโยบาย ไฟร์วอลล์ Linux สร้างขึ้นรอบ ๆ Netfilter เฟรมเวิร์กการประมวลผลแพ็กเก็ตเครือข่ายของเคอร์เนลซึ่งทำจากโมดูลเคอร์เนลจำนวนมากที่ทำงานเฉพาะด้าน:

  1. โมดูลตัวกรอง (โหลดตามค่าเริ่มต้นเสมอ) ส่วนใหญ่ช่วยให้เราสามารถรับแพ็คเก็ต ACCEPT หรือ DROP ตามเกณฑ์การจับคู่ที่แน่นอน
  2. ชุดโมดูล NAT ช่วยให้เราสามารถทำการแปลที่อยู่เครือข่าย (SNAT, DNAT, MASQUERADE)
  3. โมดูล MANGLE ช่วยให้เราสามารถเปลี่ยนฟิลด์แพ็คเก็ต IP (TOS, TTL) บางฟิลด์ได้

ผู้ใช้กำหนดค่ากรอบงาน Netfilter เพื่อให้เหมาะกับความต้องการของไฟร์วอลล์โดยใช้ iptables จากบรรทัดคำสั่ง ด้วย iptables เรากำหนดกฎที่สั่งให้เคอร์เนลว่าจะทำอย่างไรกับแพ็กเก็ต IP เมื่อพวกเขาเข้ามาผ่านหรือออกจากกล่อง Linux ของเรา กระบวนการหลักของ Netfilter แต่ละตัวจะถูกแสดงด้วย TABLE (FILTER, NAT, MANGLE) บน iptables lingo พวกเขามีจุดเชื่อมต่อเฉพาะหลายจุดบนแผนผังการไหลของแพ็กเก็ตเครือข่ายที่เคอร์เนลเรียกใช้เพื่อทำหน้าที่ บางลำดับที่อยู่เฉพาะของการโทรแบบตารางจะเรียกว่า CHAINS ในตัวที่รับชื่อ PREROUTING, INPUT, FORWARD, OUTPUT และ POSTROUTING เป็นการง่ายที่จะจดจำถ้าเราเชื่อมโยง TABLE กับ "ชนิดของกระบวนการ" และ CHAIN ​​กับ "ตำแหน่ง" บนแผนที่โฟลว์แพ็กเก็ตเครือข่ายโดยที่อินสแตนซ์ของกระบวนการเหล่านั้นถูกเรียกใช้

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากได้รับแพ็คเก็ต IP บนอินเทอร์เฟซเครือข่ายหรือสร้างขึ้นโดยกระบวนการโลคัลจนกระทั่งในที่สุดจะถูกส่งหรือทิ้งเอ็นจิ้น Netfilter จะทดสอบตามลำดับและใช้กฎที่มีอยู่ตามแผนที่การไหลของแพ็กเก็ตเครือข่าย ที่แต่ละบล็อกที่ระบุโดยการจับคู่ TABLE @ CHAIN ​​ผู้ใช้สามารถเพิ่มกฎการติดต่อกันอย่างน้อยหนึ่งกฎที่มีเกณฑ์การจับคู่แพ็กเก็ต IP และการดำเนินการที่สอดคล้องกัน มีการกระทำ (เช่น ACCEPT, DROP และอื่น ๆ ) ที่สามารถดำเนินการได้มากกว่าหนึ่งตารางและการกระทำอื่น ๆ (เช่น SNAT, DNAT และอื่น ๆ ) ที่เป็นตารางเฉพาะ

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

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่โซ่ในตัวสามารถมีนโยบายที่ผู้ใช้กำหนดของแพ็กเก็ต ACCEPT หรือ DROP โซ่ที่กำหนดโดยผู้ใช้มีนโยบายเริ่มต้นที่ไม่สามารถเปลี่ยนได้ของ RETURN ไปยังผู้เรียกเพื่อดำเนินการต่อ

คำสั่ง Iptables

คำสั่งหลักของ iptables จะเติมแผนที่การไหลของแพ็กเก็ตเครือข่ายด้วยกฎการประมวลผลที่จำเป็น

กฎ iptables ทั่วไปสามารถเขียนเป็น:

# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>

มันสามารถอ่านได้เช่น:

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>

คำสั่งเสริม iptables ดำเนินการตั้งค่าสถานการณ์เริ่มต้นให้สมบูรณ์แสดงรายการกฎล้างกฎ ฯลฯ

#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>

Iptables โหลดคำสั่งของเราลงในเอ็นจิ้น Netfilter ตอนรันไทม์ Netfilter inmediatelly บังคับใช้กฎและการตั้งค่าที่โหลด แต่มันไม่ทน การรีบูตกฎ Netfilter ที่โหลดก่อนหน้านี้ทั้งหมดและการตั้งค่าจะหายไป ด้วยเหตุนี้จึงมีโปรแกรมอรรถประโยชน์ iptables ที่อนุญาตให้บันทึกชุดกฎที่ใช้งานอยู่ในปัจจุบันไปยังไฟล์และโหลดซ้ำในภายหลัง

#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)

สรุป Iptables

Netfilter เป็นโครงร่างที่ยืดหยุ่นและทรงพลังอย่างยิ่ง แต่มีราคาที่ต้องจ่าย Iptables ซับซ้อน จากมุมมองของผู้ใช้บางคำเช่น Table, CHAIN, TARGET นั้นไม่ตรงกับแนวคิดที่พวกเขานำเสนอและไม่สมเหตุสมผลในตอนแรก หัวข้อยาวคำสั่งดูเหมือนจะมีรายการพารามิเตอร์ไม่สิ้นสุด เพื่อทำให้สิ่งเลวร้ายลงไม่มีหนังสือเล่มเดียวที่เชี่ยวชาญในการทำขนม พวกเขาส่วนใหญ่แบ่งออกเป็นสองประเภท: "ตำราอาหาร" หรือ "หนังสือ manpage" ฉันคิดว่าการแนะนำนี้ให้ภาพรวมของภูมิทัศน์ Netfilter / Iptables รวมถึงปริมาณที่จำเป็นของสิ่ง manpage ที่ย่อยไว้ล่วงหน้า หากคุณยังใหม่กับ iptables หลังจากอ่านย่อหน้าเหล่านี้สองสามครั้งคุณก็พร้อมที่จะอ่านตัวอย่าง iptables ด้วยการฝึกฝนคุณจะพบว่าตัวเองกำลังเขียนกฏของคุณเอง

ไฟร์วอลล์

ไฟร์วอลล์ส่วนใหญ่ได้รับการออกแบบมาเพื่ออนุญาตหรือปฏิเสธการรับส่งข้อมูลเครือข่ายแบบไดนามิกโดยยึดตามชุดของกฎ ณ จุดนี้มันง่ายต่อการเข้าใจว่าทำไมกรอบ Linux Netfilter / Iptables จึงเหมาะสำหรับการสร้างไฟร์วอลล์ ดูแผนที่การไหลของแพ็คเก็ตเครือข่ายเราพบสองจุดที่น่าสนใจเป็นพิเศษในตารางตัวกรองที่โซ่ INPUT และ FORWARD; เราสามารถตัดสินใจได้จากที่อยู่ IP, IP โปรโตคอล (UDP / TCP), พอร์ตปลายทาง (80, 21, 443, ฯลฯ ) ฯลฯ หากเรายอมรับยอมรับหรือเพียงแค่แพ็คเก็ต IP เฉพาะ นี่คือสิ่งที่ไฟร์วอลล์ทำ 80% ของเวลาเมื่อป้องกันเว็บไซต์จากการร้องขอเครือข่ายที่ไม่ได้รับอนุญาต อีก 20% ของเวลากำลังจัดการแพ็คเก็ตเครือข่าย (NAT, MANGLE)

สถานการณ์ไฟร์วอลล์

มีรูปแบบไฟร์วอลล์ที่แตกต่างกันหลายร้อยรูปแบบซึ่งเพิ่มความต้องการที่แตกต่างกัน แต่ 3 ในนั้นอาจพิจารณาว่าเป็นสถานการณ์ไฟร์วอลล์ทั่วไปมากที่สุด

  1. เว็บเซิร์ฟเวอร์อย่างง่ายที่มีอินเตอร์เฟซอย่างน้อยหนึ่งตัวเชื่อมต่อกับอินเทอร์เน็ต นโยบายรวมถึงกฎพื้นฐานเพื่ออนุญาตการเข้าถึงขาเข้าที่ จำกัด การเข้าถึงขาออกไม่ จำกัด และกฎการต่อต้านการปลอมแปลง การส่งต่อ IP ถูกปิด
  2. ไฟร์วอลล์นี้เชื่อมต่ออินเทอร์เน็ตและพื้นที่ภายในที่ได้รับการป้องกัน นโยบายรวมถึงกฎพื้นฐานเพื่ออนุญาตการเข้าถึงขาเข้าที่ จำกัด การเข้าถึงขาออกไม่ จำกัด และกฎการต่อต้านการปลอมแปลง เนื่องจากพื้นที่ที่มีการป้องกันใช้ที่อยู่ IP ส่วนตัวต้องการแหล่ง NAT การส่งต่อ IP เปิดอยู่
  3. ไฟร์วอลล์นี้เชื่อมต่อกับอินเทอร์เน็ตพื้นที่คุ้มครองและปลอดทหาร นโยบายรวมถึงกฎพื้นฐานเพื่ออนุญาตการเข้าถึงขาเข้าที่ จำกัด การเข้าถึงขาออกไม่ จำกัด และกฎการต่อต้านการปลอมแปลง เนื่องจากพื้นที่ที่ได้รับการป้องกันและ DMZ ใช้ที่อยู่ IP ส่วนตัวพวกเขาต้องการ NAT ต้นทางและปลายทาง การส่งต่อ IP เปิดอยู่ ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้เขียนสิ่งนี้สำหรับ: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html

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