Firewalld là công cụ hoàn toàn mới trong họ nhà RHEL 7. Nó là giải pháp firewall toàn diện, mục đích là thay thế iptables vì iptables sẽ ngừng phát triển trong tương lai. Tuy hiện tại ta vẫn có thể sử dụng iptables thông qua cài đặt yum nhưng sẽ không thể sử dụng đồng thời các rule của iptables và firewalld trên cùng một hệ thống. Firewalld tăng cường khả năng quản lý rules bằng cách cho phép thay đổi các cấu hình trực tiếp mà không ảnh hưởng đến các kết nối hiện tại.
Để kiểm tra hoạt động của Firewalld :
# systemctl status firewalld firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled) Active: active (running) since Tue 2014-06-17 11:14:49 CEST; 5 days ago ...
hoặc:
# firewall-cmd --state running
1Hosting sẽ mô tả chi tiết các thành phần và cách thức hoạt động của Firewalld qua các ví dụ sau:
Khác với iptables sử dụng các INPUT, OUTPUT & FORWARD CHAINS, Firewalld sử dụng các zone để quản lý. Các interface cần phải được gán vào các zone để hoạt động. Zone định nghĩa mức allow/deny đến các interface. Một zone có thể chứa các services và ports.
Firewalld sử dụng các zone như sau:
1. Drop Zone: Các packet sẽ bị droptương tự sử dụng lệnh iptables -j drop.
2. Block Zone: Deny việc mở các kết nối mới đến và reject trả về một icmp-host-prohibited. Chỉ các established connections mới được cho phép
3. Public Zone: Allow các connections đã được định nghĩa với port cụ thể trong các rules.
4. External Zone: Zone này hoạt động như một router với tính năng masquerading.
5. DMZ Zone: Zone này cho phép các services cụ thể kết nối ra ngoài internet hay nhận về những kết nối đã được lựa chọn trước.
6. Work Zone: Ở zone này, chúng ta chỉ có thể định nghĩa các internal networks như private networks.
7. Home Zone: được sử dụng cho những máy tính an toàn, không ảnh hưởng đến máy tính khác trong mạng.
8. Internal Zone: Tương tự work zone ở trên với tính năng allow connections.
9. Trusted Zone: Zone này Allow mọi kết nối đi qua
Public zone và Private zone là 2 zone cơ bản của hệ thống Centos 7. Để list default zone ta dùng lệnh sau:
# firewall-cmd --get-default-zone public
Để list zones và interface đang kết nối:
# firewall-cmd --get-active-zones public interfaces: eth0
List tất cả các zone đang hoạt động:
# firewall-cmd --get-zones block dmz drop external home internal public trusted work
Thay đổi default zone (sang home):
# firewall-cmd --set-default-zone=home success
Chú ý: Các thông tin ở trên đều có trong file /etc/firewalld/firewalld.conf
Network interfaces có thể được gán cứng vào 1 zone. Ví dụ để gán cứng eth0 network interface vào internal zone (file internal.xml sẽ được tạo trong thư mục /etc/firewalld/zones):
# firewall-cmd --permanent --zone=internal --change-interface=eth0 success # nmcli con show | grep eth0 System eth0 4de55c95-2368-429b-be65-8f7b1a357e3f 802-3-ethernet eth0 # nmcli con mod "System eth0" connection.zone internal # nmcli con up "System eth0" Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/1)
Chú ý: Việc trên cũng có thể thực hiện bằng cách thay đổi file /etc/sysconfig/network-scripts/ifcfg-eth0 và add ZONE=internalf, sau đó chạy # nmcli con reload (nmcli sẽ trình bày ở bài viết sau).
Để xem zone nào đang gán vào interface:
# firewall-cmd --get-zone-of-interface=eth0 internal
Để tạo zone mới:
# firewall-cmd --permanent --new-zone=test success # firewall-cmd --reload success
Note: Các zones mới phải có tùy chọn –permanent
Một interfaces có thể có nhiều zone trên đó.
Đặc biệt chú ý: Firewalld dựa trên NetworkManager. Điều đó có nghĩa nếu muốn stop NetworkManager ta cũng phải stop firewalld và sử dụng Iptables thay thế.
Để add source (192.168.2.0/24) vào zone (trusted) permanently ta làm như sau:
# firewall-cmd --permanent --zone=trusted --add-source=192.168.2.0/24 success # firewall-cmd --reload success
Để list các source đang gán vào một zone:
# firewall-cmd --zone=trusted --list-sources 192.168.2.0/24
Kiểm tra các active zone:
# firewall-cmd --get-active-zones public interfaces: eth0 trusted sources: 192.168.2.0/24
Ví dụ dưới đây cho phép kết nối đến server từ những source là địa chỉ IP cụ thể:
# firewall-cmd --zone=internal --add-service=ssh --permanent success # firewall-cmd --zone=internal --add-source=1.2.3.4/32 --permanent success # firewall-cmd --zone=public --remove-service=ssh --permanent success # firewall-cmd --reload success
Sau khi đã gán interface vào các zone mong muốn, ta cần add service vào mỗi zone. Ví dụ là add cứng (có 2 trạng thái là add tạm thời – immediate và add cứng – permanent) http service vào internal zone:
# firewall-cmd --permanent --zone=internal --add-service=http success # firewall-cmd --reload success
Nếu muốn add tạm thời nhiều services thì như sau:
# firewall-cmd --zone=internal --add-service={http,https,dns} success
Để list các services trong default zone:
# firewall-cmd --list-services dhcpv6-client ssh
Note: Để list các services của một zone cụ thể, add thêm – -zone= option.
Trong firewalld, các cấu hình của main services nằm trong thư mục /usr/lib/firewalld/services. Nhưng ta vẫn có thể thêm mới trong thư mục /etc/firewalld/services. Ví dụ thêm HAProxy service. Trước tiên tạo file /etc/firewalld/services/haproxy.xml và paste nội dung sau:
<?xml version="1.0" encoding="utf-8"?> <service> <short>HAProxy</short> <description>HAProxy load-balancer</description> <port protocol="tcp" port="80"/> </service>
Note: Ta có thể sử dụng lệnh firewall-cmd –permanent –new-service=haproxy để tạo file cấu hình tương ứng
Gán SELinux context và file permissions cho haproxy.xml:
# cd /etc/firewalld/services # restorecon haproxy.xml # chmod 640 haproxy.xml
Add HAProxy service vào default zone permanently và reload lại cấu hình:
# firewall-cmd --permanent --add-service=haproxy success # firewall-cmd --reload success
Port management có cách hoạt động giống hệt như service management. Chẳng hạn, để allow port 443/tcp tạm thời trong internal zone:
# firewall-cmd --zone=internal --add-port=443/tcp success
Chú ý 1: Nếu muốn allow vĩnh viễn thêm tùy chọn – –permanent và reload lại.
Chú ý 2: Nếu bỏ port thì dùng option – -remove-port=443/tcp
Để list các ports đang mở trong internal zone:
# firewall-cmd --zone=internal --list-ports 443/tcp
Một cách khác để tạo các rules cụ thể là sử dụng chế độ direct (chẳng hạn mở tcp port 9000):
# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT success
Chú ý: Không cần lệnh reload , tất cả các lệnh đều là directly activated.
Để hiện thị các direct rules:
# firewall-cmd --direct --get-all-rules
Các cấu hình được ghi lại trong file /etc/firewalld/direct.xml
Đôi khi ta cần phải download một vài module đặc biệt. Thay vì sử dụng rc.local file để khởi động, ta dùng Firewalld load qua thư mục /etc/modules-load.d .Trong ví dụ này ta add thêm modules ip_nat_ftp và ip_conntrack_ftp để theo dõi ftp connections.
# echo ip_nat_ftp > /etc/modules-load.d/firewall_ftp.conf # echo ip_conntrack_ftp >> /etc/modules-load.d/firewall_ftp.conf
Ta cần phân biệt giữa iptables service
và iptables
command. firewalld
chỉ là bộ manager thay thế cho iptables services, còn nó vẫn sử dụng các lệnh iptables
để giao tiếp với kernel packet filter (netfilter).
Để lưu các cấu hình ra file, dùng lệnh:
# iptables -S > firewalld_rules_ipv4 # ip6tables -S > firewalld_rules_ipv6