Total Pageviews

Wednesday, 31 July 2019

基于python的TCP 层的路由-TcpRoute


TcpRoute, TCP 层的路由器。对于 TCP 连接自动从多个线路(允许任意嵌套)、多个域名解析结果中选择最优线路。
通过 socks5 代理服务器提供服务。目前支持直连及 socks5 代理线路。
已经使用 go 重写,地址:https://github.com/GameXG/TcpRoute2/

windows 安装

有二进制文件发布,直接下载 dist/tcpRoute.exe 、dist/config 修改配置并执行即可。

linux 安装

$ sudo pip install greenlet gevent dnspython
$ vi config.json  # 修改配置
$ python tcpRoute.py

配置

config.json 为配置文件,json格式。
{
  "log_level":"INDO",
  "port":7070,
  "nameservers":"system",
  "nameservers_backup":["8.8.8.8","8.8.4.4","208.67.222.222","208.67.220.220"],
  "upstream":
  {
    "type":"multipath",
    "list":
    [
      {
        "type":"direct",
        "source_ip":"0.0.0.0",
        "source_port":0
      },
      {
        "type":"socks5",
        "host":"127.0.0.1",
        "port":5555,
        "upstream":
        {
          "type":"direct",
          "source_ip":"0.0.0.0",
          "source_port":0
        }
      }
    ]
  },
  "IpBlacklist":[]
}
"logLevel":"INDO", 为日志级别。一般 INFO 即可,调试时可以使用 DEBUG 。
port 为对外提供代理服务的端口。目前只支持 socks5 无密码 协议。浏览器等代理服务器填写 127.0.0.1 ,端口填写这个端口号,协议选择 socks5 即可。
nameservers 、nameservers_backup 为DNS解析服务器地址,在 nameservers 解析出错时会启用 nameserversBackup 解析。 支持过滤域名纠错,支持过滤部分DNS欺骗,在 nameservers 解析错误后会尝试 TCP DNS协议。
可选的格式:
  • "system" 使用系统DNS解析
  • "8.8.8.8" 使用 "8.8.8.8" 解析
  • ["8.8.8.8","208.67.222.222"] 使用两个服务器进行解析
upstream 为使用上级代理。支持代理服务器嵌套,多代理自动选择等功能。
"type":"multipath", 类型表示本上层代理为多代理聚合,负载均衡策略为对每个连接自动选择最快的线路连接目标网站。"list" 是上层代理服务器列表。
"type":"direct", 表示直连,可以指定源地址。在多线路(电信+联通)时可以通过指定多个源地址配合路由器实现自动选路。
"type":"socks5", 表示 socks5 代理,"host" 、 "port" 为上级代理的地址及端口。
TcpRoute multipath 聚合代理会同时尝试使用直连及所有的代理服务器建立连接,最终使用最快建立连接的线路。TcpRoute 会缓存检测结果方便下次使用。
IpBlacklist 为静态 ip 黑名单,黑名单上的ip不会用来建立连接(目前直连线路使用)。一般不需要配置,系统会自动检测异常ip并屏蔽。 格式为["123.123.123.123","456.456.456.456"]

具体细节

  • 对 DNS 解析获得的多个IP同时尝试连接,最终使用最快建立的连接。
  • 同时使用直连及代理建立连接,最终使用最快建立的连接。
  • 缓存10分钟上次检测到的最快线路方便以后使用。
  • 解析不存在域名获得域名纠错IP,并添加到 IP黑名单
  • 使用不存在DNS服务器解析域名,获得异常IP,并添加到 IP黑名单
  • 不使用异常的dns解析结果。

感谢


-----------------------------------------------

TcpRoute , TCP 层的路由器。对于 TCP 连接自动从多个线路(电信、联通、移动)、多个域名解析结果中选择最优线路。

TcpRoute2

Build Status release GitHub license platform
TcpRoute , TCP 层的路由器。对于 TCP 连接自动从多个线路(允许任意嵌套)、多个域名解析结果中选择最优线路。
TcpRoute 使用激进的选路策略,对 DNS 解析获得的多个IP同时尝试连接,同时使用多个线路进行连接,最终使用最快建立的连接。支持 TcpRoute 级别 Hosts 文件,支持黑白名单。提供代理、hosts 信誉度功能,只通过不安全的代理转发 https 等加密连接,提高安全性。当配合 redsocks、Proxifier 作为全局代理时可以启动“强制TcpRoute Dns解析”,强制将浏览器本地 DNS 解析改为代理服务器进行DNS解析来更好的优化网络连接,避免 Dns 污染造成的网络故障。
增加了反运营商 http 劫持功能,有两种方式,简易拆包反劫持及ttl反劫持。
通过 socks5 代理协议对外提供服务。
代理功能拆分成了独立的库,详细代理url格式及选项请参见 ProxyClient,目前支持直连、socks4、socks4a、socks5、http、https 等线路。其中 socks5 支持用户名、密码认证,http、https 支持用户名、密码基本认证。

安装

在 releases 有各个系统的 zip 包。根据系统下载对应的 zip 文件。解压后复制 config.toml.example 为 config.toml ,并根据 toml 内说明配置好上游代理即可。
Windows 下有图形界面,TcpRoute2-windows-gui-386.zip、TcpRoute2-windows-gui-amd64.zip 即带图形界面的版本。

配置

默认使用当前目录下的 config.toml 文件。
# TcpRoute2 配置文件
# https://github.com/GameXG/TcpRoute2
# 为 TOML 格式,格式说明:https://segmentfault.com/a/1190000000477752

# TcpRoute 监听地址
# 目前只对外提供 socks5 协议。
#
# addr = "127.0.0.1:7070"
# 默认值,表示监听 127.0.0.1 的 7070 端口,仅本机使用 TcpRoute 时建议这样配置。
# 将浏览器代理设置为 socks5 127.0.0.1:7070 即可使用 TcpRoute 代理访问网络。
#
# addr = ":7070"
# 监听所有 ip 地址的 7070 端口,允许其他计算机使用 TcpRoute 访问网络时建议这样配置。
# 将浏览器代理设置为 socks5 TcpRoute计算机IP:7070 即可使用 TcpRoute 代理访问网络。

addr="127.0.0.1:7070"


####################
# 客户端dns解析纠正功能
####################
# 当发现浏览器等客户端进行了本地dns解析时本功能将强制转换为 TcpRoute 进行dns解析。
# 使用 redsocks、Proxifier 实现全局代理时,应用程序会进行本地dns解析,启用这个功能将强制为代理进行dns解析。
# 开启这个功能将避免应用程序本地dns解析时无法避免 dns 污染的问题,同时代理负责DNS解析也能更好的优化网络访问。
#
# chrome 默认是远端dns解析,当不使用 redsocks、Proxifier 时不需要这个功能。
# firefox 很早之前默认是本地 dns 解析,不过可以修改为远端dns解析。目前是什么情况就不知道了。
#
# https 协议下 TcpRoute 是通过 SNI 功能来获得的目标网站域名。
# 因为 WinXP 系统下 IE 所有版本都不支持 SNI 功能,所以 windows xp IE 下 https 强制远端解析功能无效。
#
# 例子:
# PreHttpPorts=[80,]
# PreHttpsPorts=[443,]
# 这个是默认值,对 80 端口的 http 请求启用,对 443 端口的 tls 连接启用。
#
# PreHttpPorts=[0,]
# PreHttpsPorts=[0,]
# 关闭这个功能
#
# 原理:
# TcpRoute 接收到目的地址是域名的请求将不执行“客户端dns解析纠正功能”,
# 但当目的地址是 ip 时,将会读取客户端发出的请求,http 读取 hosts 字段获得域名,https 通过 SNI 功能获得域名。
# 之后将目标网站ip替换为域名,再执行转发操作。


####################
# 线路
####################
#
# TcpRoute 将根据一定的策略使用这里指定的线路(上游代理)将收到的请求请求转发出去。
#
# 目前的策略是 TcpPing ,即同时使用多个线路建立连接,最终使用最快建立连接的线路处理请求。
# 当某条线路访问某网站出现异常(响应超时、连接重置等)时将会被记录下来,下次访问同一网站时将跳过这个线路。
# 允许通过黑白名单指定每个线路允许、拒绝访问指定的网站。
#
# 目前上游代理支持 直连、http、https、socks4、socks4a、socks5 及 ss 协议,其中 http、https、socks5、ss 支持密码认证。
# 注意:直连也必须手工指定,当不指定时将不会使用直连转发请求。
#
##########
# 线路(上游代理)配置说明
##########
# [[UpStreams]]
#
# Name="direct"
# 线路名字,主要是日志使用。默认值为 ProxyUrl 项的内容。
#
#
# ProxyUrl="direct://0.0.0.0:0000"
# 线路(上游代理) URL
# 提供代理的类型、地址、用户认证方式等信息。
# 默认值为:"direct://0.0.0.0:0000"
#
# 支持 直连、http、https、socks4、socks4a、socks5 等协议,其中 http、https、socks5等支持密码认证。
# 允许多层嵌套代理。代理部分已经拆分成了独立的库,详细配置信息可以到 https://github.com/GameXG/ProxyClient 参看。
#
# 可以通过参数指定一些特殊选项,例如,https 代理是否验证服务器 tls 证书。
# 参数格式为:?参数名1=参数值1&参数名2=参数值2
# 例如:https://123.123.123.123:8088?insecureskipverify=true
#     全体协议可选参数: upProxy=http://145.2.1.3:8080 用于指定代理的上层代理,即代理嵌套。默认值:direct://0.0.0.0:0000
#
# 支持的代理协议:
# http 代理 http://123.123.123.123:8088
#     可选功能: 用户认证功能。格式:http://user:password@123.123.123:8080
#     可选参数:standardheader=false true表示 CONNNET 请求包含标准的 Accept、Accept-Encoding、Accept-Language、User-Agent等头。默认值:false
#
# https 代理 https://123.123.123.123:8088
#     可选功能: 用户认证功能,同 http 代理。
#     可选参数:standardheader=false 同上 http 代理
#     可选参数:insecureskipverify=false true表示跳过 https 证书验证。默认false。
#     可选参数:domain=域名 指定https验证证书时使用的域名,默认为 host:port
#
# socks4 代理 socks4://123.123.123.123:5050
#     注意:socks4 协议不支持远端 dns 解析
#
# socks4a 代理 socks4a://123.123.123.123:5050
#
# socks5 代理 socks5://123.123.123.123:5050
#     可选功能:用户认证功能。支持无认证、用户名密码认证,格式同 http 代理。
#
# 等代理
#
# 直连 direct://0.0.0.0:0000
#     可选参数: LocalAddr=0.0.0.0:0 表示tcp连接绑定的本地ip及端口,默认值 0.0.0.0:0。
#     可选参数: SplitHttp=false true 表示拆分 http 请求(分多个tcp包发送),可以解决简单的运营商 http 劫持。默认值:false 。
#              原理是:当发现目标地址为 80 端口,发送的内容包含 GET、POST、HTTP、HOST 等关键字时,会将关键字拆分到两个包在发送出去。
#              注意: Web 防火墙类软件、设备可能会重组 HTTP 包,造成拆分无效。目前已知 ESET Smart Security 会造成这个功能无效,即使暂停防火墙也一样无效。
#              G|ET /pa|th H|TTTP/1.0
#              HO|ST:www.aa|dd.com
#     可选参数: sleep=0  建立连接后延迟多少毫秒发送数据,配合 ttl 反劫持系统时建议设置为10置50。默认值 0 。
#
# DnsResolve=true
# 是否执行本地dns解析,只建议直连、socks4 线路设置为 true 。
# 设置为 true 时将由 TcpRoute 进行本地 DNS 解析,目前主要是同时使用本地操作系统dns解析及 TcpRoute hosts dns解析。
# 解析获得多个IP时将会同时建立到多个ip的连接,最终使用最快建立连接的ip。
# 设置为 false 时将由上游代理负责dns解析。建议 http、https、socks4a、socks5 等代理都设置为 false 。
# 默认值 false
#
#
# Credit=0
# 线路的信誉度
# 代理线路不安全时建议使用这个选项。
# 当信誉度低于 0 时将不会通过这个线路建立明文协议(http、ftp、stmp等)的连接。
# 各协议需要的信誉度:https://github.com/GameXG/TcpRoute2/blob/master/netchan/dialchan_filter.go#L19
# 默认值 0
#
#
# Sleep=80
# 使用本线路前等待的时间(单位毫秒)
# 主要目的是降低上游代理的负担。
# 建议直连线路设置为 0 ,代理线路设置为 80(毫秒) 。
# 国内 baidu、qq tcping一般是30ms,这里设置为80ms(0.08秒),
# 可以使得大部分国内站点不会尝试通过代理访问,降低上游代理的负担。
# 0.08秒的延迟很低,并且建立连接后会缓存最快连接记录,不会再次延迟,所以不建议删除。
# 当目标网站匹配域名白名单、黑名单,即手工指定线路时,Sleep 参数无效。
# 默认值 0
#
#
# CorrectDelay=0
# 修正延迟
# 某协议缺陷,协议并不会报告是否连接到了目标网站,所以无法获得真实的建立到到目标网站的耗时。
# 无法获得准确的到目标网站的耗时将使得 tcpping 策略无法准确的评估各个线路的速度,所以增加了这个选项用来手工修正。
# tcpping 策略评估最快建立连接的线路时会以 “建立连接的实际耗时 + CorrectDelay” 进行评估,选出最快建立连接的线路。
#
#
######
# 域名白名单
######
# 当前线路的域名白名单(线路级别),白名单内的域名将只从当前线路转发。
# 当一个域名同时存在多个线路白名单内时,将会同时从多个线路尝试建立连接。
# 单个线路可以配置多个白名单,每个白名单一个 [[UpStreams.Whitelist]] 即可。
# 当不存在 [[UpStreams.Whitelist]] 项目时即表示不配置白名单。
# 当目标网站匹配域名白名单、黑名单,即手工指定线路时,线路的 Sleep 参数无效。
#
# [[UpStreams.Whitelist]]
#
# Path="direct.txt"
# 允许本地文件及 http 、https 白名单文件。
# 本地路径是相对路径时,实际路径是相对于 config.toml 文件所在目录。TcpRoute 会检测 hosts 文件修改并自动重新载入。
# http、https 域名文件将按 UpdateInterval 间隔定时更新。
# 不允许单个 [[UpStreams.Whitelist]] 下面出现多个 Path 指定多个白名单文件。
# 多个白名单需要分别放到不同的 [[UpStreams.Whitelist]] 下面。
# 默认值:必填
#
# Path="https://raw.githubusercontent.com/renzhn/MEOW/master/doc/sample-config/direct"
# 感谢 renzhn MEOW 维护的境内网站白名单
#
# Path="https://raw.githubusercontent.com/GameXG/TcpRoute2/master/direct.txt"
# 感谢 puteulanus 整理的 unblock youku 最小国内网站白名单。
#
#
# UpdateInterval="24h"
# 网络 hosts 文件更新间隔
# 最小有效值 1 分钟, 格式为:"1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
# 下载失败时 UpdateInterval 不会生效,将等待 1 分钟重试。
# 默认值: "24h"
#
#
# Type="suffix"
# 域名类型
# 指定域名文件的匹配类型
# base 完整匹配,默认值。即 www.abc.com 只匹配 www.abc.com ,不匹配 aaa.www.abc.com 。
# suffix 后缀匹配。即 abc.com 匹配 abc.com、www.abc.com、aaa.www.abc.com,不匹配 aaaabc.com。
#     注意,想匹配 *.cn 的域名请直接使用 cn ,而不要使用 .cn ,程序内部会自动增加"."。
# pan 泛解析匹配。即 *.abc.com 匹配 www.abc.com 、aaa.www.abc.com。不匹配 .abc.com。?.abc.com 匹配 a.abc.com。
# regex 正则匹配。即 ^.+?.com$ 匹配 www.abc.com 、aaa.www.abc.com。注意:完整匹配时不要忘记 ^$ 。
# 默认值:"base"
#
######
# 域名黑名单
######
# 同域名白名单
# [[UpStreams.Blacklist]]
# 同白名单。
#
# Path="proxy.txt"
#
# Path="https://raw.githubusercontent.com/renzhn/MEOW/master/doc/sample-config/proxy"
# 感谢 renzhn MEOW 维护的网站黑名单
#
# UpdateInterval="24h"
# Type="suffix"


# 直连线路例子:
# 注意:直连也必须手工指定,当不指定时将不会使用直连转发请求。
[[UpStreams]]
Name="direct"
ProxyUrl="direct://0.0.0.0:0000"
DnsResolve=true
# DnsResolve 表示是否执行本地dns解析,直连线路建议指定为 true。

# 直连线路域名白名单
# 各个线路的白名单、黑名单是独立的,可以通过多个 [[UpStreams.Whitelist]] 指定多个白名单。
[[UpStreams.Whitelist]]
Path="https://raw.githubusercontent.com/GameXG/TcpRoute2/master/direct.txt"
# 感谢 puteulanus 整理的 unblock youku 最小国内网站白名单。
UpdateInterval="24h"
Type="suffix"

# 代理线路例子:
[[UpStreams]]
Name="proxy1"
ProxyUrl="socks5://123.123.123.123:5050"
Credit=0
# Credit 表示代理信誉度,低于0的将不会通过当前线路转发明文协议(http、ftp等)的请求。
Sleep=80
# Sleep表示使用本线路前等待的时间,单位毫秒。
CorrectDelay=0
# CorrectDelay 表示当前线路修正延迟,某协议建议设置为 50-100 之间的值,非某协议代理设置为 0。


####################
# Hosts 功能
####################
# 独立与操作系统的 hosts,只对于代理生效。
# 允许通过多个 [[hosts]] 项来同时使用多个 hosts 文件 。
#
# [[Hosts]]
#
# Path="hosts/racaljk_hosts.txt"
# hosts 路径,同域名白名单,允许本地、http、https文件。
# 默认值:必填
#
# Path="https://raw.githubusercontent.com/racaljk/hosts/master/hosts"
# 感谢 https://github.com/racaljk/hosts 项目维护 hosts
#
#
# Type="base"
# hosts 域名类型,同域名白名单。标准的 hosts 文件都是 base 类型。
# 默认值:"base"
#
#
# UpdateInterval="24h"
# 网络 hosts 文件更新间隔
# 最小有效值 1 分钟, 格式:"1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
# 下载失败时 UpdateInterval 不会生效,将等待 1 分钟重试。
# 默认值:"24h"
#
#
# Credit=-100
# hosts 信誉度
# 同线路信誉信誉度,对于小于 0 的 hosts文件将只用于 https 等自带加密的协议。
# 在某些情况下为了防止 http 明文协议分析阻断连接,建议设置为小于 0 的值。
# 默认值:0

# 一个例子
[[Hosts]]
Path="https://raw.githubusercontent.com/racaljk/hosts/master/hosts"
# 感谢 https://github.com/racaljk/hosts 项目维护 hosts
Credit=-100

强制代理服务器 DNS 解析功能

redsocks、Proxifier 全局代理及部分应用会执行本地DNS解析,这样将无法很好的执行优化。启用这个功能后 TcpRoute2 将在发现客户端执行了本地 DNS 解析时强制改为代理服务器进行DNS解析来更好的优化网络连接。
解决了路由器通过 redsocks 配置成全局透明代理时无法应对dns污染的问题。
由于 https 协议是通过 SNI 功能来获得的目标网站域名,所以 WinXP 系统下 IE 所有版本都无法使用 https 强制远端解析功能。

信誉度功能

增加了代理信誉度、dns信誉度的功能,对于信誉度低的代理将只允许 https 、smtp ssl 等本身支持服务器认证的协议。这样使用不安全的代理也能比较安全。

Hosts 功能

增加了代理级别的 hosts 文件,支持本地及网络hosts文件。通过hosts即使在不存在上层代理的情况下也可以优化网络访问。hosts 文件同样也有信誉度功能。
感谢 https://github.com/racaljk/hosts 项目维护 hosts 。

白名单、黑名单功能

允许指定的域名走指定的线路,指定的域名不走指定的线路。 黑白名单是线路级别的,而不是全局的,每个线路都有自己的黑白名单。
感谢 https://github.com/renzhn/MEOW 维护了国内域名白名单。

防运营商 HTTP 劫持功能

拆包反劫持功能

通过拆分 http 请求到多个 tcp 包来实现简易http反劫持功能,只能应付简单的http劫持。 通过 SplitHttp 选项开启,默认关闭。 注意:部分杀毒软件、防火墙会重组 http 请求tcp包,造成这个功能无效。
基本不会造成性能损耗。
实现原理:当目标端口是80时,发出的请求一旦包含 GET、POST、HTTP、HOST则会被拆分到多个TCP包发送。

ttl 反劫持功能

ttl 反劫持是独立的程序,需要单独启动ttl反劫持程序,并将直连线路的 sleep 设置为10至50之间的值。
实现原理:当发现 http 连接建立时,将会发送错误数据、连接重置命令混淆http连接。通过设置 ttl 值使得错误数据、重置命令不会到达目标网站,只会在网络中传递,经过并干扰可能存在的http劫持系统。
sleep 的目的是建立连接后不立刻发送数据,而是等待 ttl 反劫持程序发送混淆内容后再发送实际数据。 一般ttl反劫持程序发送混淆数据的耗时为10-30毫秒,sleep设置为大于这个值即可。

具体细节

  • 对 DNS 解析获得的多个IP同时尝试连接,最终使用最快建立的连接。
  • 同时使用直连及代理建立连接(可设置延迟),最终使用最快建立的连接。
  • 缓存10分钟上次检测到的最快线路方便以后使用。
  • 解析不存在域名获得域名纠错IP,并添加到 IP黑名单。



open source projects

the following is the list of open source projects which has Chinese companies as active supportors.
Notable Open Source projects started by Chinese:
This list is incomplete, I hope one day there will be a Chinese company out reach even more open source communities like Redhat

快速找到应用软件Hosts的方法

对于本地应用软件(例如Dropbox),如何快速找到其可用Hosts呢,今天我就介绍一下通用的快速找到本地应用软件可用Hosts的方法。
  基本思路是,通过Sniffer嗅探器来监控本地应用的网络连接情况,然后整理其访问域名,找到这些域名的真实IP,将这些IP添加到Hosts文件即可。
  我使用的是一个名为DNSQuerySniffer的嗅探工具,该工具能够实时显示本地电脑的DNS查询记录,对于每一个DNS解析查询,显示以下信息:主机名,端口号,查询ID,请求类型,请求响应时间,响应代码等记录,并返回的DNS记录的内容。
  以Dropbox软件为例,先关闭其他没用的客户端软件,打开DNSQuerySniffer,然后运行Dropbox,记录下其访问过的域名。使用一个Ping工具找出这个域名对应的ip地址。
  找到可用IP后,就可以添加这个IP到Hosts文件里了,先关闭“电脑管家”、“360安全卫士”这类工具,然后编辑C:\Windows\System32\drivers\etc\hosts文件,在文件结尾添加一行“可用IP地址 目标域名”即可。
  之后如果“电脑管家”、“360安全卫士”等工具检测hosts文件提供风险,只需信任这个文件并将其添加到白名单即可。
  域名添加到Hosts文件中,DNSQuerySniffer就不会再检测到该域名的解析,然后继续运行Sniffer嗅探器和应用软件,一个一个找出所有的无效域名,然后手动将每个域名都添加到Hosts文件即可。
  此方法是通用的寻找本地应用软件可用Hosts的方法,适合所有本地应用软件域名解析错误导致无法运行等问题。
用到的工具:
------------
DNSQuerySniffer:
网络嗅探工具,能够实时显示本地电脑的DNS查询记录。对于每一个DNS解析查询,显示以下信息:主机名,端口号,查询ID,请求类型,请求响应时间,响应代码等记录,并返回的DNS记录的内容。还可以将DNS查询信息输出到CSV等文件。
用它我们可以找到本地应用的Hosts,简直是 Firefox中的ipvfox,Chrome中的ipvfoo 的高级版。话说我就是靠ipvfoo找到百度网盘的ipv6地址,从此开启了一篇好贴,拯救了多少校园网按流量计价的少年(天哪我现在讲话怎么是这种风格)。
如月光博客所说,我们只要使用这个工具,记录下网站或本地应用访问过的、但被DNS污染的域名,再使用一个Ping工具找出这些域名对应的可用IP后,就可以添加这个IP到Hosts文件里了。域名添加到Hosts文件后,DNSQuerySniffer就不会再检测该域名的解析。