docker compose pull && docker compose up -d
可以通过在 compose 文件中设置 watchtower 来定期自动拉取最新镜像并启动容器,同时可以配置删除旧镜像和容器。
在 docker-compose.yml 文件中增加以下内容:
version: '3'
services:
...
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 3600 --cleanup --remove-volumes
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_REMOVE_VOLUMES=true
以下是主要的配置说明:
--interval
参数设置为 3600。这意味着 Watchtower 将每 3600 秒(即每小时)检查一次更新。--cleanup
和 WATCHTOWER_CLEANUP=true
确保在更新后清理旧的镜像。--remove-volumes
和 WATCHTOWER_REMOVE_VOLUMES=true
确保删除与旧容器关联的匿名卷。使用这个配置,Watchtower 将:
这个配置应该能满足大多数用例的需求,既能保持你的容器相对最新,又不会过于频繁地进行检查和更新操作。
需要注意的是:
docker image prune
命令。核心就是通过 alias 关联文件路径。
配置文件如下:
location /test.log {
alias /home/script/igd/app.log;
default_type text/plain;
add_header Content-Type "text/plain; charset=utf-8";
charset utf-8;
# 确保不会缓存内容
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
location 路径替换为需要的路径。alias 设置文件实际路径。
]]>参考之前的文章:https://blog.niekun.net/archives/413.html
确定您的 shell 类型。打开终端,运行以下命令:
echo $SHELL
这通常会返回 /bin/zsh 或 /bin/bash。
根据您的 shell 类型,编辑相应的配置文件:
对于 Zsh(最新的 macOS 默认使用):编辑 ~/.zshrc
对于 Bash:编辑 ~/.bash_profile 或 ~/.bashrc
使用文本编辑器打开相应的文件。例如,对于 zsh:
vim ~/.zshrc
在文件末尾添加以下行(替换为您的实际脚本目录路径):
export PATH="/path/script:$PATH"
保存并关闭文件。使更改生效,可以重新加载配置文件或重启终端。要重新加载,运行:
source ~/.zshrc # 如果使用 Zsh
source ~/.bash_profile # 如果使用 Bash
验证 PATH 更新:
echo $PATH
您应该能看到您的脚本目录已被添加。现在,您应该能够直接运行脚本,而不需要指定完整路径:
test.sh
注意事项:
chmod +x script_name.sh
)。ffmpeg -i input.mov -c:v libx264 -crf 30 -r 24 -movflags faststart -c:a aac -b:a 128k -preset superfast out.mp4
但是每次在命令行执行这么复杂的命令还是很不方便的,可以使用 macOS 自带的 automator 自动化工具制作一个简单的右键菜单动作,方便的对视频文件快速压缩。
打开 automator 新建一个 quick action,添加一个 run sheel script:
脚本内容如下:
for f in "$@"
do
/opt/homebrew/bin/ffmpeg -i "$f" -c:v libx264 -crf 30 -r 24 -movflags faststart -c:a aac -b:a 128k -preset superfast "${f%.*}_compressed.mp4"
done
# 播放声音
afplay /System/Library/Sounds/Blow.aiff
# 显示对话框
osascript -e 'tell app "System Events" to display dialog "视频压缩已完成" with title "通知" buttons {"OK"} default button "OK"'
保存后,在视频文件右键菜单的 action 栏就可以看到我们添加的动作了:
点击执行动作,完成后会有提示信息。
]]>Python 3.3 及以上版本自带 venv 模块,可以直接使用。
在你的项目目录下,运行以下命令来创建一个虚拟环境,这将在项目目录下创建一个名为 myenv 的文件夹,其中包含虚拟环境的所有文件:
python -m venv myenv
Windows:
myenv\Scripts\activate
macOS 和 Linux:
source myenv/bin/activate
在虚拟环境中,你可以使用 pip 来安装项目所需的库:
pip install requests
安装的库将只会影响当前虚拟环境,而不会影响系统的 Python 环境或其他项目。
为了确保你的项目依赖可以在其他环境中重现,你可以使用以下命令将当前环境的依赖写入 requirements.txt 文件:
pip freeze > requirements.txt
requirements.txt 文件将包含所有当前环境中的安装包及其版本信息。
在新的环境中,你可以使用 requirements.txt 文件来安装所需的所有依赖:
pip install -r requirements.txt
当你完成工作时,可以通过以下命令退出虚拟环境:
deactivate
使用虚拟环境进行Python开发可以有效地隔离项目依赖,避免版本冲突。通过创建和激活虚拟环境、安装依赖、冻结依赖并在新环境中重新安装依赖,可以确保你的项目在不同环境中具有一致的运行表现。
]]>Something went wrong. You may be connected to a disallowed ISP If youare using VPN, try disabling it. Otherwise try a different Wi-Fi network or data connection。
经过查询发现是我的 vps 服务商只提供网页端 chatgpt 解锁,不支持 app 端。由于 chatgpt 服务也是通过 cloudflare 的 cdn 服务,所以通过将流量转发到 warp 来访问就可以解决问题。
首先需要在服务端安装官方的 warp 命令行工具:warp-cli。
官方教程:https://developers.cloudflare.com/warp-client/get-started/linux/
官方手动添加包仓库教程:https://pkg.cloudflareclient.com/#ubuntu
在命令行输入以下指令来安装第三方仓库并安装包:
# Add cloudflare gpg key
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
# Add this repo to your apt repositories
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list
# Install
sudo apt-get update && sudo apt-get install cloudflare-warp
安装好后需要注册一个新账户:
warp-cli registration new
查看当前账户信息:
warp-cli registration show
更换新的 license:
warp-cli registration license xxxxx-xxxxxx-xxxxxx
然后需要设置代理模式,可选有:warp, doh, warp+doh, dot, warp+dot, proxy, tunnel_only。
我只想要它提供一个 socks5 代理端口即可,所以设置为 proxy 模式,它会在本地 40000 端口监听:
warp-cli mode proxy
启动 warp:
warp-cli connect
此时 warp 会在本地 40000 端口建立一个 sock5 代理,只需要将需要转发的流量转发到此端口即可走 warp。并且 warp 会自动配置为 Always On 模式,开机自动运行代理。
查看 warp 当前配置:
# warp-cli settings
Merged configuration:
(derived) Always On: true
(default) Switch Locked: false
(user set) Mode: WarpProxy on port 40000
(Not set) WARP tunnel protocol: Wireguard
(default) Disabled for Wifi: false
(default) Disabled for Ethernet: false
(Not set) Resolve via: cloudflare-dns.com @ [162.159.36.1, 2606:4700:4700::1111]
(Not set) qlog logging: Disabled
(default) Onboarding: true
(API defaults) Exclude mode, with hosts/ips:
10.0.0.0/8
100.64.0.0/10
169.254.0.0/16
172.16.0.0/12
192.0.0.0/24
192.168.0.0/16
224.0.0.0/24
240.0.0.0/4
239.255.255.250/32
255.255.255.255/32
fe80::/10
fd00::/8
ff01::/16
ff02::/16
ff03::/16
ff04::/16
ff05::/16
fc00::/7
(default) Fallback domains:
intranet
internal
private
localdomain
domain
lan
home
host
corp
local
localhost
home.arpa
invalid
test
(Not set) Daemon Teams Auth: false
(default) Disable Auto Fallback: false
(Not set) Allow Updates: true
查看代理是否生效:
export ALL_PROXY=socks5://127.0.0.1:40000
curl ifconfig.me
服务端的配置文件需要添加和修改的地方如下:
{
"outbounds": [
...
{
"protocol": "socks",
"settings": {
"address": "127.0.0.1",
"port": 40000
},
"tag":"socks_out"
}
],
"router": {
"domainStrategy": "AsIs",
"rule": [
...
{
"tag": "socks_out",
"geoDomain": [
{
"code": "openai",
"filePath": "geosite.dat"
}
],
"domainMatcher": "mph"
}
]
},
"inbounds": [
{
"protocol": "vmess",
...
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
...
注意需要安装扩展版的 geosite.dat 才有 openai 的条目:https://github.com/Loyalsoldier/v2ray-rules-dat
通过访问以下网址测试是否已经解锁 ios app 端:https://ios.chat.openai.com/public-api/mobile/server_status/v1
以上就是解决 chatgpt 无法访问的方法。
]]>quic 协议走的是 udp 层,一般是 443 或 80 端口。
openwrt 或其他 linux 系统上使用 nftables 设置规则即可:
新建路由表
nft add table ip tabletest
# 局域网流量屏蔽
# 局域网流量目标地址是外部地址时传输路径为 prerouting -> forward -> postrouting hooks
nft add chain ip tabletest prerouting { type nat hook prerouting priority 0 \; policy accept \; }
nft add rule ip tabletest prerouting udp dport { 80, 443 } drop
# 本机网关流量屏蔽
# 本机网关流量目标地址时外部地址时传输路径为 本机 -> output -> postrouting hooks
nft add chain ip tabletest output { type nat hook output priority 0 \; policy accept \; }
nft add rule ip tabletest output udp dport { 80, 443 } drop
在 Chrome 中禁用 HTTP/3:
在 Firefox 中禁用 HTTP/3:
# 清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
pip config set global.index-url http://pypi.douban.com/simple/
# 换回默认源
pip config unset global.index-url
]]>路由表是 nftables 中最顶层的容器,它管理着 chains, sets, maps, flowtables, 和 stateful objects.
每个路由表都只能属于一个 family 集合,可用的 family 有:
新建路由表:
nft add table ip tabletest
以上命令在 ip 集合中新建一个名称为 tabletest 的路由表,可以处理 ipv4 流量
路由表列表:
# 列出所有路由表
nft list tables
# 列出所有 ip 集合的路由表
nft list tables ip
删除一个路由表:
nft delete table ip tabletest
不同于 iptables,nftables 没有预定义的链,如 input output 等。想要在某个环节处理流量,需要定义一个自定义名称的基本链,然后将其挂载在一个特定的 netfilter hook 钩子上。下图是流量包在 linux 网络中的传输路径:
外部访问流量传输到本机后如果目标地址是本机,流量传输路径是 prerouting -> input hooks -> 本机,然后经过本机处理后流向 本机 -> output -> postrouting hooks。
如果传入本机的外部流量目标地址不是本机,则受 forward hook 监听,这类流量的传输路径是 prerouting -> forward -> postrouting。
本机访问外部地址的流量传输路径是 本机 -> output -> postrouting hooks。
注意如果本机作为 router 路由使用,需要提前开启 ip 转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
以下是 netfilter 可用的 chains 和 hooks 列表:
建立基本链,挂载在一个特定 type 的 netfilter hook:
nft add chain [<family>] <table_name> <chain_name> { type <type> hook <hook> priority <value> \; [policy <policy> \;] [comment \"text comment\" \;] }
注意,由于 nft 语法使用了特殊字符,如: ;
,在命令行中执行需要加转义符 \
。或者可以使用单引号 '
` 将 nft 后的语句包起来,以下两种写法效果相同:
nft add chain ip tabletest input { type filter hook input priority 0 \; }
nft 'add chain ip tabletest input { type filter hook input priority 0 ; }'
另一种方法是运行 nft 在交互模式,执行以下命令后就可以不加转义符: nft -i
。
上面的命令在 tebletest 路由表中新建一个 input 链,挂载在 filter 路由链的 input hook 上。这样就可以监听所有进入本地的流量。
priority 决定了所有链的顺序,例如在 filter input hook 上挂载了多个自定义链,通过 priority 决定其执行顺序。数值越低执行优先级越高,例如 -12, -1, 0, 10。如果给多个挂载在同一个 hook 上的自定义基本链同样的 priority,它们的先后执行顺序就是不确定的。
添加以下命令后就可以在 tabletest 基本链中监听本机输出的流量:
nft 'add chain ip tabletest output { type filter hook output priority 0 ; }'
如果不定义大括号中的内容,也就是不挂载在特定 hook 上,则路由链不会监听任何流量。
policy 定义了默认的策略,可用的默认策略为:accept 和 drop,如果路由链中的规则都没有匹配则会应用默认策略:
type 指定自定义路由链挂载到那个基本 chain,可用的基本链:
hook 定义了挂载的基本链 hook,可用的 hooks 如下:
列出一个路由表的所有路由链:
nft list ip table tabletest
列出一个路由表的指定路由链:
nft list chain ip tabletest output
comment 可以给规则添加注释:
nft add rule ip tabletest input counter comment \"test comment\"
通过规则可以控制路由链上的流量。
添加规则:
nft add rule ip tabletest output ip daddr 8.8.8.8 counter
以上命令会在 tabletest 路由表的 output 链中添加一条规则,匹配出口流量中 ip 地址为 8.8.8.8 的流量并对匹配次数计数,nftables 中 counter 会默认启用即使不写。以上命令相当于 iptables 中的 -A
命令。
列出某个链包含的规则:
root@OpenWrt:~# nft list chain ip tabletest output
table ip tabletest {
chain output {
type filter hook output priority filter; policy accept;
ip daddr 8.8.8.8 counter packets 0 bytes 0
}
}
下面测试以上规则是否生效,执行以下命令:
ping -c 1 8.8.8.8
再次查看此链的规则:
root@OpenWrt:~# nft list chain ip tabletest output
table ip tabletest {
chain output {
type filter hook output priority filter; policy accept;
ip daddr 8.8.8.8 counter packets 1 bytes 84
}
}
可以看到已经有一次计数了。
指定位置添加规则:
nftables 中必须通过 handle num 编号来在指定位置添加规则,需要通过 -a
查看链中已经存在的规则的编号:
nft -n -a list table ip tabletest
-n
可以按数字顺序排号避免出现重复编号。再次查看链中的规则:
root@OpenWrt:~# nft -n -a list table ip tabletest
table ip tabletest { # handle 4
chain output { # handle 1
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter packets 0 bytes 0 # handle 5
}
}
handle 5 就是这条规则的编号。
下面我们通过 handle 索引在这条规则后添加一条新规则:
nft add rule ip tabletest output position 5 ip daddr 127.0.0.8 drop
查看链中的规则:
root@OpenWrt:~# nft -n -a list table ip tabletest
table ip tabletest { # handle 4
chain output { # handle 1
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter packets 0 bytes 0 # handle 5
ip daddr 127.0.0.8 drop # handle 6
}
}
如果要在某条规则前插入一条规则需要使用 insert 指令:
nft insert rule ip tabletest output position 5 ip daddr 127.1.1.8 drop
查看效果:
root@OpenWrt:~# nft -n -a list table ip tabletest
table ip tabletest { # handle 4
chain output { # handle 1
type filter hook output priority 0; policy accept;
ip daddr 127.1.1.8 drop # handle 7
ip daddr 8.8.8.8 counter packets 0 bytes 0 # handle 5
ip daddr 127.0.0.8 drop # handle 6
}
}
在某条链最前面添加一条规则:
nft insert rule ip tabletest output ip daddr 192.168.2.1 counter
在最前面添加规则就不需要指定 handle 了。
替换某条规则:
替换一条规则也需要 handle 编号。下面示例会替换 handle 5 为新的规则:
nft replace rule ip tabletest output handle 5 ip daddr 1.1.1.1
删除规则:
同样的,删除某一条规则也需要获取这条规则的 handle 编号。
删除 tabletest 链的 handle 7 规则:
nft delete rule ip tabletest output handle 7
删除链中所有规则:
nft flush chain ip tabletest output
删除路由表中所有链的所有规则:
nft flush table ip tabletest
显示所有 family 的所有 rule 规则:
nft list ruleset
显示某一个集合的所有 rule:
% nft list ruleset arp
% nft list ruleset ip
% nft list ruleset ip6
% nft list ruleset bridge
% nft list ruleset inet
清除所有集合的所有规则:
nft flush ruleset
清除某一个集合的所有规则:
% nft flush ruleset arp
% nft flush ruleset ip
% nft flush ruleset ip6
% nft flush ruleset bridge
% nft flush ruleset inet
备份规则到文件:
# 备份所有集合的所有规则
nft list ruleset >> backup.nft
# 备份 ip 集合的所有规则
nft list ruleset ip >> backup.nft
从文件恢复规则:
nft -f backup.nft
以 json 格式显示所有规则:
nft --json list ruleset
通过 meta 选择器可以进行流量匹配或流量设置。下面简单介绍几个常用的匹配模式,更加详细的参考官方资料:https://wiki.nftables.org/wiki-nftables/index.php/Matching_packet_metainformation
iifname 匹配网卡名称:
# lo 网卡的入口流量会被接收
nft add rule tabletest input meta iifname lo accept
mark 匹配流量标记:
# 流量标记为 123 的出口流量计数
nft add rule tabletest output meta mark 123 counter
skgid 匹配流量由特定 gid 用户产生的数据:
# 匹配来自 gid 用户 1000 的流量
nft add rule tabletest output meta skgid 1000 counter
通过 ip {saddr | daddr} 可以匹配 ipv4 的源流量或目标流量:
# 匹配来自 192.168.1.100 且去往 192.168.1.1 的流量并计数
# 注意本机地址必须为 192.168.1.1 才可以由 input hook 截获
nft add rule ip tabletest input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter
通过 icmp type 关键词来匹配 icmp 流量,如 ping request:
nft add rule ip tabletest input icmp type echo-request counter drop
可以通过命令查询所有可用的 icmp type 类型:
root@OpenWrt:~# nft describe icmp type
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits
pre-defined symbolic constants (in decimal):
echo-reply 0
destination-unreachable 3
source-quench 4
redirect 5
echo-request 8
router-advertisement 9
router-solicitation 10
time-exceeded 11
parameter-problem 12
timestamp-request 13
timestamp-reply 14
info-request 15
info-reply 16
address-mask-request 17
address-mask-reply 18
通过 ip protocol 匹配 ip family 任意类型的协议:
# 匹配所有 tcp 流量
nft add rule ip tabletest output ip protocol tcp
# 匹配所有 tcp udp 流量
nft add rule ip tabletest output ip protocol { tcp, udp }
通过 meta l4proto 匹配 inet family 任意类型的协议:
# tabletest 需要定义为 inet 集合
nft add rule inet tabletest output meta l4proto tcp
匹配特定端口的流量:
# 丢弃所有端口为 1-1024 的 tcp 流量访问本机
nft add rule ip tabletest input tcp dport 1-1024 counter drop
drop 可以对匹配的流量直接丢弃,注意 drop 不能和其他动作组合使用:
nft add rule ip tabletest input ip protocol udp drop
accept 可以对匹配的流量接收,可以和其他动作组合使用 如 counter 计数:
nft add rule ip tabletest input counter accept
不同于 drop,reject 可以在拒绝流量的基础上进行很多其他动作,如返回给源请求地址无法访问的原因等。如果不指定其他动作,默认会返回源地址一个 ICMP/ICMPv6 port unreachable 的流量包。
示例如下:
# 拒绝所有 input 的 udp 流量
nft add rule ip tabletest input ip protocol udp reject
# 拒绝指定流量并返回 icmp host-unreachable
nft add rule ip tabletest input reject with icmp type host-unreachable
icmp 可用如下原因:
net-unreachable: Destination network unreachable
host-unreachable: Destination host unreachable
prot-unreachable: Destination protocol unreachable
port-unreachable: Destination port unreachable (this is the default)
net-prohibited: Network administratively prohibited
host-prohibited: Host administratively prohibited
admin-prohibited: Communication administratively prohibited
注意只能跳转到同一个路由表的其他 chain。
首先我们新建一个 chain:
nft add chain ip tabletest tcp-chain
然后定义这个链的规则:
nft add rule ip tabletest tcp-chain counter
然后可以定义将所有匹配的流量跳转过去:
ft add rule ip tabletest input ip protocol tcp jump tcp-chain
以上示例实现的就是将所有 input 的 tcp 流量跳转到 tcp-chain 计数,然后就返回原始 input 环节继续流转。
通过 log 可以记录匹配到的流量信息,在系统日志中可以查看到。
下面是一个示例,可以记录所有对本机的 ping 请求:
nft add rule ip tabletest input icmp type echo-request log prefix \"New ping request: \" accept
从局域网对本机进行 ping 后,系统日志如下:
Thu May 9 11:58:04 2024 kern.warn kernel: [ 3741.786865] New ping request: IN=br-lan OUT= MAC=00:0c:29:c5:39:8d:00:50:56:c0:00:02:08:00 SRC=192.168.244.2 DST=192.168.244.1 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=49655 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=6609
nat 链类型可以执行网络地址转换的功能,这种链类型有其特有的属性:
先定义一个 nat 类型的基本链:
nft add chain ip tabletest postrouting { type nat hook postrouting priority 0 \; }
以上定义了一个 nat 类型的基本链挂载在 postrouting hook 上。
snat 表示源地址。
下面的规则可以将来自 192.168.1.0/24 从 eth0 网卡发出的流量在发送出去的时候,将源地址修改为 1.2.3.4
nft add rule ip tabletest postrouting ip saddr 192.168.1.0/24 oif eth0 snat to 1.2.3.4
也可以定义一个地址范围:
# 将所有 tcp 流量的源地址都修改为指定的ip范围内
nft add rule ip tabletest postrouting ip protocol tcp snat ip to 10.0.0.1-10.0.0.100:3000-4000
下面介绍如何修改目标地址,再定义一个 nat 类型的基本链:
nft add chain ip tabletest prerouting { type nat hook prerouting priority 0 \; }
以上定义了一个 nat 类型的基本链挂载在 prerouting hook 上。
dnat 表示目标地址。
下面规则会将要进入 eth0 的 tcp 80 443 端口的流量的目标地址改为 192.168.1.120 也就是重定向:
nft 'add rule ip tabletest prerouting iif eth0 tcp dport { 80, 443 } dnat to 192.168.1.120'
redirect 是一种特殊的 dnat,它会将流量重定向到本机设备上:
nft add rule ip tabletest prerouting tcp dport 22 redirect to 2222
以上规则会将进入的 tcp 22 端口的流量转发到本机 2222端口上。
需要注意的是 redirect 只能应用于 nat 链类型的 prerouting 和 output hooks。
设置 mark 标记:
nft add rule ip tabletest output mark set 123
nftables 提供了 set 架构可以用任意支持的选择器来搭建 sets。
匿名 set 是直接定义在 rule 内的 set,它没有特定的名称,也不可以更新 set 中的元素,下面是一个示例:
nft add rule ip tabletest output tcp dport { 22, 23 } counter
{ 22, 23 }
就属于一个匿名 set。规则会去尝试匹配 set 中的每个元素。
可以通过 nft add set
来创建一个有名称的 set,例如:
nft add set ip tabletest blackhole { type ipv4_addr \; comment \"drop all packets from these hosts\" \; }
blackhole 就是这个 set 的名称,后续可以再 rule 中使用。set 类型指定是 ipv4 数据。set 名称需要小于等于16个字符,comment 注释是可选项。
可用的 type 类型有:
ipv4_addr: IPv4 address
ipv6_addr: IPv6 address.
ether_addr: Ethernet address.
inet_proto: Inet protocol type.
inet_service: Internet service (read tcp port for example)
mark: Mark type.
ifname: Network interface name (eth0, eth1..)
建立好之后就可以往 set 里添加元素了:
nft add element ip tabletest blackhole { 192.168.3.4 }
nft add element ip tabletest blackhole { 192.168.1.4, 192.168.1.5 }
如果要添加一个 ip 网段则需要将 set 定义 flags interval:
nft add set ip tabletest blackhole { type ipv4_addr \; flags interval \; }
然后就可以添加一个 ip 网段了:
nft add element ip tabletest blackhole { 192.168.1.0/24 }
可以查询 set 中现有的元素:
root@OpenWrt:~# nft list set ip tabletest blackhole
table ip tabletest {
set blackhole {
type ipv4_addr
comment "drop all packets from these hosts"
elements = { 192.168.1.4, 192.168.1.5,
192.168.3.4 }
}
}
下面就可以通过 set 名称在 nftables 规则中应用:
nft add rule ip tabletest input ip saddr @blackhole drop
nft add rule ip tabletest output ip daddr != @blackhole accept
以上就是 natables 的基本用法。
nftables HOWTO documentation page
Nftables families
Netfilter hooks
Operations at ruleset level