Quản lý firewall trên Linux với NFT

Quản lý firewall trên Linux với NFT

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 -F

sudo 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ận
nft 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

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply