-
Notifications
You must be signed in to change notification settings - Fork 434
钩子函数
zfl9 edited this page May 26, 2023
·
4 revisions
ss-tproxy 脚本支持以下钩子函数,分别是:
-
pre_start
:启动前执行 -
post_start
:启动后执行 -
pre_stop
:停止前执行 -
post_stop
:停止后执行 -
extra_status
:status 时执行 -
extra_pid
:获取 start 时的一些运行时状态,保存到文件,下次执行时自动载入
shell 中的函数不允许重复定义,虽然这不会有任何报错,但实际只有最后一个函数生效
需要在 ss-tproxy 启动后添加某些规则,在 ss-tproxy 停止后删除这些规则,则修改 ss-tproxy.conf:
post_start() {
iptables -A ...
iptables -A ...
iptables -A ...
}
post_stop() {
iptables -D ...
iptables -D ...
iptables -D ...
}
你也可以将 iptables 规则添加到 ss-tproxy 的自定义链上,这些自定义链在 ss-tproxy stop 后会自动删除,因此你只需要关心 post_start()
钩子函数的内容;目前有这几个自定义链:
$ipts -t mangle -N SSTP_PREROUTING
$ipts -t mangle -N SSTP_OUTPUT
$ipts -t nat -N SSTP_PREROUTING
$ipts -t nat -N SSTP_OUTPUT
$ipts -t nat -N SSTP_POSTROUTING
它们分别挂接到去掉 SSTP_
前缀的同名预定义链上,如下:
$ipts -t mangle -A PREROUTING -j SSTP_PREROUTING
$ipts -t mangle -A OUTPUT -j SSTP_OUTPUT
$ipts -t nat -A PREROUTING -j SSTP_PREROUTING
$ipts -t nat -A OUTPUT -j SSTP_OUTPUT
$ipts -t nat -A POSTROUTING -j SSTP_POSTROUTING
某些系统的 TPROXY 模块可能需要手动加载,对于这种情况,可以利用 pre_start()
钩子来加载它:
pre_start() {
# 加载 TPROXY 模块
modprobe xt_TPROXY
}
不想让某些内网主机走 ss-tproxy 的透明代理,即使它们将网关设为 ss-tproxy 主机,可以这么做:
post_start() {
if is_false "$selfonly"; then
if is_true "$ipv4"; then
# 定义要放行的 IPv4 地址
local list=(192.168.1.100 192.168.1.200)
for ip in "${list[@]}"; do
iptables -t mangle -I SSTP_PREROUTING -s $ip -j RETURN
iptables -t nat -I SSTP_PREROUTING -s $ip -j RETURN
done
fi
if is_true "$ipv6"; then
# 定义要放行的 IPv6 地址
local list=(fd00:abcd::1111 fd00:abcd::2222)
for ip in "${list[@]}"; do
ip6tables -t mangle -I SSTP_PREROUTING -s $ip -j RETURN
ip6tables -t nat -I SSTP_PREROUTING -s $ip -j RETURN
done
fi
fi
}