ค้นหาเว็บไซต์

วิธีการตั้งค่าไฟร์วอลล์ Iptables เพื่อเปิดใช้งานการเข้าถึงบริการระยะไกลใน Linux - ตอนที่ 8


ขอแนะนำโปรแกรมการรับรอง Linux Foundation

คุณจะจำได้จากตอนที่ 1 – เกี่ยวกับ Iptables ของซีรีส์ LFCE (Linux Foundation Certified Engineer) ที่เราให้คำอธิบายพื้นฐานว่าไฟร์วอลล์คืออะไร: กลไกในการจัดการ แพ็กเก็ตเข้าและออกจากเครือข่าย โดย “จัดการ” เราหมายถึง:

  1. เพื่ออนุญาตหรือป้องกันไม่ให้แพ็กเก็ตบางตัวเข้าหรือออกจากเครือข่ายของเรา
  2. เพื่อส่งต่อแพ็กเก็ตอื่นจากจุดหนึ่งของเครือข่ายไปยังอีกจุดหนึ่ง

ตามเกณฑ์ที่กำหนดไว้ล่วงหน้า

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

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

คุณสามารถนึกถึงไฟร์วอลล์ว่าเป็นสนามบินนานาชาติที่มีเครื่องบินโดยสารเข้าออกเกือบตลอด 24 ชั่วโมงทุกวัน ตามเงื่อนไขหลายประการ เช่น อายุหนังสือเดินทางของบุคคล หรือประเทศต้นทางของเขา/เธอ (เพื่อเป็นตัวอย่าง) เขาหรือเธออาจหรืออาจจะไม่ได้รับอนุญาตให้เข้าหรือออกจากประเทศใดประเทศหนึ่งก็ได้

ในเวลาเดียวกัน เจ้าหน้าที่สนามบินสามารถสั่งให้ผู้คนย้ายจากที่หนึ่งของสนามบินไปยังอีกที่หนึ่งได้หากจำเป็น เช่น เมื่อจำเป็นต้องผ่านกรมศุลกากร

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

  1. คน=แพ็คเก็ต
  2. ไฟร์วอลล์=สนามบิน
  3. ประเทศ #1=เครือข่าย #1
  4. ประเทศ #2=เครือข่าย #2
  5. กฎสนามบินที่เจ้าหน้าที่บังคับใช้=กฎไฟร์วอลล์

Iptables – พื้นฐาน

ในระดับต่ำ เคอร์เนลเองจะ "ตัดสินใจ " ว่าจะทำอย่างไรกับแพ็กเก็ตตามกฎที่จัดกลุ่มไว้ใน ลูกโซ่ หรือ ประโยค กลุ่มเหล่านี้กำหนดสิ่งที่ควรดำเนินการเมื่อแพ็คเกจตรงกับเกณฑ์ที่ระบุ

การดำเนินการแรกที่ดำเนินการโดย iptables จะประกอบด้วยการตัดสินใจว่าจะทำอย่างไรกับแพ็กเก็ต:

  1. ยอมรับเลย (ปล่อยให้มันผ่านเข้าเครือข่ายเรา)?
  2. ปฏิเสธ (ป้องกันไม่ให้เข้าถึงเครือข่ายของเรา)?
  3. ส่งต่อ (ไปยังเครือข่ายอื่น)?

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

1. สายโซ่ INPUT จัดการแพ็กเก็ตที่เข้ามาในเครือข่าย ซึ่งถูกกำหนดไว้สำหรับโปรแกรมในเครื่อง

2. ลูกโซ่ OUTPUT ใช้เพื่อวิเคราะห์แพ็กเก็ตที่มีต้นกำเนิดในเครือข่ายท้องถิ่น ซึ่งจะถูกส่งไปยังภายนอก

3. ลูกโซ่ FORWARD ประมวลผลแพ็กเก็ตที่ควรส่งต่อไปยังปลายทางอื่น (เช่นในกรณีของเราเตอร์)

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

iptables -L

นโยบายที่มีอยู่มีดังนี้:

  1. ยอมรับ → ปล่อยให้แพ็กเก็ตผ่านไป แพ็กเก็ตใด ๆ ที่ไม่ตรงกับกฎใด ๆ ในลูกโซ่จะได้รับอนุญาตให้เข้าสู่เครือข่าย
  2. DROP → วางแพ็กเก็ตอย่างเงียบ ๆ แพ็กเก็ตใด ๆ ที่ไม่ตรงกับกฎใด ๆ ในลูกโซ่จะถูกป้องกันไม่ให้เข้าสู่เครือข่าย
  3. REJECT → ปฏิเสธแพ็กเก็ตและส่งคืนข้อความแจ้งข้อมูล โดยเฉพาะอย่างยิ่งอันนี้ใช้ไม่ได้กับนโยบายเริ่มต้น แต่มีไว้เพื่อเสริมกฎการกรองแพ็กเก็ตแทน

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

การเพิ่มกฎ

หากต้องการเพิ่มกฎลงในไฟร์วอลล์ ให้เรียกใช้คำสั่ง iptables ดังนี้:

iptables -A chain_name criteria -j target

ที่ไหน,

  1. -A ย่อมาจาก Append (ผนวกกฎปัจจุบันต่อท้ายห่วงโซ่)
  2. chain_name เป็น INPUT, OUTPUT หรือ FORWARD
  3. เป้าหมายคือการดำเนินการหรือนโยบายที่จะใช้ในกรณีนี้ (ยอมรับ ปฏิเสธ หรือวาง)
  4. เกณฑ์ คือชุดของเงื่อนไขที่จะใช้ตรวจสอบแพ็กเก็ต ประกอบด้วยแฟล็กต่อไปนี้อย่างน้อยหนึ่งรายการ (น่าจะมากกว่า) ตัวเลือกภายในวงเล็บซึ่งคั่นด้วยแถบแนวตั้งจะเท่ากัน ส่วนที่เหลือแสดงถึงสวิตช์เสริม:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

สภาพแวดล้อมการทดสอบของเรา

มากาวกันทั้งหมดด้วยตัวอย่างคลาสสิก 3 ตัวอย่างโดยใช้สภาพแวดล้อมการทดสอบต่อไปนี้สำหรับสองตัวอย่างแรก:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

และนี่คือตัวอย่างสุดท้าย

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
ตัวอย่างที่ 1: การวิเคราะห์ความแตกต่างระหว่างนโยบาย DROP และ REJECT

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

ping -c 3 192.168.0.15
iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

ก่อนดำเนินการต่อในส่วน REJECT เราจะล้างกฎทั้งหมดจากห่วงโซ่ INPUT เพื่อให้แน่ใจว่าแพ็กเก็ตของเราจะได้รับการทดสอบตามกฎใหม่นี้:

iptables -F INPUT
iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
ping -c 3 192.168.0.15

ตัวอย่างที่ 2: การปิดใช้งาน/เปิดใช้งานการเข้าสู่ระบบ ssh อีกครั้งจาก dev2 ถึง dev1

เราจะจัดการกับห่วงโซ่ OUTPUT ในขณะที่เรากำลังจัดการกับการรับส่งข้อมูลขาออก:

iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

ตัวอย่าง 3: การอนุญาต/การป้องกันไคลเอนต์ NFS (จาก 192.168.0.0/24) เพื่อเมานต์การแบ่งปัน NFS4

เรียกใช้คำสั่งต่อไปนี้ในเซิร์ฟเวอร์/ไฟร์วอลล์ NFSv4 เพื่อปิดพอร์ต 2049 และ 111 สำหรับการรับส่งข้อมูลทุกประเภท:

iptables -F
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

ตอนนี้เรามาเปิดพอร์ตเหล่านั้นแล้วดูว่าเกิดอะไรขึ้น

iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

อย่างที่คุณเห็น เราสามารถเมานต์การแบ่งปัน NFSv4 ได้หลังจากเปิดการรับส่งข้อมูล

การแทรก การผนวก และการลบกฎ

ในตัวอย่างก่อนหน้านี้ เราได้แสดงวิธีการผนวกกฎเข้ากับเชน INPUT และ OUTPUT หากเราต้องการแทรกในตำแหน่งที่กำหนดไว้ล่วงหน้าแทน เราควรใช้สวิตช์ -I (i ตัวพิมพ์ใหญ่) แทน

คุณต้องจำไว้ว่ากฎจะได้รับการประเมินทีละกฎ และการประเมินจะหยุด (หรือข้าม) เมื่อนโยบาย DROP หรือ ACCEPT ตรงกัน ด้วยเหตุนี้ คุณอาจพบว่าตัวเองจำเป็นต้องย้ายกฎขึ้นหรือลงในรายการลูกโซ่ตามความจำเป็น

เราจะใช้ตัวอย่างเล็กๆ น้อยๆ เพื่อสาธิตสิ่งนี้:

เรามาวางกฎต่อไปนี้

iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

ที่ตำแหน่ง 2) ใน INPUT chain (จึงย้าย #2 ก่อนหน้าไปเป็น #3)

เมื่อใช้การตั้งค่าข้างต้น การรับส่งข้อมูลจะได้รับการตรวจสอบเพื่อดูว่ามีการเปลี่ยนเส้นทางไปยังพอร์ต 80 หรือไม่ ก่อนที่จะตรวจสอบพอร์ต 2049

หรือคุณสามารถลบกฎและเปลี่ยนเป้าหมายของกฎที่เหลือเป็น REJECT (โดยใช้สวิตช์ -R):

iptables -D INPUT 1
iptables -nL -v --line-numbers
iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

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

การบันทึกกฎไฟร์วอลล์:

iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

กฎการคืนค่า:

iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

ที่นี่เราจะเห็นขั้นตอนที่คล้ายกัน (การบันทึกและการกู้คืนกฎไฟร์วอลล์ด้วยตนเอง) โดยใช้ไฟล์จำลองชื่อ iptables.dump แทนที่จะเป็นไฟล์เริ่มต้นดังที่แสดงไว้ด้านบน

iptables-save > iptables.dump

หากต้องการให้การเปลี่ยนแปลงเหล่านี้คงอยู่ตลอดการบู๊ต:

Ubuntu: ติดตั้งแพ็กเกจ iptables-persistent ซึ่งจะโหลดกฎที่บันทึกไว้ในไฟล์ /etc/iptables/rules.v4

apt-get install iptables-persistent

CentOS: เพิ่ม 2 บรรทัดต่อไปนี้ในไฟล์ /etc/sysconfig/iptables-config

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: แสดงรายการพอร์ต โปรโตคอล ที่อยู่ และอื่นๆ ที่อนุญาต (คั่นด้วยเครื่องหมายจุลภาค) ใน /etc/sysconfig/SuSEfirewall2

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

บทสรุป

ตัวอย่างที่ให้ไว้ในบทความนี้ แม้จะไม่ได้ครอบคลุมรายละเอียดทั้งหมดของ iptables แต่ก็มีจุดประสงค์ในการอธิบายวิธีเปิดใช้งานและปิดใช้งานการรับส่งข้อมูลขาเข้าหรือขาออก

สำหรับผู้ที่เป็นแฟนไฟร์วอลล์ โปรดทราบว่าเราจะกลับมาทบทวนหัวข้อนี้พร้อมกับแอปพลิเคชันที่เฉพาะเจาะจงมากขึ้นใน ส่วนที่ 10 ของซีรีส์ LFCE นี้

โปรดแจ้งให้เราทราบหากคุณมีคำถามหรือความคิดเห็น