ACL
ACL 是 Hysteria 服务端中一个非常强大的功能,可以用来自定义处理客户端请求的方式,往往配合出站规则(outbounds)使用。例如,可以使用 ACL 来屏蔽某些地址,或者针对不同网站使用不同的出口。
语法
一个有效的 ACL 规则必须符合以下格式之一:
outbound(address)
outbound(address, proto/port)
outbound(address, proto/port, hijack_address)
# 这是一条注释
地址类型
address
字段可以是以下几种之一:
- 单一 IPv4/IPv6 地址,例如
1.1.1.1
或2606:4700:4700::1111
- IPv4/IPv6 CIDR,例如
73.0.0.0/8
或2001:db8::/32
- 域名,例如
example.com
(不包括子域名) - 通配域名,例如
*.example.com
或*.google.*
- 域名后缀,例如
suffix:example.com
(匹配example.com
及其所有子域名) - GeoIP 国家代码,例如
geoip:cn
或geoip:us
- GeoSite 分类,例如
geosite:netflix
或geosite:google
(支持标签,例如geosite:google@cn
) all
- 匹配所有地址。通常放在最后作为其他所有连接的默认出站规则。
要查看可用的 GeoSite 分类,可以参考这里:
Proto/port
tcp
或tcp/*
- 匹配所有 TCP 端口udp
或udp/*
- 匹配所有 UDP 端口tcp/80
- 匹配 TCP 端口 80udp/53
- 匹配 UDP 端口 53udp/20000-30000
- 匹配 UDP 端口 20000 到 30000*/443
- 匹配 TCP 和 UDP 端口 443*
、*/*
或省略 - 匹配所有协议和所有端口
劫持地址 (Hijack address)
当指定了劫持地址时,匹配此规则的连接将被劫持到指定的地址。劫持地址必须是 IPv4/IPv6 地址,不能是域名。
匹配行为
域名和 IP 匹配
当处理基于域名的请求时,Hysteria 首先会解析该域名,然后尝试匹配域名和 IP 规则。换句话说,基于 IP 地址的规则将适用于所有最终指向该 IP 的连接,无论客户端请求是用的域名还是 IP。
规则顺序
规则保证按从上到下的顺序进行匹配。使用第一个匹配请求的规则。如果没有规则匹配,将使用默认出站(出站列表中的第一个)。
内置出站
除非在出站列表中明确地进行了覆盖(同名),否则 Hysteria 内置以下出站:
direct
- 使用默认配置(auto
,无绑定)的本地出站reject
- 拒绝连接default
- 使用出站列表中的第一个出站;如果列表为空,等同于direct
示例
假设有以下出站列表:
outbounds:
- name: v4_only
type: direct
direct:
mode: 4
- name: v6_only
type: direct
direct:
mode: 6
- name: some_proxy
type: socks5
socks5:
addr: ohno.moe:1080
# 为 Google 使用 v6_only 出站
v6_only(suffix:google.com)
# 为 Twitter 使用 v4_only 出站
v4_only(suffix:twitter.com)
# 为 ipinfo.io 使用 some_proxy 出站
some_proxy(ipinfo.io)
# 也支持非英语 IDN 域名
v6_only(战狼*.中国)
# 屏蔽 QUIC 协议
reject(all, udp/443)
# 屏蔽 SMTP 协议
reject(all, tcp/25)
# 屏蔽中国和朝鲜
reject(geoip:cn)
reject(geoip:kp)
# 屏蔽 Facebook 和 Google Ads
reject(geosite:facebook)
reject(geosite:google@ads)
# 屏蔽一些 IP 范围
reject(73.0.0.0/8)
reject(2601::/20)
# 将 8.8.8.8 劫持到 1.1.1.1 并使用默认(第一个)出站
default(8.8.8.8, *, 1.1.1.1)
# 将 8.8.4.4 劫持到 1.1.1.1 并使用默认(第一个)出站,但仅限 UDP 53
default(8.8.4.4, udp/53, 1.1.1.1)
# 直连所有其他地址
direct(all)
注意: ACL 也可以不配合出站规则单独使用。无论有没有出站列表,内置出站都会存在。例如,可以单纯通过
reject
屏蔽一些地址。