Bài viết này sử dụng Lunix distro Ubuntu 22.04
Hiện nay đang có rất nhiều chương trình quản lý firewall trên linux. Phổ biến nhất là các chương trình: UFW, Firewalld, nftables.
Trong bài viết này chỉ tập trung trao đổi hướng dẫn cách sử dụng, quản lý bằng nftables.
1. Kiểm tra xem trên hệ thống có các dịch vụ quản lý firewall nào đang chạy
sudo firewall-cmd --list-services [FirewallD]
sudo firewall-cmd --list-ports
sudo ufw status [UFW Firewall]
sudo systemctl status nftables
sudo systemctl list-unit-files --type service --state enabled,generated
sudo apt purge iptables-persistent
sudo apt purge ufw
sudo ufw disable
2. Các lệnh với nftables
2.1. Kiểm tra phiên bản của NFT nftables
nft -v
nftables v1.0.6 (Lester Gooch #5)
2.2. Cài đặt nftables nếu chưa có
sudo apt install nftables
2.3. Xóa hết các rules
sudo nft flush ruleset
2.4. Bật nftables
Flush iptables và ip6tables, ufw để tránh xung đột:iptables -F
ip6tables -Fsudo apt purge iptables-persistent
sudo apt purge ufw
sudo ufw disable
Load kernel modules:
modprobe nf_tables
modprobe nf_tables_ipv4
modprobe nf_tables_ipv6
modprobe nf_tables_inet
systemctl start nftables
Lưu ý service nftable chỉ load file cấu hình chứ không chạy ở dạng deamon. Mặc định là apply luôn. Khi nhìn tình trạng ở lệnh status đang là Active (exited)
systemctl status nftables
● nftables.service – nftables
Loaded: loaded (/lib/systemd/system/nftables.service; enabled; preset: enabled)
Active: active (exited) since Sat 2024-04-20 09:17:04 +07; 4 weeks 0 days ago
Docs: man:nft(8)
http://wiki.nftables.org
Process: 250 ExecStart=/usr/sbin/nft -f /etc/nftables.conf (code=exited, status=0/SUCCESS)
Main PID: 250 (code=exited, status=0/SUCCESS)
CPU: 225ms
Apr 20 09:17:04 uptime59 systemd[1]: Finished nftables.service – nftables.
Notice: journal has been rotated since unit was started, output may be incomplete.
2.5. Kiểm tra tình trạng firewall
systemctl status nftables
nft ● nftables.service - nftables
Loaded: loaded (/lib/systemd/system/nftables.service; enabled; preset: enabled)
Active: active (exited) since Wed 2024-04-10 21:17:02 +07; 32min ago
Docs: man:nft(8)
http://wiki.nftables.org
Main PID: 252 (code=exited, status=0/SUCCESS)
CPU: 207ms
Apr 10 21:17:02 uptime59 systemd[1]: Finished nftables.service - nftables.
Notice: journal has been rotated since unit was started, output may be incomplete.
2.6 Khởi tạo các bảng firewall
Create filter table:# nft add table inet filter
Create input chain:# nft add chain inet filter input { type filter hook input priority 0 \; }
Cho phép các connection đã thiết lập được chấp nhậnnft add rule inet filter input ct state established,related counter accept
Cho phép ping (ICMP echo-request)
nft add rule inet filter input meta nfproto ipv4 icmp type { echo-request } counter accept
nft add rule inet filter input meta nfproto ipv6 icmpv6 type echo-request counter accept
Cho phép port ssh 22 và reject các port khác.
Cấu trúc lệnh:
nft add rule [<family>] <table> <chain> <matches> <statements>
nft add rule inet filter input tcp dport 22 ct state new tcp flags \& \(syn \| ack\) == syn counter accept
nft add rule inet filter input tcp dport 0-65535 reject
nft add rule inet filter input udp dport 0-65535 counter drop
nft add rule inet filter input counter drop
Kiêm tra các port trên hệ thống mình đang mở
sudo ss -4tuln
netstat -anp|grep LISTEN
Để bật chế độ logging, kernel module xt_LOG phải được load
modprobe xt_LOG
Lưu ý do không có log level nào cho nftables nên kết quả là tất cả sự kiện được log với level kern.emerg có khả năng làm quá tải hệ thống.
Để thử nghiệm nên disable kernel console logging tại file /etc/rsyslog.conf thêm dấu rào ”#” phía trước và khởi động lại logging daemon
#*.emerg :omusrmsg:*
Để cho phép kết nối đến port 22 và log lại thông tin sử dụng lệnh:
# nft add rule inet filter input tcp dport 22 ct state new tcp flags \& \(syn \| ack\) == syn log prefix \"inet/input/accept: \" counter accept
Liệt kê các rule, bảng đã có
sudo su -
for table in ip ip6 inet; do nft list table $table filter; done
sudo nft -s list ruleset
2.7. Kiểm tra nội dung file cấu hình
sudo cat /etc/nftables.conf
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state { established, related } accept
ct state invalid drop
iifname "lo" accept
ip protocol icmp accept
ip6 nexthdr ipv6-icmp accept
tcp dport { 22, 80, 443 } accept
udp dport {53, 67, 443, 1900, 5131, 5353} counter accept
# accept syncthing
# src: https://docs.syncthing.net/users/firewall.html
tcp sport 22000 counter accept comment "accept syncthing"
tcp dport 22000 counter accept comment "accept syncthing"
udp sport {21027, 22000} counter accept comment "accept syncthing"
udp dport {21027, 22000} counter accept comment "accept syncthing"
reject with icmp port-unreachable
}
chain forward {
type filter hook forward priority filter; policy accept;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
table inet f2b-table {
set addr-set-sshd {
type ipv4_addr
elements = { 24.128.147.10, 43.134.60.160,
218.92.0.56, 218.92.0.76 }
}
chain f2b-chain {
type filter hook input priority filter - 1; policy accept;
tcp dport 22 ip saddr @addr-set-sshd reject with icmp port-unreachable
}
}
2.8. Apply cấu hình từ file vào nftables
nft -f /etc/nftables.conf
2.9. Kiểm tra log file lần cuối khởi động nftables
journalctl --boot=-0 --unit=nftables.service
2.10. Lưu cấu hình đang chạy vào file
nft -s list ruleset | tee /etc/nftables.conf
Lưu ý thêm
#!/usr/sbin/nft -f
flush ruleset
2.11. Kiểm tra tình trạng nftables service.
Lưu ý service chỉ load file cấu hình chứ không chạy ở dạng deamon. Mặc định là apply luôn
systemctl status nftables.service
3. Tài liệu tham khảo
https://tldp.org/HOWTO/Linux+IPv6-HOWTO/index.html
https://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch18s05.html
https://freelinuxtutorials.com/nftables-recommended-configuration-on-ubuntu-linux/#google_vignette