Đã có sẵn mã hạt nhân có thể xử lý kết hợp chuỗi tùy ý, vẫn trong ngữ cảnh hạt nhân trong đường dẫn gói, tại sao không sử dụng lại nó?
iptables không đi đâu cả. những gì có thể có lẽ biến mất vào một ngày nào đó là API hạt nhân kế thừa dành cho iptables, chỉ để lại iptables-nft xung quanh, vẫn có thể sử dụng xtables các mô-đun như chuỗi trận đấu mô-đun. sử dụng iptables-di sản hoặc iptables-nft dọc theo nftables sẽ có kết quả tương tự bên dưới.
Có thể sử dụng các dấu để truyền thông báo xung quanh các hệ thống con mạng khác nhau trong đường dẫn gói, bao gồm từ nftables đến iptables và sau đó trở lại từ iptables đến nftables.
Cái này Ưu tiên trong hook bảng có thể giúp:
gia đình nftables |
móc điển hình |
từ khóa nft |
Giá trị |
Ưu tiên nội bộ của Netfilter |
Sự miêu tả |
[...] |
|
|
|
|
|
mạng, ip, ip6 |
tất cả các |
mang nặng đẻ đau |
-150 |
NF_IP_PRI_MANGLE |
Mangle hoạt động |
mạng, ip, ip6 |
định tuyến trước |
dstnat |
-100 |
NF_IP_PRI_NAT_DST |
NAT đích |
inet, ip, ip6, arp, netdev |
tất cả các |
lọc |
0 |
NF_IP_PRI_FILTER |
Thao tác lọc, bảng lọc |
[...] |
|
|
|
|
|
Người ta chỉ cần đăng ký nftables hai lần cho mỗi iptables' chuỗi tích hợp sẽ được tham gia: một lần với mức độ ưu tiên ngay trước đó iptables', một lần với mức độ ưu tiên ngay sau iptables'. Ví dụ: với chuỗi bộ lọc/OUTPUT với iptables ưu tiên 0, người ta có thể sử dụng -5 và 5 xung quanh nó. Thêm chi tiết trong này hai Unix/Linux SE Q/A nơi tôi đưa ra câu trả lời.
Ví dụ nhân tạo (phỏng theo một ví dụ trong iptables-tiện ích mở rộng(8)
) trộn nftables và iptables, nơi hệ thống sẽ bỏ các yêu cầu DNS được khởi tạo cục bộ cho địa chỉ DNS cụ thể www.netfilter.org, được trình bày theo thứ tự ưu tiên hook (báo trước: Chỉ UDP, chỉ hoạt động mà không có bất kỳ tùy chọn/tiêu đề IPv4 hoặc IPv6 nào trong gói gửi đi do phạm vi cố định, nhưng phạm vi có thể được nới lỏng để phù hợp với điều này):
nft thêm bảng inet mytable
nft add chain inet mytable outputbefore '{ loại filter hook ưu tiên đầu ra -5; chính sách chấp nhận; }'
nft add rule inet mytable outputbefore udp dport 53 meta mark set 1
iptables -I OUTPUT -m mark --mark 1 -m string --algo bm --từ 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
ip6tables -I OUTPUT -m mark --mark 1 -m string --algo bm --từ 60 --to 77 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
nft add chain inet mytable outputafter '{ ưu tiên đầu ra hook bộ lọc loại 5; chính sách chấp nhận; }'
nft thêm quy tắc inet đầu ra mytable sau khi đánh dấu meta 2 giảm
Mục tiêu ở đây là có iptables chỉ xử lý phần không thể xử lý nftables và chỉ thực hiện công việc tối thiểu: đưa ra giá trị trả về thông qua một dấu, để lại nftables chịu trách nhiệm về số phận của gói tin:
- nftables đặt dấu của gói thành 1 để "hỏi" iptables để thực hiện một số công việc
- iptables (hoặc ip6tables) chỉ thực hiện khớp chuỗi nếu nó "nhận" điểm 1, để tiết kiệm việc sử dụng CPU và "câu trả lời" 2 nếu chuỗi khớp trong trường hợp đó
- nftables chỉ loại bỏ gói nếu nó "nhận" một dấu giá trị 2 (do đó xóa iptables quy tắc cũng vô hiệu hóa hiệu ứng)
Ghi chú:
báo trước
Cơ chế giao tiếp giữa nftables và iptables là thông qua nhãn gói (hoặc cũng có thể thông qua theo dõi connmark). Mặc dù chỉ có thể ghi và đọc từ một vài bit của nhãn hiệu (bằng cách sử dụng mặt nạ tùy chọn trên nhãn hiệu và các thao tác theo bit thích hợp), mọi người dùng nhãn hiệu sau đó phải tôn trọng một số quy ước phân bổ quyền sở hữu các bit trong nhãn hiệu. Không có điều này, các công cụ sẽ can thiệp lẫn nhau khi xử lý nhãn hiệu. Ví dụ tường lửa sử dụng các dấu để xử lý chuyển hướng trong quy tắc, vì vậy ví dụ này có thể không tương thích với tường lửa, ngay cả khi nó sử dụng các bảng riêng của nó khi sử dụng nftables phụ trợ.
Một số trường hợp dễ dàng có thể sử dụng tải trọng thô
Ví dụ cụ thể ở trên, với đã sửa bù đắp, có thể đã được thực hiện với nftables. Đó là khi có một phần bù tùy ý để tìm dữ liệu (được sử dụng tốt nhất với iptables' chuỗi khớp) hoặc một phương thức phức tạp để tính toán phần bù đó (được sử dụng tốt nhất với iptables' u32 phù hợp) đó nftables không sử dụng được.
Đây là cách thay thế tương đương tất cả các quy tắc ở trên bằng một quy tắc duy nhất sử dụng tải trọng thô. Cú pháp chỉ cho phép tối đa 128 bit, nhưng ở đây cần 19x8=152 bit nên nó phải được chia thành hai tải trọng thô (128 bit + 24 bit). bản inf
, xxd
và cắt tỉa
cũng được sử dụng cho một số trợ giúp:
nft thêm bảng inet mytable
nft add chain inet mytable output '{ ưu tiên đầu ra hook filter loại 0; chính sách chấp nhận; }'
nft thêm đầu ra inet mytable udp dport 53 \
@th,160,128 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c-32) \
@th,288,24 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c33-) \
rơi vãi
Với đầu ra của printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p
hiện tại:
03777777096e657466696c746572036f726700
để có được hai trọng tải thô:
0x03777777096e657466696c746572036f
0x726700
các phương pháp khác có thể có sẵn
iptables có thể gọi một đối tượng eBPF (dù sao thì chỉ những hạt nhân gần đây mới cho phép các vòng lặp (hữu hạn) thử và thực hiện một số thuật toán một cách dễ dàng), nftables thiếu tính năng này. Vì vậy, nó một lần nữa với một dấu ấn và iptables.
đối tượng eBPF như vậy có thể là được sử dụng với XDP hoặc tc nhưng nó có thể là quá sớm trong đường dẫn gói (ví dụ: không có NAT trạng thái) và yêu cầu lập trình thực tế hơn là quản trị. Dù sao thì đó lại là giao tiếp thông qua nhãn hiệu nếu các quyết định phải được xử lý bằng nftables.