ใน CentOS 7 FirewallD ดูเหมือนว่าจะกำหนดค่ากฎการกรองการเข้าชม เป็นเครื่องมือที่แนะนำให้ใช้ในการจัดการกฎ iptables CentOS 8 กำลังใช้ nftables กรอบงานแทนบริการกรองแพ็คเก็ต iptables มาตรฐาน และเมื่อคุณกำหนดค่ากฎไฟร์วอลล์ในไฟร์วอลล์ แสดงว่าคุณกำลังกำหนดค่า nftables จริงๆ ในบทความนี้ เราจะพิจารณาวิธีการติดตั้งและกำหนดค่าไฟร์วอลล์บนเซิร์ฟเวอร์ที่ใช้ Linux CentOS 8 (และ CentOS 7) และแนวคิดหลักของไฟร์วอลล์นี้
ไฟร์วอลล์D เป็นบริการไฟร์วอลล์ที่ใช้เพื่อป้องกันเซิร์ฟเวอร์จากการรับส่งข้อมูลที่ไม่ต้องการ รองรับการจัดการกฎไฟร์วอลล์แบบไดนามิก (โดยไม่ต้องรีสตาร์ท) มันทำงานเป็นอินเทอร์เฟซสำหรับ iptables และ nftables FirewallD สามารถใช้ได้กับ Linux distros เกือบทั้งหมด
แนวคิดพื้นฐานของไฟร์วอลล์:โซนและกฎ
ก่อนการติดตั้งและการกำหนดค่าของ firewalld เราจะเรียนรู้ว่าโซนใดบ้างที่ใช้ในการกำหนดระดับความไว้วางใจต่อการเชื่อมต่อต่างๆ คุณสามารถใช้กฎการกรองต่างๆ กับ ไฟร์วอลล์ โซน ตั้งค่าตัวเลือกไฟร์วอลล์ที่ใช้งานอยู่สำหรับบริการที่กำหนดไว้ล่วงหน้า โปรโตคอลหรือพอร์ต การส่งต่อพอร์ต และกฎที่หลากหลาย
ไฟร์วอลล์ กำลังกรองการรับส่งข้อมูลขาเข้าตามโซนขึ้นอยู่กับกฎที่ใช้กับโซน หากที่อยู่ IP ของผู้ส่งตรงกับกฎของโซน แพ็กเก็ตจะถูกส่งผ่านโซนนี้ หากที่อยู่ IP ไม่ตรงกับโซนใดโซนหนึ่งที่กำหนดค่าบนเซิร์ฟเวอร์ โซนเริ่มต้นจะประมวลผลแพ็กเก็ต เมื่อคุณติดตั้ง firewalld โซนเริ่มต้นจะเรียกว่าสาธารณะ
Firewalld มีบางโซนที่มีสิทธิ์ที่กำหนดไว้ล่วงหน้าสำหรับบริการต่างๆ คุณสามารถใช้การตั้งค่าเหล่านี้หรือสร้างโซนของคุณเอง นี่คือรายการโซนเริ่มต้นที่สร้างขึ้นเมื่อคุณติดตั้ง firewalld (อยู่ใน /usr/lib/firewalld/zones/):
ดรอป | มีระดับความน่าเชื่อถือขั้นต่ำ การเชื่อมต่อขาเข้าทั้งหมดถูกบล็อกโดยไม่มีการตอบสนอง อนุญาตเฉพาะการเชื่อมต่อขาออกเท่านั้น |
บล็อก | โซนนี้คล้ายกับโซนก่อนหน้า แต่คำขอที่เข้ามาจะถูกปฏิเสธโดยมี icmp-host-prohibited ข้อความสำหรับ IPv4 หรือ icmp6-adm-prohibited ข้อความสำหรับ IPv6 |
สาธารณะ | ใช้สำหรับเครือข่ายสาธารณะที่ไม่น่าเชื่อถือ คุณสามารถอนุญาตการเชื่อมต่อขาเข้าทีละรายการได้ |
ภายนอก | หมายถึงเครือข่ายภายนอกใดๆ เมื่อใช้ไฟร์วอลล์ของคุณเป็นเกตเวย์ ใช้เพื่อปิดบัง NAT ดังนั้นเครือข่ายภายในของคุณจึงยังคงเป็นส่วนตัว แต่พร้อมใช้งาน |
ภายใน | เป็นคำตรงข้ามของโซนภายนอก โฮสต์มีระดับความเชื่อถือเพียงพอ สามารถเข้าถึงบริการเพิ่มเติมได้ |
dmz | โซนนี้ใช้สำหรับคอมพิวเตอร์ในโซนปลอดทหาร (DMZ) และรวมถึงคอมพิวเตอร์แยกต่างหากซึ่งไม่สามารถเข้าถึงเครือข่ายของคุณได้ อนุญาตเฉพาะการเชื่อมต่อขาเข้าที่เลือกเท่านั้น |
งาน | เป็นโซนสำหรับคอมพิวเตอร์ที่ทำงานของคุณ (คอมพิวเตอร์ส่วนใหญ่ในเครือข่ายเชื่อถือได้) |
บ้าน | หมายถึงเครือข่ายในบ้าน คุณสามารถเชื่อถือคอมพิวเตอร์เครื่องอื่นๆ ได้เกือบทั้งหมด แต่รองรับเฉพาะการเชื่อมต่อขาเข้าที่เลือกเท่านั้น |
วางใจ | คอมพิวเตอร์ทุกเครื่องในเครือข่ายเชื่อถือได้ เป็นตัวเลือกที่เปิดกว้างที่สุดที่ต้องใช้อย่างรับผิดชอบ |
ไฟร์วอลล์ ใช้กฎสองชุด — ถาวรและรันไทม์ กฎรันไทม์จะทำงานจนกว่าเซิร์ฟเวอร์จะรีสตาร์ท โดยค่าเริ่มต้น กฎที่คุณเพิ่มใน ไฟร์วอลล์ ถือเป็นรันไทม์ . หากต้องการเพิ่มกฎถาวร คุณต้องใช้ –ถาวร ธง. กฎเหล่านี้จะถูกนำไปใช้หลังจากรีสตาร์ทเซิร์ฟเวอร์
จะติดตั้งและเปิดใช้งาน FirewallD ใน CentOS ได้อย่างไร
ใน CentOS 7/8 firewalld จะถูกติดตั้งตามค่าเริ่มต้นระหว่างการติดตั้ง OS หากคุณลบ firewalld และต้องการติดตั้งกลับ คุณสามารถใช้ตัวจัดการแพ็คเกจ yum/dnf มาตรฐานได้:
# yum install firewalld -y
— บน Centos 7# dnf install firewalld -y
— บน Centos 8
เพื่อให้ firewalld daemon เริ่มเพิ่มโดยอัตโนมัติในการเริ่มต้น:
# systemctl enable firewalld
และเริ่มเลย:
# systemctl start firewalld
ตรวจสอบสถานะการให้บริการ:
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) Docs: man:firewalld(1) Main PID: 13646 (firewalld) CGroup: /system.slice/firewalld.service └─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid systemd[1]: Starting firewalld - dynamic firewall daemon...
หรือทำโดยใช้คำสั่งนี้:
# firewall-cmd --state
# firewall-cmd --state
running
การจัดการกฎ FirewallD
กฎไฟร์วอลล์เริ่มต้น
ก่อนกำหนดค่ากฎไฟร์วอลล์ คุณควรตรวจสอบว่าโซนใดเป็นค่าเริ่มต้น:
# firewall-cmd --get-default-zone
เนื่องจากเราเพิ่งติดตั้ง firewalld และยังไม่ได้กำหนดค่า โซนเริ่มต้นจะเป็น สาธารณะ .
ตรวจสอบโซนที่ใช้งานอยู่ มีโซนเดียวเท่านั้น — สาธารณะ:
# firewall-cmd --get-active-zones
public interfaces: eth0
อย่างที่เราเห็น อินเทอร์เฟซ eth0 ได้รับการจัดการโดย สาธารณะ โซน.
คุณสามารถแสดงรายการอินเทอร์เฟซเครือข่าย CentOS ได้ดังนี้:
# ip link show
หรือ:# nmcli device status
หากต้องการดูกฎของโซนที่ใช้งานอยู่ให้ใช้คำสั่ง:
# firewall-cmd --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
ในรายการนี้ คุณจะเห็นว่ามีการเพิ่มการดำเนินการทั่วไปที่เกี่ยวข้องกับไคลเอ็นต์ DHCP และ SSH ลงในโซน
โซนที่มีจำหน่าย
หากต้องการดูรายการโซนทั้งหมด ให้รันคำสั่งนี้:
# firewall-cmd --get-zones
ฉันได้รับรายการต่อไปนี้:
block dmz drop external home internal public trusted work
หากต้องการดูกฎของโซนใดโซนหนึ่ง ให้เพิ่มแฟล็ก -zone ในคำสั่ง:
# firewall-cmd --zone=home --list-all
home target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
คุณสามารถดูกฎของโซนทั้งหมด:
# firewall-cmd --list-all-zones
จะเปลี่ยนโซนเริ่มต้นได้อย่างไร
โดยค่าเริ่มต้น อินเทอร์เฟซเครือข่ายทั้งหมดจะอยู่ในสาธารณะ โซน แต่สามารถย้ายไปยังโซนใดก็ได้ด้วยคำสั่ง:
# firewall-cmd --zone=home —change-interface=eth0
ระบุโซนที่คุณต้องการหลัง –zone= พารามิเตอร์
หากต้องการเปลี่ยนโซนเริ่มต้นเป็นโฮม ให้เรียกใช้คำสั่งนี้:
# firewall-cmd --set-default-zone=home
จะเพิ่มกฎของแอปใน FirewallD ได้อย่างไร
หากต้องการเปิดพอร์ตสำหรับแอป คุณสามารถเพิ่มบริการเป็นข้อยกเว้นได้ นี่คือวิธีการแสดงรายการบริการที่มี:
# firewall-cmd --get-services
ผลลัพธ์จะมีบริการมากมาย ข้อมูลโดยละเอียดเกี่ยวกับบริการมีอยู่ใน XML ไฟล์. ไฟล์เหล่านี้อยู่ใน /usr/lib/firewalld/services
ตัวอย่างเช่น:
# cd /usr/lib/firewalld/services
# cat smtp.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>Mail (SMTP)</short> <description>This option allows incoming SMTP mail delivery. If you need to allow remote hosts to connect directly to your machine to deliver mail, enable this option. You do not need to enable this if you collect your mail from your ISP's server by POP3 or IMAP, or if you use a tool such as fetchmail. Note that an improperly configured SMTP server can allow remote machines to use your server to send spam.</description> <port protocol="tcp" port="25"/> </service>
ไฟล์ XML ประกอบด้วยคำอธิบายบริการ โปรโตคอล และจำนวนพอร์ตที่จะเปิดในไฟร์วอลล์
เมื่อเพิ่มกฎ คุณสามารถใช้ –add-service พารามิเตอร์เพื่ออนุญาตให้ไฟร์วอลล์เข้าถึงบริการเฉพาะ:
# firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone=public --add-service=https
หลังจากเพิ่มกฎแล้ว คุณจะตรวจสอบได้ว่าเพิ่มบริการไปยังโซนที่ระบุแล้วหรือไม่:
# firewall-cmd --zone=public --list-services
dhcpv6-client http https ssh
หากคุณต้องการทำให้กฎถาวร ให้ใช้ปุ่ม –ถาวร พารามิเตอร์เมื่อเพิ่มเข้าไป
วิธีลบบริการออกจากโซน:
# firewall-cmd --permanent --zone=public --remove-service=http
# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client https ssh test
หากคุณต้องการเพิ่มบริการของคุณในข้อยกเว้น yj คุณสามารถสร้าง XML ไฟล์ตัวเองและระบุข้อมูลที่นั่น คุณสามารถคัดลอกข้อมูลจากบริการใดๆ และเปลี่ยนชื่อ คำอธิบาย และหมายเลขพอร์ต
คัดลอก smtp.xml ไปยังไดเร็กทอรีสำหรับบริการผู้ใช้:
# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services
เปลี่ยนรายละเอียดบริการในไฟล์
ต้องเปลี่ยนชื่อไฟล์ XML ด้วย (ฉันเรียกบริการของฉันว่า ทดสอบ ). จากนั้นรีสตาร์ท firewalld และตรวจดูให้แน่ใจว่าบริการของคุณปรากฏในรายการ:
# firewall-cmd --get-services
syslog-tls telnet test tftp
คุณสามารถเพิ่มบริการไปยังโซนใดก็ได้:
# firewall-cmd --zone=public --add-service=test --permanent
# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http https ssh test
หากคุณไม่พบบริการในรายการ คุณสามารถเปิดพอร์ตที่คุณต้องการในไฟร์วอลล์โดยใช้คำสั่งนี้:
# firewall-cmd --zone=public —add-port=77/tcp
— เปิด TCP พอร์ต 77# firewall-cmd --zone=public —add-port=77/udp
— เปิด UDP พอร์ต 77# firewall-cmd --zone=public —add-port=77-88/udp
— เปิด UDP ช่วงพอร์ต 77-88# firewall-cmd --zone=public —list-ports
— แสดงรายการพอร์ตที่อนุญาต
วิธีบล็อก/อนุญาตคำขอ ICMP:
# firewall-cmd --zone=public --add-icmp-block=echo-reply
# firewall-cmd --zone= public --remove-icmp-block=echo-reply
วิธีลบพอร์ตที่เพิ่ม:# firewall-cmd --zone=public —remove-port=77/udp
— ลบกฎรันไทม์สำหรับ UDP พอร์ต 77
# firewall-cmd --permanent --zone=public —remove-port=77/udp
— ลบกฎถาวร
จะสร้างโซนใหม่ใน FirewallD ได้อย่างไร
คุณสามารถสร้างโซนของคุณเองได้ (ฉันจะเรียกมันว่า ของเรา ):
# firewall-cmd --permanent --new-zone=our
หลังจากสร้างโซนใหม่ เช่น หลังจากสร้างบริการ คุณจะต้องรีสตาร์ท firewalld :
# firewall-cmd --reload
# firewall-cmd --get-zones
block dmz drop external home internal our public trusted work
ของเรา โซนได้. คุณสามารถเพิ่มบริการหรือเปิดบางพอร์ตได้
ไฟร์วอลล์:วิธีบล็อกที่อยู่ IP และสร้างข้อยกเว้น
คุณเพิ่มที่อยู่ IP ที่เชื่อถือได้ให้กับข้อยกเว้นของไฟร์วอลล์หรือบล็อกที่อยู่ IP ที่ไม่ต้องการได้
ในการเพิ่มที่อยู่ IP (เช่น 8.8.8.8) o ข้อยกเว้นบนเซิร์ฟเวอร์ของคุณโดยใช้ไฟร์วอลล์ ให้รันคำสั่งนี้:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.8.8" accept'
ตรวจสอบโซนและตรวจสอบให้แน่ใจว่า ที่อยู่ IP ได้รับการเพิ่มข้อยกเว้นในกฎรวย:
# firewall-cmd --zone=public --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept
หากต้องการบล็อกที่อยู่ IP ให้แทนที่ ยอมรับ กับ ปฏิเสธ :
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.4.4" reject'
# firewall-cmd --zone=public --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept rule family="ipv4" source address="8.8.4.4" reject
คุณสามารถอนุญาตให้บริการยอมรับคำขอจากที่อยู่ IP เฉพาะเท่านั้น:
#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" service name="https" accept'
หากคุณต้องการบล็อกคำขอทั้งหมดที่ส่งถึงเซิร์ฟเวอร์ของคุณอย่างรวดเร็ว ให้ใช้คำสั่งแพนิค:
# firewall-cmd --panic-on
คุณสามารถปิดการใช้งานโหมดตื่นตระหนกด้วยคำสั่งนี้:
# firewall-cmd --panic-off
หรือโดยการรีสตาร์ทเซิร์ฟเวอร์ของคุณ
คุณสามารถบล็อกการกำหนดค่าไฟร์วอลล์เพื่อให้บริการในพื้นที่ที่มีสิทธิ์ของรูทไม่สามารถเปลี่ยนกฎไฟร์วอลล์ที่คุณสร้างขึ้นได้:
# firewall-cmd --lockdown-on
วิธีปิดโหมดล็อกดาวน์:
# firewall-cmd --lockdown-off
การกำหนดค่าการส่งต่อพอร์ตด้วย FirewallD
คุณสามารถสร้างกฎการส่งต่อพอร์ตในไฟร์วอลล์ ในการส่งต่อพอร์ต TCP 443 ถึง 9090:
# firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=9090 --permanent
วิธีลบกฎการส่งต่อพอร์ต:
# firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=9090