Giter Site home page Giter Site logo

zfl9 / ss-tproxy Goto Github PK

View Code? Open in Web Editor NEW
2.1K 68.0 433.0 1.56 MB

搭建 SS/SSR/V2Ray/Trojan/Socks5 透明代理的 Shell 脚本

License: GNU Affero General Public License v3.0

Shell 100.00%
ss ssr v2ray socks5 transparent-proxy gfwlist chnroute tproxy proxy shadowsocks trojan xray clash hysteria naive

ss-tproxy's Introduction

Linux 透明代理

什么是正向代理?

科学上网套件通常分为客户端(client)和服务端(server),server 运行在境外服务器(通常为 Linux 服务器),client 运行在本地主机(如 Windows、Linux、Android、iOS)。本文只关心 client。大多数 client 被实现为一个本地的 http、socks5 代理服务器(如 ss-local),一个程序如果想通过 client 科学上网,必须对它进行特定的设置,使其通过 http、socks5 协议与 client 进行通信,这是大多数人的使用方式。这种代理方式,我们称之为 正向代理

什么是透明代理?

在正向代理中,一个程序要想走代理,必须显式的对其进行一些设置,对该程序来说,有没有走代理是很明确的,大家都“心知肚明”。而透明代理则与之相反,以 Linux 为例,当我们设置好适当的 iptables 规则后,我们将不再需要显式的配置这些程序来让其经过代理或者不经过代理(直连),因为这些程序传出的流量会自动被 iptables 规则处理,那些我们认为需要走代理的流量,会通过合适的方法送往 client,不需要走代理的流量则直接放行(直连)。这个过程对于我们使用的程序来说是完全透明的,程序自身对其一无所知。这就叫做 透明代理。注意,所谓透明是对我们使用的程序(如浏览器)透明,而非对 client、server 或目标网站透明,理解这一点非常重要。

透明代理如何工作?

在透明代理中,那些需要走代理的流量,会通过“合适的方法”送往 client。具体到 iptables,有两种方式:

  • REDIRECT:支持 TCP 协议的透明代理。
  • TPROXY:支持 TCP 和 UDP 协议的透明代理。

为方便叙述,本文以 纯 TPROXY 模式 指代 TCP 和 UDP 都使用 TPROXY 来实现,以 REDIRECT + TPROXY 模式 指代 TCP 使用 REDIRECT 实现,而 UDP 使用 TPROXY 来实现,有时候简称 REDIRECT 模式,它们都是一个意思。

除了 iptables 这边的支持,client 这边当然也需要实现相应的“传入协议”:

  • 普通代理:client 实现的是 http、socks5 传入协议。
  • 透明代理:client 实现的是 透明代理 传入协议。

以常见的科学上网套件为例:

  • ss:ss-libev 的 ss-redir 支持透明代理传入,ss-rust 支持透明代理传入。
  • ssr:ssr-libev 的 ssr-redir 支持透明代理传入。
  • v2ray:通过 dokodemo-door 入站协议来支持透明代理传入。
  • trojan:通过 "run_type": "nat" 来支持透明代理传入。

不同科学上网套件,对透明代理传入的支持度并不相同:

  • ss-libev 支持 TCP 和 UDP 透明代理,3.3.5 版本开始,TCP 支持 TPROXY 传入。
  • ssr-libev 支持 TCP 和 UDP 透明代理,TCP 只支持 REDIRECT 传入。
  • v2ray 支持 TCP 和 UDP 透明代理,TCP 根据配置可选择 REDIRECT 或 TPROXY 传入。
  • trojan 支持 TCP 透明代理,TCP 只支持 REDIRECT 传入。
  • trojan-go 支持 TCP 和 UDP 透明代理,TCP 使用 TPROXY 传入。

另外,是否支持 UDP 还取决于 server 端的配置,某些机场可能未开启 UDP。


如果 client 端只支持 socks5 传入(绝大部分代理套件都支持此协议),不支持透明代理传入,还能实现透明代理吗?当然可以,我们可以运行这样一个程序,该程序支持透明代理传入,socks5 传出(与 client 通信):

  • redsocks:TCP 支持 REDIRECT 传入。
  • redsocks2:TCP 支持 TPROXY/REDIRECT 传入,UDP 支持 TPROXY 传入。
  • ipt2socks:TCP 支持 TPROXY/REDIRECT 传入,UDP 支持 TPROXY 传入。

ipt2socks 是我编写的一个简单 C 程序,只专注于给科学上网套件添加“透明代理”传入支持,编译和使用方法都非常简单,没有配置文件,指定几个命令行参数即可运行。为了方便,ipt2socks 的 releases 页面提供了预编译好的二进制。

借助 ipt2socks,你可以将 client 程序运行在其他性能更强的内网机器上(因为代理的加解密比较费性能,尤其是你在低端设备上跑 ss-tproxy,体验会比较明显),ipt2socks 专门做了一些优化,尽可能实现零拷贝,降低性能开销。

此脚本的作用及由来

通过上面的介绍,可以知道,在构建透明代理的过程中,需要的仅仅是 iptables、支持透明代理传入的程序,那 ss-tproxy 脚本的作用是什么?如果你尝试搭建过透明代理,那么你就会体会到,这一过程并不容易,你需要设置许多繁琐的 iptables 规则,还要应对国内复杂的 DNS 环境,还要考虑 UDP 透明代理,并且希望实现常见的分流模式,而不是全都走代理。

于是有了 ss-tproxy 脚本,该脚本的目的就是辅助大家快速搭建一个透明代理环境,ss-tproxy 支持 global、gfwlist、chnroute、回国模式 等常见分流模式,以及配套的无污染 DNS 解析/分流服务。你可以在常见 Linux 环境中运行 ss-tproxy,比如路由器、旁路由网关、普通局域网机器、甚至虚拟机(桥接)。可以透明代理 ss-tproxy 本机的 TCP/UDP 流量;同一局域网下的其他机器,也可以随时将 网关和DNS 指向 ss-tproxy 主机,接入 ss-tproxy 的透明代理服务。

为什么叫做 ss-tproxy?因为该脚本最初只支持 ss 透明代理,当然现在并不局限于特定的代理套件。

脚本简介

  • 支持 global、gfwlist、chnroute 分流,支持回国代理模式。
  • 支持 IPv4、IPv6 双栈透明代理,支持 TCP、UDP 透明代理。
  • TCP 支持 REDIRECT 和 TPROXY 方式,支持纯 TPROXY 模式。
  • 只代理"主动出站"的流量,不影响 DMZ 主机、端口映射等应用。
  • 使用 chinadns-ng 替代原版 chinadns,支持黑白名单、ipset 操作。
  • 自带一套开箱即用的 DNS 解析方案,也允许用户自定义 DNS 方案

脚本自带的分流模式,从本质上说,就是 白名单黑名单 的各种组合:

  • global白名单模式,白名单走直连(保留地址),其余走代理。
  • gfwlist黑名单模式,黑名单走代理(gfwlist域名),其余走直连。
  • chnroute黑名单+白名单,黑名单走代理(gfwlist域名),白名单走直连(保留地址,大陆域名/地址),其余走代理(国外域名/地址),黑名单优先级高于白名单(对于ipset)。
  • 回国模式:本质还是 gfwlist 模式,具体使用说明见 ss-tproxy.conf。

有人可能会疑问,为什么使用 ss-tproxy 后,可以访问谷歌,但无法 ping 谷歌?
因为 ping 走的是 ICMP 协议,几乎没有哪个代理会处理 ICMP,所以 ICMP 走直连。

相关依赖

依赖安装参考:https://github.com/zfl9/ss-tproxy/wiki/安装依赖

基础依赖:

  • bash:脚本必须用 bash 执行,主要是因为用了 shell 数组等语法特性。
  • iptables:用于配置 IPv4 透明代理规则,仅在启用 IPv4 透明代理时需要。
  • ip6tables:用于配置 IPv6 透明代理规则,仅在启用 IPv6 透明代理时需要。
  • ipset:用于存储黑名单/白名单的 IP,使 iptables 规则与 dns 组件实现联动。

TPROXY 相关:

  • xt_TPROXY:TPROXY 内核模块,涉及到 TPROXY 规则时需要此依赖(如 UDP)。
  • iproute2:用于配置策略路由,完成 TPROXY 操作,与 xt_TPROXY 是互相配套的。

默认 DNS 方案:

  • chinadns-ng:实现 DNS 分流、DNS 缓存、与 ipset 进行联动。

使用自定义 DNS 方案时,不需要上述 DNS 依赖。

其他依赖:

  • curl:用于更新 gfwlist.txt、chnlist.txt、chnroute.txt,需要支持 https。

如果某些模式基本不用,那对应的依赖也不用管。比如,不打算使用 IPv6 透明代理,则无需关心 ip6tables。脚本会检查当前配置所需的依赖,根据提示安装缺少的依赖即可。

获取脚本

git clone https://github.com/zfl9/ss-tproxy
cd ss-tproxy
chmod +x ss-tproxy

安装脚本

请确保当前用户有权限读写以下目录,如没有,请先运行sudo su进入超级用户(root)。

  • install 命令可用
install ss-tproxy /usr/local/bin
install -d /etc/ss-tproxy
install -m 644 *.conf *.txt *.ext /etc/ss-tproxy
install -m 644 ss-tproxy.service /etc/systemd/system # 可选,安装 service 文件
  • install 命令不可用
cp -af ss-tproxy /usr/local/bin
mkdir -p /etc/ss-tproxy
cp -af *.conf *.txt *.ext /etc/ss-tproxy
cp -af ss-tproxy.service /etc/systemd/system # 可选,安装 service 文件

卸载脚本

# 停止脚本 (v4.7版本之前)
ss-tproxy stop
ss-tproxy flush-postrule
ss-tproxy delete-gfwlist

# 停止脚本 (v4.7版本开始)
ss-tproxy stop
ss-tproxy flush-stoprule

# 删除文件
rm -fr /usr/local/bin/ss-tproxy # 删除脚本
rm -fr /etc/ss-tproxy # 删除配置(做好备份)
rm -fr /etc/systemd/system/ss-tproxy.service # service文件

升级脚本

脚本目前没有自我更新能力,只能卸载后重新安装,也许后续会支持。

不同版本的配置文件、数据文件,不保证兼容,避免背上不必要的历史包袱。

文件列表

  • ss-tproxy:shell 脚本,欢迎各位大佬一起来改进这个脚本。
  • ss-tproxy.conf:配置文件,本质是 shell 脚本,修改需重启生效。
  • ss-tproxy.service:systemd 服务文件,用于 ss-tproxy 开机自启。
  • chnlist.txt:用于 chnroute 模式,大陆域名列表,请勿手动修改。
  • chnroute.txt:用于 chnroute 模式,大陆v4地址段,请勿手动修改。
  • chnroute6.txt:用于 chnroute 模式,大陆v6地址段,请勿手动修改。
  • gfwlist.txt:用于 gfwlist/chnroute 模式,gfw域名列表,请勿手动修改。
  • gfwlist.ext:用于 gfwlist/chnroute 模式,扩展黑名单,可配置,重启生效。
  • ignlist.ext:用于 global/chnroute 模式,扩展白名单,可配置,重启生效。

ss-tproxy 只是一个 shell 脚本,并不是常驻后台的服务,因此所有的修改都需要 restart 来生效。

配置说明

注意,配置文件在 /etc/ss-tproxy/ 目录,不是 git clone 下来的目录!

初次接触的,请先跳过这一段,直接看下一节 代理软件配置,按照示例修改配置即可

配置项有点多,但通常只需修改 ss-tproxy.conf 前面的少数配置项(开头至proxy配置段)

注释

井号开头的行为注释行,配置文件本质上是一个 shell 脚本,对于同名变量或函数,后定义的会覆盖先定义的。

mode

分流模式,默认为 chnroute 模式,可根据需要修改为 global/gfwlist 模式。

ipv4、ipv6
  • 启用 IPv4/IPv6 透明代理,你需要确保本机代理进程能正确处理 IPv4/IPv6 相关数据包,脚本不检查它
  • 启用 IPv6 透明代理应检查当前的 Linux 内核版本是否为 v3.9.0+,以及 ip6tables 的版本是否为 v1.4.18+
tproxy
  • true 表示 tcp 和 udp 都使用 TPROXY,纯 TPROXY 模式
  • false 表示 tcp 使用 REDIRECT,udp 使用 TPROXY,混合模式

列举一些常见的代理套件:

  • ss/ssr/trojan:混和模式
  • v2ray:两者都可,取决于配置
  • ipt2socks:默认纯 TPROXY 模式
  • hysteria:支持纯 TPROXY 模式
  • trojan-go:只使用纯 TPROXY 模式
  • ss-libev:3.3.5+ 支持纯 TPROXY 模式

此配置非常重要,配置不当将无法透明代理。

tcponly
  • true 表示仅代理 TCP 流量
  • false 表示代理 TCP 和 UDP 流量

某些机场、client、server 不支持 UDP,请注意判别。

selfonly
  • true 表示仅代理 ss-tproxy 主机自身的流量
  • false 表示代理 ss-tproxy 主机自身以及内网主机的流量

内网主机如果想走代理,必须将 网关DNS 都指向 ss-tproxy 主机。

proxy_procgroup
  • 可以填 gid,也可以填 name,建议用 name,脚本会自动帮你创建 group
  • 所有代理进程都必须以此 group 身份运行(否则会产生死循环),脚本不检查它
  • 此文档的所有示例,均使用proxy组,如非必要,请勿修改为其他 group,防止出错
proxy_tcpport、proxy_udpport
  • 本机代理进程透明代理 监听端口,前者为 TCP 端口,后者为 UDP 端口,通常情况下是相同的。
  • 如果 UDP 不稳定,或无法使用 UDP,请使用 tcponly 模式,这种情况下,proxy_udpport 被忽略。
  • 此端口必须支持 透明代理 传入(REDIRECT/TPROXY),并且必须与 tproxy 配置保持一致,否则将出错。
proxy_startcmd、proxy_stopcmd
  • 前者是启动本机代理进程的 shell 命令,后者是关闭本机代理进程的 shell 命令
  • 这些命令不应执行过长时间,防止卡住脚本,长时间处于某种中间状态
  • 具体命令例子,见 代理软件配置

如果需要切换代理节点,请直接操作相关代理进程,而不是修改 ss-tproxy.conf、ss-tproxy restart,因为这是一个重量级操作,没有必要反复操作 iptables 规则、重启 DNS 服务。

ss-tproxy 提供 proxy_startcmd/proxy_stopcmd 的目的,是为了“帮你”启动/关闭代理进程,并不是要完全接管它;因此,对于那些不涉及 iptables 规则、DNS 服务的操作(比如切换节点),请不要通过 ss-tproxy 进行。

如果觉得切换节点麻烦,可以使用那些支持 自动切换节点 的代理套件,比如 clash,又比如套上 haproxy,或者用脚本封装节点切换操作,总之,请尽情发挥你的想象力。

ss-tproxy 要求代理进程不参与 ip 分流、dns 分流/解析,专心实现 TCP/UDP 全局透明代理即可,脚本已经帮你设置好了 iptables 分流规则,iptables 分流比代理进程的“用户空间”分流更快,性能开销更小,也更加彻底。

dns_custom

给高级用户用的,用于自定义 DNS 方案,具体见 ss-tproxy.conf、ss-tproxy 脚本、wiki/DNS方案

dns_procgroup
  • 可以填 gid,也可以填 name,建议用 name,脚本会自动帮你创建 group
  • 所有 DNS 进程都必须以此 group 身份运行(否则会产生死循环),脚本不检查它
  • 默认是proxy_dns,使用内置 DNS 方案时,无需关心此配置,脚本会自动帮你处理
dns_mainport
  • DNS 的请求入口(TCP+UDP 监听端口),脚本会自动将相关 DNS 请求重定向至此端口
  • 对于内置 DNS 方案,该端口是 chinadns-ng 的监听端口,如与其他进程有冲突,请修改
  • 已知 systemd-resolved 会监听 53 端口,所以 v4.7.5+ 将端口改为了 60053,减少冲突
chinadns_chnlist_first

该选项只作用于 mode=chnroute,用于设置 chinadns-ng 的 --chnlist-first 选项。该选项只影响那些 同时位于黑白名单 的域名模式,具体解释可以参见 chinadns-ng 的 README 文档。

ipts_set_snat

selfonly=false 时有效,设置 IPv4 的 MASQUERADE 规则,有两种情况需要将其设置为 true:

  • ss-tproxy 部署在出口路由位置,即至少两张网卡,一张连内网,一张连公网,需要源地址转换。
  • 黑名单正常访问,但白名单无法访问,如百度,请设置为 true,这种情况通常与路由器设置有关。

此规则在 ss-tproxy stop 后仍然有效,如果你想清空这些规则,请执行 ss-tproxy flush-stoprule

ipts_set_snat6

selfonly=false 时有效,设置 IPv6 的 MASQUERADE 规则,需要设置的情况同 ipts_set_snat。

v4.6+ 版本的 IPv6 透明代理可以通过 GUA 公网地址进行,不需要额外配置。但如果希望其他主机也使用 ss-tproxy 主机的代理(网关和 DNS 都指向 ss-tproxy 主机),建议给相关主机配置 ULA 静态私有地址,也就是组建一个 IPv6 内网,避免公网 IP 经常变动带来的麻烦。这种情况下,你需要将此配置设为 true。

ipts_reddns_onstop、ipts_reddns6_onstop

此配置仅在 selfonly=false 时有效;前者用于 IPv4,后者用于 IPv6;必须指定端口号。

ss-tproxy stop 后,是否将内网主机发往 ss-tproxy 主机的 DNS 请求重定向至给定的 DNS,为什么要这么做?因为其它内网主机的 DNS 已经指向了 ss-tproxy 主机,但现在 ss-tproxy 已经关闭了,附带的 DNS 服务自然也被一同关闭,所以这些内网主机会因为无法解析 DNS 而无法上网。

设置该选项后,ss-tproxy 会设置一些 iptables 规则,重定向至指定的 DNS,确保内网主机可以正常上网。这些规则在执行 start 时会被自动移除,如果在 stop 状态下需要手动移除规则,请执行 ss-tproxy flush-stoprule

如果 ss-tproxy 主机上有可用的 DNS 服务,请设置为空串(留空)。

ipts_proxy_dst_port

要代理 黑名单 的哪些端口,留空表示全部,等价于 1:65535。允许指定多个范围,逗号隔开即可。

如果觉得端口范围太大,可以设置为 1:1023,8080;此时,只有当我们访问黑名单的 1~1023 和 8080 端口时才会走代理,访问其它端口不走代理,因此可以利用此选项来放行 BT、PT 流量,因为这些流量的目的端口通常在 1024 以上。

修改此选项需要足够小心,配置不当会导致某些软件无法走代理,因为它们访问的目标端口可能不在你指定的范围内;因此将此选项留空,可能是最保险的一种做法,防止出现漏网之鱼。

ipts_drop_quic

丢弃发往 黑名单 的 QUIC 流量(目标端口为 UDP/443),黑名单是指“分流”时,被判定为要走代理的地址。注意:本机代理进程传出的流量,不会受到此配置的影响。目前有如下取值:

  • 留空:不丢弃 QUIC,主要用于兼容旧版本行为。
  • tcponly:tcponly='true' 时,丢弃 QUIC,见 #237 issue。
  • always:总是丢弃 QUIC;如果代理的 UDP 体验差,建议丢弃。

比如 YouTube、ChatGPT 就默认启用 QUIC,如果油管测速比较低、ChatGPT 无法使用,可以尝试禁用 QUIC。

opts_ss_netstat

告诉 ss-tproxy,使用 ss 还是 netstat 命令进行端口检测,目前检测本机代理进程是否正常运行的方式是直接检测其是否已监听对应的端口,虽然这种方式有时并不准确,但似乎也没有其它更好的便携方法来做这个事情。

  • auto:优先考虑 ss,没有 ss 时,使用 netstat
  • ss:使用 ss,ss 由 iproute2 提供
  • netstat:使用 netstat

代理软件配置

ss-libev

ss 配置文件 /etc/ss.json,与常规配置相同,无特别之处。

{
    "server": "服务器地址",
    "server_port": 服务器端口,
    "local_address": "127.0.0.1",
    "local_port": 60080,
    "method": "加密方式",
    "password": "用户密码",
    "no_delay": true,
    "fast_open": true,
    "reuse_port": true
}

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='false' # ss-libev 默认为 redirect 模式
tcponly='false' # 若节点不支持 udp,请修改为 true

proxy_startcmd='start_ss'
proxy_stopcmd='stop_ss'

start_ss() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group ss-redir

    (ss-redir -c /etc/ss.json -u </dev/null &>>/var/log/ss-redir.log &)

    # -v 表示记录详细日志
    # (ss-redir -c /etc/ss.json -u -v </dev/null &>>/var/log/ss-redir.log &)
}

stop_ss() {
    kill -9 $(pidof ss-redir) &>/dev/null
}
ssr-libev

ssr 配置文件 /etc/ssr.json,与常规配置相同,无特别之处。

{
    "server": "服务器地址",
    "server_port": 服务器端口,
    "local_address": "127.0.0.1",
    "local_port": 60080,
    "method": "加密方式",
    "password": "用户密码",
    "protocol": "origin",
    "protocol_param": "",
    "obfs": "plain",
    "obfs_param": ""
}

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='false' # ssr-libev 只支持 redirect 模式
tcponly='false' # 若节点不支持 udp,请修改为 true

proxy_startcmd='start_ssr'
proxy_stopcmd='stop_ssr'

start_ssr() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group ssr-redir

    (ssr-redir -c /etc/ssr.json -u </dev/null &>>/var/log/ssr-redir.log &)

    # -v 表示记录详细日志
    # (ssr-redir -c /etc/ssr.json -u -v </dev/null &>>/var/log/ssr-redir.log &)
}

stop_ssr() {
    kill -9 $(pidof ssr-redir) &>/dev/null
}
v2ray

v2ray 配置文件 /etc/v2ray.json,在原有配置上,添加 dokodemo-door 入站协议即可。

  • 由于 v2ray 配置复杂,在报告问题之前,请检查配置是否有问题,这里不解答 v2ray 配置问题
  • 原则上不建议在 v2ray 上配置任何分流或路由规则,脚本会为你做这些事,请尽量保持配置简单
  • 据反馈,dokodemo-door 的 UDP 存在断流 bug,可尝试使用 ipt2socks 配合 socks5 入站协议缓解
{
  "log": {
    "loglevel": "info" // 调试时请改为 debug
  },

  "inbounds": [
    {
      "protocol": "dokodemo-door",
      "listen": "127.0.0.1",
      "port": 60080, // 必须与proxy_tcpport/proxy_udpport保持一致
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "streamSettings": {
        "sockopt": {
          // 若有改动,请同步修改 ss-tproxy.conf 的 tproxy 配置
          // "tproxy": "tproxy" // tproxy + tproxy 模式 (纯tproxy)
          "tproxy": "redirect" // redirect + tproxy 模式 (redirect)
        }
      }
    }
  ],

  "outbounds": [
    {
      "protocol": "shadowsocks",
      "settings": {
        "servers": [
          {
            "address": "服务器地址",
            "port": 服务器端口,
            "method": "加密方式",
            "password": "用户密码"
          }
        ]
      }
    }
  ]
}

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='false' # 本例中,使用 redirect 模式
tcponly='false' # 若节点不支持 udp,请修改为 true

proxy_startcmd='start_v2ray'
proxy_stopcmd='stop_v2ray'

start_v2ray() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group v2ray

    (v2ray run -c /etc/v2ray.json </dev/null &>>/var/log/v2ray.log &)
}

stop_v2ray() {
    kill -9 $(pidof v2ray) &>/dev/null
}
xray

xray 在配置上兼容 v2ray,inbounds 配置照抄 v2ray 的,然后将 v2ray 替换为 xray 即可。

trojan(socks5)
  • 如果手上只有 socks5 代理,可以将 ipt2socks 作为其前端,提供透明代理传入
  • 以 trojan 为例,trojan 原生不支持 udp 透明代理传入,所以配合 ipt2socks 来实现
  • 假设 trojan 配置文件为 /etc/trojan.json,注意 run_type 为 client,也就是 socks5 传入
{
    "run_type": "client",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "服务器地址",
    "remote_port": 服务器端口,
    "password": [
        "用户密码"
    ],
    "log_level": 1,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "",
        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
        "sni": "",
        "alpn": [
            "h2",
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "curves": ""
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "reuse_port": false,
        "fast_open": false,
        "fast_open_qlen": 20
    }
}

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='true' # ipt2socks 默认使用纯 tproxy 模式
tcponly='false' # 若节点不支持 udp,请修改为 true

proxy_startcmd='start_trojan'
proxy_stopcmd='stop_trojan'

start_trojan() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group trojan
    set_proxy_group ipt2socks

    (trojan -c /etc/trojan.json </dev/null &>>/var/log/trojan.log &)
    (ipt2socks </dev/null &>>/var/log/ipt2socks.log &)
}

stop_trojan() {
    kill -9 $(pidof trojan) $(pidof ipt2socks) &>/dev/null
}
hysteria

hysteria 配置文件 /etc/hysteria.json,这里使用 纯 TPROXY 模式

{
  "server": "example.com:36712",
  "obfs": "8ZuA2Zpqhuk8yakXvMjDqEXBwY",
  "up_mbps": 10,
  "down_mbps": 50,
  "retry": -1,
  "retry_interval": 1,
  "tproxy_tcp": {
    "listen": ":60080",
    "timeout": 300
  },
  "tproxy_udp": {
    "listen": ":60080",
    "timeout": 300
  }
}

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='true' # 本例中,使用纯 tproxy 模式
tcponly='false' # 若节点不支持 udp,请修改为 true

proxy_startcmd='start_hy'
proxy_stopcmd='stop_hy'

start_hy() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group hysteria

    (hysteria -c /etc/hysteria.json </dev/null &>>/var/log/hysteria.log &)

    # 由于 hy 从启动到监听端口需要一些时间,建议 sleep 一会,避免初次 status 显示异常
    sleep 0.5
}

stop_hy() {
    kill -9 $(pidof hysteria) &>/dev/null
}
naive(socks5)
  • naive 不支持 UDP 代理,必须使用 tcponly='true' 模式
  • 仍然以 ipt2socks 为例,配合 naive 的 socks5 传入协议

naive 配置文件 /etc/naive.json:

{
  "listen": "socks://127.0.0.1:1080",
  "proxy": "https://用户:密码@naive服务器域名"
}

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='true' # ipt2socks 默认使用纯 tproxy 模式
tcponly='true' # naive 不支持 udp 代理

proxy_startcmd='start_naive'
proxy_stopcmd='stop_naive'

start_naive() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group naive
    set_proxy_group ipt2socks

    (naive /etc/naive.json </dev/null &>>/var/log/naive.log &)
    (ipt2socks </dev/null &>>/var/log/ipt2socks.log &)
}

stop_naive() {
    kill -9 $(pidof naive) $(pidof ipt2socks) &>/dev/null
}
clash
  • clash 支持自动选择节点,支持 RESTful API,可以在 Web 进行配置和管理。
  • 分流和 DNS 由 ss-tproxy 负责,clash 这边让流量走代理出去即可,不要分流。
  • Web 控制台:http://yacd.haishan.me,填写 external-controller 和 secret 即可。

clash 配置文件 /etc/clash/config.yaml:

mode: rule

# 日志级别
# log-level: info
log-level: warning

# redir-port: 60080 # REDIRECT 模式
tproxy-port: 60080 # 纯 TPROXY 模式

# RESTful API 相关
external-controller: 0.0.0.0:9090 # 监听 0.0.0.0 是为了能在其他设备访问
secret: a934ecd1-9729-4925-bcb3-15a3d7d85e77 # RESTful API 的认证密码

# 节点列表,节点名可被 proxy-groups 引用
proxies:
  - name: socks5_server # 节点名
    type: socks5 # 以 socks5 节点为例,其他协议请看 clash 文档
    udp: true # 启用 UDP,默认不启用 (请尽量启用,除非节点不支持)
    server: 192.168.1.100 # 填写 socks5 服务器地址
    port: 1080 # 填写 socks5 服务器端口

# 节点分组,分组名可被 rules 引用
proxy-groups:
  - name: PROXY # 分组名
    type: select # 如果想自动选择节点,可使用 url-test
    proxies:
      - socks5_server # 引用的节点名

# 如果是机场,也可以使用订阅,具体请看 clash 文档
# proxy-providers:

# 分流由 ss-tproxy 负责,clash 这边只需全部走代理
rules:
  - MATCH,PROXY # 所有流量都走 PROXY 组出去

配置 ss-tproxy.conf,填写启动和停止命令:

# 这里只介绍 v4.7+ 版本的配置

tproxy='true' # 本例中,使用纯 tproxy 模式
tcponly='false' # 若节点不支持 udp,请修改为 true

proxy_startcmd='start_clash'
proxy_stopcmd='stop_clash'

start_clash() {
    # 设置 setgid 权限位 (只需执行一次)
    set_proxy_group clash

    (clash -d /etc/clash </dev/null &>>/var/log/clash.log &)
}

stop_clash() {
    kill -9 $(pidof clash) &>/dev/null
}

如果使用 systemctl 方式启停代理进程,请进行一次如下操作:

步骤1 和 步骤2 执行过一次就行,除非代理程序重新安装或更新了

1、执行systemctl edit <服务名>,它会打开一个文件,让你编辑

systemctl edit xray # 以xray为例

2、在光标默认位置(第4行),新增两行,然后保存退出。具体如下:

### Editing /etc/systemd/system/xray.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file

# 下面两行就是要新加的,含义是:让代理进程以proxy组的身份来运行
[Service]
Group=proxy

### Edits below this comment will be discarded

3、重启代理进程的服务,让刚刚的修改生效:systemctl restart <服务名>

systemctl restart xray # 以xray为例

无论是什么方式启动的代理进程,请务必检查下gid是否正确

# 先查看proxy组的gid是多少
grep proxy /etc/group

# 检查进程的gid是否为proxy组
for pid in $(pidof xray); do # 以xray为例
  grep Gid /proc/$pid/status
done

# 如果gid不对,说明配置或姿势不对,请发issue寻求帮助,我尽量解决
# 也可以看下这个: https://github.com/zfl9/ss-tproxy/discussions/233

再次重申,如果只是切换节点/代理,请不要通过修改 ss-tproxy.conf、重启 ss-tproxy 的方式进行,请直接操作相关代理进程。举个例子,对于 ss-redir,就是先把原来的 ss-redir 进程杀死,然后启动新的 ss-redir 进程。当然,你可以用脚本或者你喜欢的任意方式,来封装节点切换操作,或者使用 clash 这种支持 自动切换/选择节点 的代理客户端。

脚本命令行选项

  • ss-tproxy help:查看帮助信息
  • ss-tproxy version:查看版本号
  • ss-tproxy start:启动透明代理
  • ss-tproxy stop:关闭透明代理
  • ss-tproxy restart:重启透明代理
  • ss-tproxy status:查看代理状态
  • ss-tproxy show-iptables:查看当前的 iptables 规则
  • ss-tproxy flush-stoprule:清空 stop 状态下的 iptables 规则
  • ss-tproxy flush-dnscache:清空 DNS 查询缓存
  • ss-tproxy update-gfwlist:更新 gfwlist.txt,restart 后生效
  • ss-tproxy update-chnlist:更新 chnlist.txt,restart 后生效
  • ss-tproxy update-chnroute:更新 chnroute*.txt,restart 后生效
  • ss-tproxy set-proxy-group <可执行文件>:设置所属 group、setgid 权限位
  • ss-tproxy set-dns-group <可执行文件>:设置所属 group、setgid 权限位

此外,可以在命令行的任意位置,指定以下选项:

  • -x:输出调试信息,比如脚本出错时,可用来定位是哪条命令
  • -d dir:使用给定的工作目录,默认是 /etc/ss-tproxy
  • -c config:使用给定的配置文件,默认是 ss-tproxy.conf
  • NAME=VALUE:定义变量,可用来临时覆盖 ss-tproxy.conf 中的同名配置

ss-tproxy restart 后,可能会由于 DNS 缓存,导致无法代理,请尝试:

  • 清空当前系统的 DNS 缓存:
    • Windows:打开 cmd,执行 ipconfig /flushdns
    • 手机:可以开关一下飞行模式,或者重连一下 WiFi
  • 如果还不行,请重新打开当前应用程序,然后再试

如果要修改以下配置,请先 stop,再修改 ss-tproxy.conf,再 start。

  • proxy_stopcmd
  • ipts_rt_tab

对于 proxy_stopcmd,如果忘记遵循 先 stop,后修改 的顺序,也可以补救,那就是自己手动 kill 之前的代理进程。当然,你也可以在 proxy_stopcmd 中预先填写好所有可能要 kill 的代理进程,这样后续就不需要再修改了。

其他 ss-tproxy.conf 配置无需遵循上述约定,改完 restart 即可。

脚本开机自启

对于 SysVinit 发行版,直接在 /etc/rc.d/rc.local 开机脚本中加上 ss-tproxy 的启动命令即可:

/usr/local/bin/ss-tproxy start

对于 Systemd 发行版,将 ss-tproxy.service 文件放到 /etc/systemd/system/ss-tproxy.service,执行:

systemctl daemon-reload
systemctl enable ss-tproxy

不建议使用 systemctl start|stop|restart ss-tproxy 来操作 ss-tproxy,此服务文件应仅作开机自启用。

如果遇到开机自启失败的问题,可以看下这个 wiki:https://github.com/zfl9/ss-tproxy/wiki/开机自启

IPv6 透明代理

对于 v4.6+ 版本,设置 ipv6 选项即可使用 IPv6 透明代理,使用方法同 IPv4 透明代理。但如果想让其他主机也接入 ss-tproxy 的透明代理,建议给相关主机配置 ULA 静态私有地址,也就是组建一个局域网,这样在给他们设置网关和 DNS 时,就不怕公网 IP 经常变动了。在这种情况下,你需要启用 ss-tproxy.conf 的 ipts_set_snat6 选项。

更多信息请参见 wiki

ss-tproxy's People

Contributors

cattyhouse avatar cnzgray avatar derekhe avatar elvisw avatar heyeshuang avatar meliber avatar toutyrater avatar xtccc avatar zfl9 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ss-tproxy's Issues

可以提供个docker镜像吗?

环境安装和配置略复杂,我做了个镜像 感觉不是很理想
大神可以提供个官方docker镜像吗?供小白傻瓜化使用你的作品

大大,能不能加入自定义所需代理端口的功能呢?

大大你好,我经常用 ss-tproxy 中的 chnroute 模式,用这个模式就意味着大部分境外 ip 都要走代理,如果进行 BT/PT 下载 vps 可能就会被封,但大部分 P2P 类下载软件,多使用高端口,所以我想是不是可以自定义需要代理的端口来避免这个问题。openwrt 上的 luci-app-shadowsocks(https://github.com/shadowsocks/luci-app-shadowsocks) 提供了此功能,恩山上 hiboy 的 Padavan 固件所内置的 ss 也支持了。我感觉这个功能还是挺重要的,期待大大的进一步开发!大大加油!

请问chnroute模式下的chinadns有替代品吗?

image
解析mail.qq.com解析到海外了,log如下

Thu Apr 25 18:44:28 2019 response mail.qq.com from 223.5.5.5:53 - 14.18.245.237, delay
Thu Apr 25 18:44:28 2019 response mail.qq.com from 8.8.8.8:53 - 103.7.30.100, 203.205.128.111, pass

如果让udp全局走透明代理呢?

我按照教程安装好之后,发现tcp(http)是正常走透明代理的,但是udp还是走我自己的网络
这个如何设置规则呢?
ps:我的udp程序是aria2下载器

V2ray 最新版本dokodemo-door已经支持TPROXY了,能否求个TCP的例子。

Vray官方dokodemo-door已经支持linux 的tproxy转发数据,能否求个例子转发tcp数据,目前udp也是网上抄来的。

ip rule add fwmark 0x01/0x01 table 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -I V2RAY -d 192.168.1.0/24 -j RETURN

强制使用重定向地址的DNS

客户机如果使用了非路由器的DNS,会无法解析到正确地址。可添加以下规则强制使用重定向地址的DNS
iptables -t mangle -A SS-UDP -p udp --dport 53 -j RETURN
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 192.168.1.1

使用自建DNS解析流量全部走代理

在PI上安装作为网关工作在主路由下
ChinaDNS国内DNS 设置为114.114.114.114 工作正常
修改为同一局域网下的自建DNS(AdGuardHome 单独使用正常)所有流量走代理

dnsforwarder [stopped]

Cannot run properly. Need Help.

$ sudo ss-tproxy restart
[sudo] paul 的密码:
ss-redir [stopped]
ss-tunnel [stopped]
chinadns [stopped]
dnsforwarder [stopped]

ss-redir [running]
ss-tunnel [running]
chinadns [running]
dnsforwarder [stopped]

功能增强:用户自定义udp转发的端口

大概看了下脚本,tproxy应该是全部端口转发了吧,有时候只需要转发制定的端口就够了。
最近入了台软路由,打算直接上Arch Linux当路由,到时候ss-tproxy可能会派上用场,嘿嘿。

在tun2socks模式下 Push 节点信息会报错

在使用 tun2socks 模式下,Shadowsocks-mu-py拉取json报错 JSON ValueError: Expecting property name: line 1 column 2 (char 1)

而访问其他被墙网站都是正常的,请问这个是什么原因?

ss-tproxy start 提示如下

dnsmasq: bad option at line 6 of /dev/fd/63
RTNETLINK answers: File exists
mount: warning: /etc/resolv.conf seems to be mounted read-write.
mode: tproxy_gfwlist
ssr-redir: [stopped]
ssr-tunnel: [stopped]
dnsmasq: [stopped]

SS-Tproxy 是否会使 iptables的 fwmark功能失效?

我使用

iptables -t mangle -I OUTPUT -p icmp -j MARK --set-mark 0x15
ip rule add fwmark  0x15 table 2
ip route add 0/0 dev wg0 table 2

来实现使ICMP走隧道出去,但是在使用了 ss-tproxy的机器上,这个指令是失效的,数据包并没有成功mark.

支持ipv6透明代理的一种想法

是不是可以在脚本中判断用户设置的地址是否包含字符‘:’来判断是不是ipv6地址呢?然后在256-260行的地方简单地改变一下,如果是ipv6地址那么就不用return了,因为iptables 只处理ipv4。这是我自己用的脚本,大概是这样的。我不擅长Shell,大佬见笑了。

start_ss_redir(){
    # Start the shadowsocks-redir
    sudo ss-redir -s 2333:1111:5555:2fff:5454:ffff:ffff:2333 -p 23333 \
        -m aes-256-cfb -b 0.0.0.0 -l 65535 -k password -u -v
}

if [ "$1" = "start" ]
then
    sudo iptables -t nat -F PREROUTING    #clear the PREROUTING chain
    sudo iptables -t nat -F OUTPUT        #clear the PREROUTING chain
    sudo iptables -t nat -F SS_TCP        #clear the chain
    sudo iptables -t nat -X SS_TCP        #delete the chain
    
    sudo iptables -t nat -N SS_TCP        # Create new chain
    
    # Ignore shadowsocks server's addresses to avoid loop
    # sudo iptables -t nat -A SS_TCP -p tcp --dport 65535 -j RETURN
    # 我们在用ipv6所以这里不需要
    
    # Ignore LANs addresses to bypass the proxy
    # See Wikipedia and RFC5735 for full list of reserved networks
    sudo iptables -t nat -A SS_TCP -d 0.0.0.0/8 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 10.0.0.0/8 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 127.0.0.0/8 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 169.254.0.0/16 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 172.16.0.0/12 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 192.168.0.0/16 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 224.0.0.0/4 -j RETURN
    sudo iptables -t nat -A SS_TCP -d 240.0.0.0/4 -j RETURN
    
    # Anything else should be redirected to shadowsocks's local port
    sudo iptables -t nat -A SS_TCP -p tcp -j REDIRECT --to-ports 65535
    
    # apply the rules to TCP packages from WLAN Hotspot
    sudo iptables -t nat -A PREROUTING -p tcp -s 10.42.0.0/24 \
                    -j SS_TCP
    # apply the rules to local processes
    sudo iptables -t nat -A OUTPUT -p tcp -j SS_TCP
    
    start_ss_redir;
elif [ "$1" = "clear" ]
then
    sudo iptables -t nat -F PREROUTING    #clear the PREROUTING chain
    sudo iptables -t nat -F OUTPUT        #clear the OUTPUT chain
    sudo iptables -t nat -F SS_TCP        #clear the chain
    sudo iptables -t nat -X SS_TCP        #delete the chain
else
    echo "没有输入参数"
fi

建议在启动dnsmasq的时候也一并加载一下其自带的配置文件

在linux的软路由上,dnsmasq通常也会作为DHCP server ,其依赖于自带的配置文件/etc/dnsmasq.conf中的配置。但由于ss-tproxy在启动dnsmasq时使用了-C参数,其自带的配置文件/etc/dnsmasq.conf不再会被加载,导致软路由失去了DHCP server的功能。

所以建议在启动dnsmasq的时候也一并加载一下/etc/dnsmasq.conf,通常各大发行版默认的/etc/dnsmasq.conf中全部都是注释,加载一下也不会对原有功能造成冲突。

Fedora 29下会出现各种权限错误

更新后发现systemctl start ss-tproxy无法启动
systemctl status ss-tproxy如下
Failed at step EXEC spawning /usr/bin/ss-tproxy: Permission denied
关闭SeLinux可以正常启动
回退到commit 5b393a3a8107c961c91bec2f933e3ed0d309f900可以正常启用

有空我在找找具体原因

桥接模式下,内网流量udp正常、tcp协议无法转发。

稍微说明一下,他说的“桥接模式”是这样的,如下图:
image
ss-tproxy 运行在 bridge 服务器上,这个 bridge 服务器有两个网卡,一个连接出口路由,一个连接内网总线,然后将这两张网卡进行桥接,得到一个逻辑网卡,假设为 br0,br0 网卡通过 DHCP 方式获取路由器分配的 IP 地址信息,然后,这个 bridge 主机能够正常上外网,其它内网主机也能够正常上外网。

但默认情况下,ss-tproxy 并不能正常工作,需要进行几处改动,如下:

  1. 加载 br_netfilter 内核模块:modprobe br_netfilter
  2. 修改 sysctl.conf 的内核参数,如下:
# 网卡间转发
net.ipv4.ip_forward = 1

# 接收 localnet
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.route_localnet = 1

# 2 层数据打到 3 层来
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-arptables = 1
  1. 修改 ss-tproxy.conf,proxy_tproxy='false'ipts_non_snat='true'
  2. 修改 ss-tproxy,将 -j REDIRECT --to-ports $port 改为 -j DNAT --to-destination 127.0.0.1:$port

请到 README.md 里面查看,里面有关于桥接模式下的透明代理的详细说明

遇到 v2ray 客户端报错的问题

我怀疑是 iptables 的问题,帮忙看看这个 iptables 有没有问题,谢谢了!

bash-4.4# iptables-save 
# Generated by iptables-save v1.6.2 on Sun Mar 31 10:25:35 2019
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:SETMARK - [0:0]
:SSTP_OUT - [0:0]
:SSTP_PRE - [0:0]
-A PREROUTING -j SSTP_PRE
-A OUTPUT -j SSTP_OUT
-A SETMARK -d 8.8.8.8/32 -p udp -j MARK --set-xmark 0x2333/0xffffffff
-A SETMARK -m set --match-set gfwlist dst -j MARK --set-xmark 0x2333/0xffffffff
-A SSTP_OUT -p tcp -j SETMARK
-A SSTP_OUT -p udp -j SETMARK
-A SSTP_PRE -s 192.168.2.0/24 -p udp -m udp --dport 53 -m mark ! --mark 0x2333 -j ACCEPT
-A SSTP_PRE -s 192.168.2.0/24 -p tcp -m mark ! --mark 0x2333 -j SETMARK
-A SSTP_PRE -s 192.168.2.0/24 -p udp -m mark ! --mark 0x2333 -j SETMARK
-A SSTP_PRE -p tcp -m mark --mark 0x2333 -j TPROXY --on-port 60080 --on-ip 127.0.0.1 --tproxy-mark 0x0/0x0
-A SSTP_PRE -p udp -m mark --mark 0x2333 -j TPROXY --on-port 60080 --on-ip 127.0.0.1 --tproxy-mark 0x0/0x0
COMMIT
# Completed on Sun Mar 31 10:25:35 2019
# Generated by iptables-save v1.6.2 on Sun Mar 31 10:25:35 2019
*raw
:PREROUTING ACCEPT [10:736]
:OUTPUT ACCEPT [9:442]
COMMIT
# Completed on Sun Mar 31 10:25:35 2019
# Generated by iptables-save v1.6.2 on Sun Mar 31 10:25:35 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:SSTP_OUT - [0:0]
:SSTP_PRE - [0:0]
-A PREROUTING -j SSTP_PRE
-A OUTPUT -j SSTP_OUT
-A SSTP_OUT -d 127.0.0.1/32 -p udp -m udp --dport 53 -j REDIRECT --to-ports 53
-A SSTP_PRE -s 192.168.2.0/24 -p udp -m udp --dport 53 -m mark ! --mark 0x2333 -j REDIRECT --to-ports 53
COMMIT
# Completed on Sun Mar 31 10:25:35 2019
# Generated by iptables-save v1.6.2 on Sun Mar 31 10:25:35 2019
*filter
:INPUT ACCEPT [10:736]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:442]
COMMIT
# Completed on Sun Mar 31 10:25:35 2019

https://github.com/lisaac/tproxy-gateway/issues/1

内网端口映射到公网失败

ip rule add fwmark 0x01/0x01 table 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -N V2RAY
iptables -t mangle -I V2RAY -d 192.168.1.0/24 -j RETURN
iptables -t mangle -I V2RAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A PREROUTING -j V2RAY

按照上面例子可以实现V2RAY TCP和UDP全部走tproxy,但是端口映射会失败。

我感觉好像所有流量去了TPROXY之后都送给了dokodemo-door才会这样,有没有什么办法不送某个端口流量给dokodemo-door.

我v2ray地址上的某个端口映射到了公网,用上面的例子无法成功映射。

求方法让私网映射端口工作正常。

xt_TPROXY 模块问题

我系统是ubuntu 18.01

运行命令 find /lib/modules/$(uname -r) -type f -name '*.ko*' | grep 'xt_TPROXY'
显示的是 /lib/modules/4.15.0-42-generic/kernel/net/netfilter/xt_TPROXY.ko
一键脚本就会报错
手动部署正常

iptables v1.8.2 不兼容

在debian 9.9 iptables v1.6.2下运行正常。在debian buster,iptables v1.8.2下启动则会报错。几个表不存在。

我制作了一个docker镜像 tcp可以代理,但是udp出现了些问题

使用的ssr 代理
ss-tproxy.conf 配置如下

image

启动之后

tcp网络的可以
image

但是运行 udp透明代理的时候
image

2018-11-12 15:28:05 ERROR: [udp] remote_recv_bind: Address already in use
2018-11-12 15:28:05 ERROR: [udp] remote_recv_bind: Address already in use
2018-11-12 15:28:05 ERROR: [udp] remote_recv_bind: Address already in use

这个是啥很么问题呢? 望解答,谢谢。

gfwlist失灵,无法更新到ipset,dnsmasq也无法将解析出来的IP添加到ipset

# 列出ipset 已有IP
root@VM-0-9-ubuntu:~# ipset list 
Name: gfwlist
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 600
References: 2
Number of entries: 4
Members:
151.101.0.133
151.101.128.133
151.101.192.133
151.101.64.133

# 更新gfwlist
root@VM-0-9-ubuntu:~# ss-tproxy update-gfwlist 

# 更新完看 ipset 有没有新增IP,结果没有增加
root@VM-0-9-ubuntu:~# ipset list 
Name: gfwlist
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 600
References: 2
Number of entries: 4
Members:
151.101.0.133
151.101.128.133
151.101.192.133
151.101.64.133

# 测试解析是否会自动添加到IPset
root@VM-0-9-ubuntu:~# nslookup -port=60053 google.com  
Server:		127.0.0.1
Address:	127.0.0.1#60053

Non-authoritative answer:
Name:	google.com
Address: 216.58.200.46
Name:	google.com
Address: 2404:6800:4008:801::200e

# 结果也没有增加
root@VM-0-9-ubuntu:~# ipset list  
Name: gfwlist
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 600
References: 2
Number of entries: 4
Members:
151.101.0.133
151.101.128.133
151.101.192.133
151.101.64.133

求助,使用shadowsocks-libev,但无法解析域名

尝试用一台CentOS 7.5云服务器搭建ss-tproxy,但是无法解析域名
访问Google的IP地址http://172.217.161.36,可以成功返回,但是方位http://www.google.com则提示无法解析域名。
服务端是自建的,支持udp,如下是配置文件:

## mode
mode='global'
#mode='gfwlist'
#mode='chnroute'

## proxy
proxy_tproxy='false'   # 纯TPROXY方式
proxy_server=(47.*.*.*)   # 服务器的地址
proxy_dports='443'        # 服务器的端口
proxy_tcport='60080'   # TCP 监听端口
proxy_udport='60080'   # UDP 监听端口
proxy_runcmd='(ss-redir -s 47.*.*.* -p 443 -m aes-256-cfb -k ******** -b 0.0.0.0 -l 60080 -u -v >>/var/log/ss-redir.log 2>&1 &)'  # 启动的命令行
proxy_kilcmd='kill -9 $(pidof ss-redir)'  # 停止的命令行

## dnsmasq
dnsmasq_cache_size='10240'              # DNS 缓存条目
dnsmasq_cache_time='3600'               # DNS 缓存时间
dnsmasq_log_enable='true'              # 是否记录日志
dnsmasq_log_file='/var/log/dnsmasq.log' # 日志文件路径

## chinadns
chinadns_mutation='false'                # DNS 压缩指针
chinadns_verbose='false'                 # 记录详细日志
chinadns_logfile='/var/log/chinadns.log' # 日志文件路径

## dns
dns_modify='false'           # 直接修改 resolv.conf
dns_remote='8.8.8.8:53'      # 国外 DNS,必须指定端口
dns_direct='114.114.114.114' # 国内 DNS,不能指定端口

## ipts
ipts_rt_tab='100'              # iproute2 路由表名或 ID
ipts_rt_mark='0x2333'          # iproute2 策略路由的标记
ipts_non_snat='false'          # 不设置 SNAT iptables 规则
ipts_intranet=(10.10.5.0/24) # 内网网段,多个请用空格隔开

## opts
opts_ss_netstat="auto"  # 'auto|ss|netstat',使用哪个端口检测命令

## file
file_gfwlist_txt='/etc/ss-tproxy/gfwlist.txt'   # gfwlist 黑名单文件 (默认规则)
file_gfwlist_ext='/etc/ss-tproxy/gfwlist.ext'   # gfwlist 黑名单文件 (扩展规则)
file_chnroute_txt='/etc/ss-tproxy/chnroute.txt' # chnroute 地址段文件 (chinadns)
file_chnroute_set='/etc/ss-tproxy/chnroute.set' # chnroute 地址段文件 (iptables)

下面是iptables的规则:

# Generated by iptables-save v1.4.21 on Mon Feb 11 00:20:20 2019
*nat
:PREROUTING ACCEPT [11:521]
:INPUT ACCEPT [115:6606]
:OUTPUT ACCEPT [245:17457]
:POSTROUTING ACCEPT [73:5111]
:SSTP_OUT - [0:0]
:SSTP_PRE - [0:0]
:TCPCHAIN - [0:0]
-A PREROUTING -j SSTP_PRE
-A OUTPUT -j SSTP_OUT
-A POSTROUTING -s 10.10.5.0/24 ! -d 10.10.5.0/24 -j MASQUERADE
-A SSTP_OUT -p tcp -j TCPCHAIN
-A SSTP_OUT -d 127.0.0.1/32 -p udp -m udp --dport 53 -j REDIRECT --to-ports 60053
-A SSTP_PRE -s 10.10.5.0/24 -p udp -m udp --dport 53 -m mark ! --mark 0x2333 -j REDIRECT --to-ports 60053
-A SSTP_PRE -s 10.10.5.0/24 -p tcp -j TCPCHAIN
-A TCPCHAIN -d 0.0.0.0/8 -j RETURN
-A TCPCHAIN -d 10.0.0.0/8 -j RETURN
-A TCPCHAIN -d 127.0.0.0/8 -j RETURN
-A TCPCHAIN -d 169.254.0.0/16 -j RETURN
-A TCPCHAIN -d 172.16.0.0/12 -j RETURN
-A TCPCHAIN -d 192.168.0.0/16 -j RETURN
-A TCPCHAIN -d 224.0.0.0/4 -j RETURN
-A TCPCHAIN -d 240.0.0.0/4 -j RETURN
-A TCPCHAIN -d 47.xx.xx.xx/32 -p tcp -m multiport --dports 443 -j RETURN
-A TCPCHAIN -p tcp -j REDIRECT --to-ports 60080
COMMIT
# Completed on Mon Feb 11 00:20:20 2019
# Generated by iptables-save v1.4.21 on Mon Feb 11 00:20:20 2019
*mangle
:PREROUTING ACCEPT [866:57973]
:INPUT ACCEPT [1102:72149]
:FORWARD ACCEPT [2:158]
:OUTPUT ACCEPT [896:1319860]
:POSTROUTING ACCEPT [898:1320018]
:SSTP_OUT - [0:0]
:SSTP_PRE - [0:0]
:UDPCHAIN - [0:0]
-A PREROUTING -j SSTP_PRE
-A OUTPUT -j SSTP_OUT
-A SSTP_OUT -p udp -j UDPCHAIN
-A SSTP_PRE -s 10.10.5.0/24 -p udp -m udp --dport 53 -m mark ! --mark 0x2333 -j ACCEPT
-A SSTP_PRE -s 10.10.5.0/24 -p udp -m mark ! --mark 0x2333 -j UDPCHAIN
-A SSTP_PRE -p udp -m mark --mark 0x2333 -j TPROXY --on-port 60080 --on-ip 127.0.0.1 --tproxy-mark 0x0/0x0
-A UDPCHAIN -d 0.0.0.0/8 -j RETURN
-A UDPCHAIN -d 10.0.0.0/8 -j RETURN
-A UDPCHAIN -d 127.0.0.0/8 -j RETURN
-A UDPCHAIN -d 169.254.0.0/16 -j RETURN
-A UDPCHAIN -d 172.16.0.0/12 -j RETURN
-A UDPCHAIN -d 192.168.0.0/16 -j RETURN
-A UDPCHAIN -d 224.0.0.0/4 -j RETURN
-A UDPCHAIN -d 240.0.0.0/4 -j RETURN
-A UDPCHAIN -d 47.xx.xx.xx/32 -p udp -m multiport --dports 443 -j RETURN
-A UDPCHAIN -j MARK --set-xmark 0x2333/0xffffffff
COMMIT
# Completed on Mon Feb 11 00:20:20 2019

在ss-redir的日志里能看到:

 2019-02-11 00:24:30 INFO: [60080] [udp] cache miss: 8.8.8.8:53 <-> 10.10.5.167:55266
 2019-02-11 00:24:35 INFO: [udp] server receive a packet
 2019-02-11 00:24:35 INFO: [60080] [udp] cache hit: 8.8.8.8:53 <-> 10.10.5.167:55266

v3-master: 使用 chnroute 模式无法连接国内服务器

使用的是最新的提交:
b0e8dea

以下使用 client 指代非网关机器, server 指代运行 ss-tproxy 的机器。

chnroute 模式

设置成 chnroute 模式,client 运行:

 curl https://news.qq.com

就一直卡住,没有输出,而 server 就正常。

client 和 server 获取国外服务器均正常:

 curl https://www.google.com

global 模式

设置成 global 模式,两台机器获取国内国外服务器都正常。

info

已经使用 /usr/local/bin/ss-tproxy update-chnroute 更新过 chnroute 表。

以下是调试信息:

Client:

#dig news.qq.com

; <<>> DiG 9.14.0 <<>> news.qq.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 517
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;news.qq.com.			IN	A

;; ANSWER SECTION:
news.qq.com.		69	IN	CNAME	https.qq.com.
https.qq.com.		545	IN	A	183.3.226.35

;; Query time: 30 msec
;; SERVER: 168.168.0.14#53(168.168.0.14)
;; WHEN: Tue Apr 09 12:58:29 CST 2019
;; MSG SIZE  rcvd: 76

Server:

# ipset test chnroute 183.3.226.35
183.3.226.35 is in set chnroute.

ss-tproxy.conf:

## mode
#mode='global'
#mode='gfwlist'
mode='chnroute'

## proxy
proxy_tproxy='false'   # 纯TPROXY方式
proxy_server=(xxx01 xxx02)   # 服务器的地址
proxy_dports=''        # 服务器的端口
proxy_tcport='60080'   # TCP 监听端口
proxy_udport='60080'   # UDP 监听端口
proxy_runcmd='systemctl start [email protected]'  # 启动的命令行
proxy_kilcmd='systemctl stop [email protected]'  # 停止的命令行

## dnsmasq
dnsmasq_cache_size='10240'              # DNS 缓存条目
dnsmasq_cache_time='3600'               # DNS 缓存时间
dnsmasq_log_enable='true'              # 是否记录日志
dnsmasq_log_file='/var/log/dnsmasq.log' # 日志文件路径

## chinadns
chinadns_mutation='false'                # DNS 压缩指针
chinadns_verbose='false'                 # 记录详细日志
chinadns_logfile='/var/log/chinadns.log' # 日志文件路径

## dns
dns_modify='false'           # 直接修改 resolv.conf
dns_remote='8.8.8.8:53'      # 国外 DNS,必须指定端口
dns_direct='114.114.114.114' # 国内 DNS,不能指定端口

## ipts
ipts_rt_tab='100'              # iproute2 路由表名或 ID
ipts_rt_mark='0x2333'          # iproute2 策略路由的标记
ipts_non_snat='false'          # 不设置 SNAT iptables 规则
ipts_intranet=(192.168.1.0/24 168.168.0.0/16) # 内网网段,多个请用空格隔开

流程过于繁琐…望出 docker 或者优化流程。

昨天折腾了五六个小时…除了网速原因还有就是流程太繁琐了…
ss 不是编译安装还跑不起来…希望优化流程或者出 docker 版本吧,一个新机子,装个 docker 然后直 run 就能当一个网关,我想作者也是希望使用越来越方便的

[Question] multiple proxy_server

How to write multiple servers, I try to follow the instruction, set 2 proxy server in configure file but it not working.

mode

mode='global'
#mode='gfwlist'
#mode='chnroute'

proxy

proxy_tproxy='true' # 纯TPROXY方式
proxy_server=(a.net b.net) # 服务器的地址
proxy_tcport='1080' # TCP 监听端口
proxy_udport='1080' # UDP 监听端口

ss-tproxy可用的情况下,ss-tproxy.service失效了

你好
我的操作系统是Ubuntu 18.04
今天貌似更新了下Systemd,ss-tproxy之前一直能用的自启服务突然失效了

systemctl status ss-tproxy

结果如下

● ss-tproxy.service - linux transparent proxy script
   Loaded: loaded (/etc/systemd/system/ss-tproxy.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sun 2019-02-03 21:04:12 CST; 49s ago
  Process: 6393 ExecStart=/usr/local/bin/ss-tproxy start (code=exited, status=1/FAILURE)
  Process: 6391 ExecStartPre=/bin/bash -c until ping -nq -c1 -W1 114.114.114.114 &>/dev/null; do :; done (code=exited, status=0/SUCCESS)
 Main PID: 6393 (code=exited, status=1/FAILURE)

2月 03 21:04:12 username systemd[1]: Starting linux transparent proxy script...
2月 03 21:04:12 username ss-tproxy[6393]: [ERR]: Require command not found: 'chinadns'
2月 03 21:04:12 username systemd[1]: ss-tproxy.service: Main process exited, code=exited, status=1/FAILURE
2月 03 21:04:12 username systemd[1]: ss-tproxy.service: Failed with result 'exit-code'.
2月 03 21:04:12 username systemd[1]: Failed to start linux transparent proxy script.

可是我安装了ChinaDNS,ss-tproxy check-command没有输出,单独使用ss-tproxy也正常
命令行键入chinadns结果如下

Sun Feb  3 21:16:18 2019 CHNROUTE_FILE not specified, CHNRoute is disabled
Sun Feb  3 21:16:18 2019 chinadns.c:554 bind: Permission denied
Sun Feb  3 21:16:18 2019 Can't bind address 0.0.0.0:53

建议使用PID进行相关应用的启停

目前我是在树莓派上使用ss-tproxy配合create_ap提供wifi全局FQ的。

当我使用ss-tproxy restart的时候,ss-tproxy会将全部的dnsmasq进程都关闭,虽然可以通过更换DHCPD来提供dhcp服务,但是其实只需要ss-tproxy在启动和停止应用的时候,使用pid文件识别就可以解决相关问题了。

关于使用SS作为转发发现的一个问题

首先,感谢作者提供这样一个脚本,真的很方便。
我接下来的问题可能和脚本是无关的,但如果作者有时间的话大家可以一起探讨下。

环境介绍

  • 由多台服务器使用公网打通Wireguard后的局域网
  • 使用 shadowsocks-libev
  • 系统:CentOS 7 64bit 4.12.1

服务器介绍

  1. Aliyun Beijing
  2. RU Server (10.3.0.1/32, 10.3.100.1/32)
  3. De Server (10.3.100.2/32, 10.3.101.1/32)

脚本使用Chnroute + SS方式,并且加了所有的服务器公网IP到Iptables表让他们不走ss-tproxy

proxy_tproxy='false'   # 纯TPROXY方式
proxy_server='10.3.100.2'   # 服务器的地址
proxy_tcport='60080'   # TCP 监听端口
proxy_udport='60080'   # UDP 监听端口
proxy_runcmd='(ss-redir -s 10.3.100.2 -p * -m * -k *-b 0.0.0.0 -l 60080 --no-delay --reuse-port -u -v  </dev/null &>>/var/log/ss-redir.log &)'  # 启动的命令行
proxy_kilcmd='kill -9 $(pidof ss-redir)'  # 停止的命令

该模式使用正常,但是我将10.3.100.2换成10.3.101.1(同一台服务器)ss-tproxy就工作不正常。具体的log如下

cat chinadns.log 
Fri Nov 23 00:49:33 2018 request ip.sb
Fri Nov 23 00:49:33 2018 request ip.sb
Fri Nov 23 00:49:33 2018 response ip.sb from 114.114.114.114:53 - 47.52.68.57, filter
Fri Nov 23 00:49:33 2018 response ip.sb from 114.114.114.114:53 - pass
Fri Nov 23 00:49:38 2018 request ip.sb
Fri Nov 23 00:49:38 2018 response ip.sb from 114.114.114.114:53 - 47.52.68.57, filter
Fri Nov 23 00:49:43 2018 request ip.sb
Fri Nov 23 00:49:43 2018 response ip.sb from 114.114.114.114:53 - Fri Nov 23 00:51:05 2018 request ip.sb
Fri Nov 23 00:51:05 2018 request ip.sb
Fri Nov 23 00:51:05 2018 response ip.sb from 114.114.114.114:53 - 47.52.68.57, filter
Fri Nov 23 00:51:05 2018 response ip.sb from 114.114.114.114:53 - pass
Fri Nov 23 00:51:10 2018 request ip.sb
Fri Nov 23 00:51:10 2018 response ip.sb from 114.114.114.114:53 - 47.52.68.57, filter
Fri Nov 23 00:51:15 2018 request ip.sb
Fri Nov 23 00:51:15 2018 response ip.sb from 114.114.114.114:53 - Fri Nov 23 00:59:51 2018 request ip.sb
Fri Nov 23 00:59:51 2018 request ip.sb
Fri Nov 23 00:59:51 2018 response ip.sb from 114.114.114.114:53 - 47.52.68.57, filter
Fri Nov 23 00:59:51 2018 response ip.sb from 114.114.114.114:53 - pass
Fri Nov 23 00:59:56 2018 request ip.sb
Fri Nov 23 00:59:56 2018 response ip.sb from 114.114.114.114:53 - 47.52.68.57, filter
Fri Nov 23 01:00:01 2018 request ip.sb

此时 德国服务器上并没有收到DNS请求。

2018-11-23 00:38:54 INFO: [udp] server receive a packet
 2018-11-23 00:38:54 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:38:59 INFO: [udp] server receive a packet
 2018-11-23 00:38:59 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:39:04 INFO: [udp] server receive a packet
 2018-11-23 00:39:04 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:39:14 INFO: [udp] server receive a packet
 2018-11-23 00:39:14 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:39:19 INFO: [udp] server receive a packet
 2018-11-23 00:39:19 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:39:30 INFO: [udp] server receive a packet
 2018-11-23 00:39:30 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:39:35 INFO: [udp] server receive a packet
 2018-11-23 00:39:35 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:39:40 INFO: [udp] server receive a packet
 2018-11-23 00:39:40 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:40:47 INFO: [udp] server receive a packet
 2018-11-23 00:40:47 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:40:52 INFO: [udp] server receive a packet
 2018-11-23 00:40:52 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:08 INFO: [udp] server receive a packet
 2018-11-23 00:41:08 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754
 2018-11-23 00:41:13 INFO: [udp] server receive a packet
 2018-11-23 00:41:13 INFO: [udp] cache hit: 8.8.8.8:53 <-> 172.17.25.255:34754

这是阿里云上的ss-redir的log。

首谢感谢您的无私分享,我有两个疑问想与您探讨一下!

第一 这个能不能直接安装在国内的服务器上,因为现在国内很多区域性的问题,这样用户通过VPN或SS连接国内的服务器,就充当了一级的网关的角色!
第二 有没有可以,将所有的dns的请求,全部转发到网关的53上,这样就不用管Client怎么设置dns,都可以正确使用了!

咨询一下一个小问题

首先,看了你的文章和脚本学习到很多,很感谢!
然后有一个小疑惑:我还是不太理解dnsforwarder在整个作用,搜索了一下,dnsforwarder是"将下游的 UDP 协议的 DNS 查询转换成 TCP 协议的 DNS 查询后发送到上游服务器"的作用。但是文中看起来,dnsforwarder好像只是一个DNS 缓存和加速的用途,这是不是可以用Dnsmasq来取代?用dnsforwarder把DNS查询转成TCP,再从本机的chinadns转出去,会不会多了一步?

配置有误

// as ss-redir
{
"port": 60080,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true,
"domainOverride": ["quic"]
}
},
// as ss-tunnel
{
"port": 60053,
"protocol": "dokodemo-door",
"settings": {
"address": "8.8.8.8",
"port": 53,
"network": "udp",
"followRedirect": false
}
},

这个配置settings中漏了一个参数:"domainOverride": ["tls","http"],

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.