ฉันใช้สคริปต์นี้เพื่อตั้งค่าไฟร์วอลล์ของฉัน ฉันคาดว่าจะมีการเข้าถึง ssh จาก IP เดียวเท่านั้น แต่นั่นไม่ใช่กรณีหลังจากการทดสอบ ขาดอะไรไป?

#!/bin/bash
#
# Reset to initial install of firewalld
#
rm -f /etc/firewalld/zones/*
firewall-cmd --complete-reload
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
#
# Create / Setup custom zone
#
firewall-cmd --new-zone calzone --permanent
firewall-cmd --reload
firewall-cmd --zone=calzone --add-service={ssh,dhcpv6-client}
firewall-cmd --zone=calzone --add-source=10.0.0.177
firewall-cmd --change-interface enp1s0 --zone calzone --permanent
firewall-cmd --runtime-to-permanent
firewall-cmd --reload

เมื่อฉันรัน: firewall-cmd --get-active-zones ฉันได้รับสิ่งต่อไปนี้

calzone
  interfaces: enp1s0
  sources: 10.0.0.177

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

เพื่อตอบสนองต่อความคิดเห็นของ Nasir คำสั่งนี้ firewall-cmd --list-all-zones | sed -n '/calzone/,/rich/p' สร้าง:

calzone (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 10.0.0.177
  services: dhcpv6-client ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

ฉันยังรีสตาร์ท deamon firewalld และสามารถ ssh จาก 10.0.0.188 ฉันคาดว่าจะเข้าถึงได้เฉพาะจาก 10.0.0.177

answer

หลังจากอ่านเอกสาร RedHat firewalld เป็นเวลาหลายชั่วโมงและเขียนสคริปต์อย่างต่อเนื่อง ฉันก็จัดการเพื่อให้ได้พฤติกรรมที่ต้องการ อย่างไรก็ตาม ฉันไม่มั่นใจ 100% เพราะฉันยังไม่ชัดเจนว่าทำไมการตั้งค่าอินเทอร์เฟซจึงไม่ทำงาน อย่างไรก็ตามสคริปต์นี้ดูเหมือนจะใช้งานได้ ฉันใช้โซนงานที่มีอยู่ซึ่งดูเหมือนว่าจะเปิดใช้งานเมื่อฉันเพิ่มแหล่งที่มาเข้าไป

#!/bin/bash
#
# Reset to initial install of firewalld
#
rm -f /etc/firewalld/zones/*
firewall-cmd --complete-reload
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
systemctl restart firewalld
systemctl status firewalld
#
# Remove the services from all zones
#  
# iterate through the default zones
for zone in drop block public external dmz work home internal trusted
do
# iterate through default services
    for srv in $(firewall-cmd --list-services --zone=$zone)
    do
      echo "Removing service $srv from $zone"
      firewall-cmd --zone=$zone --remove-service=$srv
      firewall-cmd --zone=$zone --remove-service=$srv --permanent
    done
done
#
# Drop all public traffic?
# Allow work zone to see ssh from host
#
firewall-cmd --zone=public --set-target=DROP --permanent
firewall-cmd --zone=work --add-source=10.0.0.177 --permanent
firewall-cmd --zone=work --add-service=ssh --permanent
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
systemctl restart firewalld
systemctl status firewalld