Bookmark

Firewall4 và /etc/config/firewall trên OpenWrt

Từ OpenWrt 22.03, firewall4 (fw4) dùng nftables làm backend mặc định nhưng vẫn đọc cú pháp UCI quen thuộc trong /etc/config/firewall. Vì firewall chỉ bao phủ một tập hợp hợp lý của Netfilter, những rule nftables đặc biệt phải đi qua cơ chế include; không nên ép mọi thứ vào một config rule.1

Cảnh báo: Backup /etc/config/firewall trước khi sửa. Sau khi đổi, kiểm tra kỹ rồi mới reload; nếu khóa mất truy cập, dùng Failsafe để khôi phục. Không mở port Internet chỉ vì rule “trông đúng”.1

Quản lý bằng LuCI và UCI

Trong LuCI, vào Network → Firewall. LuCI ánh xạ gần với các section trong file nhưng có thể xóa các dòng comment #. Với CLI, uci sửa giá trị trong /etc/config/firewall; uci commit chỉ lưu thay đổi, còn cần reload firewall để sinh bảng mới. Nguồn cảnh báo rằng uci không hiểu nội dung script /etc/firewall.user.1

Tạo một rule từ UCI:

1
2
3
4
5
6
7
8
uci add firewall rule
uci set firewall.@rule[-1].name='Reject VPN to LAN traffic'
uci set firewall.@rule[-1].src='vpn'
uci set firewall.@rule[-1].dest='lan'
uci set firewall.@rule[-1].proto='all'
uci set firewall.@rule[-1].target='REJECT'
uci commit firewall
service firewall restart

Kiểm tra UCI đã tạo gì:

1
2
3
4
5
6
7
8
# uci show firewall
firewall.@rule[^20]=rule
firewall.@rule[^20].name='Reject VPN to LAN traffic'
firewall.@rule[^20].src='vpn'
firewall.@rule[^20].dest='lan'
firewall.@rule[^20].proto='all'
firewall.@rule[^20].target='REJECT'
...

Nếu muốn xem lỗi parse và chẩn đoán khi reload, dùng /etc/init.d/firewall reload hoặc fw4 reload, đọc toàn bộ output trước khi đóng phiên SSH.1

Các section cốt lõi

defaults

Defaults quyết định chính sách mặc định và các bảo vệ chung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
config defaults
	option	input			'ACCEPT'
	option	output			'ACCEPT'
	option	forward			'REJECT'
	option	custom_chains		'1'
	option	drop_invalid		'1'
	option	synflood_protect	'1'
	option	synflood_rate		'25/s'
	option	synflood_burst		'50'
	option	tcp_ecn			'1'
	option	tcp_syncookies		'1'
	option	tcp_window_scaling	'1'

zone

Zone gom một hoặc nhiều interface. Zone WAN thường bật masquerade và mtu_fix:

1
2
3
4
5
6
7
8
config zone
	option	name		'wan'
	option	network		'wan wan6'
	option	input		'REJECT'
	option	output		'ACCEPT'
	option	forward		'REJECT'
	option	masq		'1'
	option	mtu_fix		'1'

input là traffic đi vào chính router qua zone, output là traffic xuất phát từ router, còn forward là traffic đi xuyên qua. masq áp dụng NAT cho traffic IPv4 đi ra zone; thường dùng trên WAN.1

forwarding

Forwarding có hướng, không tự động hai chiều:

1
2
3
config forwarding
	option	src		'lan'
	option	dest		'wan'

Muốn cho hai zone đi qua lại, phải tạo hai forwarding với srcdest đảo chiều; đồng thời ít nhất một phía phải có connection tracking phù hợp, thường là zone có masq.1

rule

Rule lọc traffic theo zone, IP, MAC, port, protocol, family và target:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
config rule
	option	name		'Reject LAN to WAN for custom IP'
	option	src		'lan'
	option	src_ip		'192.168.1.2'
	option	src_mac		'00:11:22:33:44:55'
	option	src_port	'80'
	option	dest		'wan'
	option	dest_ip		'194.25.2.129'
	option	dest_port	'120'
	option	proto		'tcp'
	option	target		'REJECT'

Một ví dụ rule cho phép SSH từ mạng LAN cụ thể tới server:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
config rule
	option name             'forward ssh to server'
	option family           'ipv4'
	option src              'lan'
	option src_ip           '192.168.1.0/24'
	option dest             'lan'
	option dest_ip          '172.30.100.1'
	option proto            'tcp'
	option dest_port        '22'
	option target           'ACCEPT'

Nếu chỉ có src, rule áp dụng traffic đi vào router; chỉ có dest là traffic đi ra; có cả hai là traffic forwarding. src_ip/dest_ip nhận IP hoặc CIDR, port range dùng dạng start-stop, còn protofamily phải khớp traffic thật.1

redirect: DNAT và SNAT

DNAT chuyển traffic đến host nội bộ:

1
2
3
4
5
6
7
8
9
config redirect
	option	name		'DNAT WAN to LAN for SSH'
	option	src		'wan'
	option	src_dport	'19900'
	option	dest		'lan'
	option	dest_ip		'192.168.1.1'
	option	dest_port	'22'
	option	proto		'tcp'
	option	target		'DNAT'

SNAT đổi nguồn của traffic đi ra:

1
2
3
4
5
6
7
8
config redirect
	option	name		'SNAT DMZ 192.168.1.250 to WAN 1.2.3.4 for ICMP'
	option	src		'dmz'
	option	src_ip		'192.168.1.250'
	option	src_dip		'1.2.3.4'
	option	dest		'wan'
	option	proto		'icmp'
	option	target		'SNAT'

Với DNAT, src_dport phải chỉ rõ port nguồn nếu không muốn mở nhầm mọi port phù hợp các điều kiện còn lại. Kiểm tra từ Internet và giới hạn source khi có thể.1

IP sets

IP set dùng để match một danh sách địa chỉ thay vì viết nhiều rule. Khi đọc tài liệu, phân biệt option của fw3 và fw4, loại IP set, storage/match option và cách rule/redirect tham chiếu ipset. Không dùng tên set chưa được tạo; nếu package tạo set tự động thì kiểm tra thứ tự khởi động và log firewall.1

Include nftables trên fw4 (22.03+)

UCI firewall không bao phủ tất cả Netfilter. Với fw4, có hai cách: include snippet nftables vào vị trí trong table/chain, hoặc include shell script tương thích. Ví dụ snippet đặt trong chain:

1
2
3
4
5
6
7
8
9
# /etc/config/firewall
config include
	option	type		'nftables'
	option	path		'/etc/my_custom_firewall_rule.nft'
	option	position	'chain-pre'
	option	chain		'input_wan'
 
# /etc/my_custom_firewall_rule.nft
tcp dport 0-1023 log prefix "Inbound WAN connection attempt to low TCP port: "

Ví dụ include ở cuối table:

1
2
3
4
config include
	option	type		'nftables'
	option	path		'/etc/my_custom_firewall_chain.nft'
	option	position	'table-post'

Nếu dùng script /etc/firewall.user, khai báo type 'script' và đánh dấu script tương thích fw4:

1
2
3
4
5
config include
	option	enabled		1
	option	type		'script'
	option	path		'/etc/firewall.user'
	option	fw4_compatible	1

fw4 cũng có drop-in include tự động dưới /usr/share/nftables.d/ khi auto_includes bật. Các package có thể dùng hook này; không đặt script tùy tiện vào hook mà không kiểm tra thứ tự và phạm vi chain.1

Include kiểu fw3 và quy trình reload

Trên OpenWrt 21.02 trở về trước, type 'script'/etc/firewall.user là nhánh fw3 cũ; không mang nguyên ví dụ fw3 sang fw4 nếu chưa kiểm tra cú pháp nftables. Một include fw3 tối giản trong nguồn là:

1
2
config include
	option	path		'/etc/firewall.user'

Sau mọi thay đổi:

  1. Kiểm tra diff của /etc/config/firewall và file include.
  2. uci commit firewall nếu sửa bằng UCI.
  3. Chạy reload và đọc diagnostics.
  4. Kiểm tra truy cập LuCI/SSH, traffic LAN→WAN, zone isolation và port publish.
  5. Nếu mất kết nối, vào Failsafe và khôi phục backup.

Firewall là hợp đồng giữa zone, forwarding, rule, redirect và include. Build thành công không chứng minh chính sách an toàn; test thực tế trên từng hướng traffic.1

Nguồn


0 Bình luận

Góp Ý / Bình Luận / Đánh giá