Skip to content

钩子函数

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 中的函数不允许重复定义,虽然这不会有任何报错,但实际只有最后一个函数生效

例子1

需要在 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

例子2

某些系统的 TPROXY 模块可能需要手动加载,对于这种情况,可以利用 pre_start() 钩子来加载它:

pre_start() {
    # 加载 TPROXY 模块
    modprobe xt_TPROXY
}

例子3

不想让某些内网主机走 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
}
Clone this wiki locally