V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
pagxir
V2EX  ›  分享创造

撸了个转换 socks 代理的小工具,有点点像 proxifier, proxycap 的小工具,让不支持的代理可以使用代理访问网络。

  •  1
     
  •   pagxir · 2014-12-20 16:15:15 +08:00 · 9912 次点击
    这是一个创建于 3633 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原理是这样:
    多数软件都会执行域名解析。在系统执行域名解析时,悄悄的将解释出的IP替换掉(通常替换成 127.0.x.x的一个本地回环IP)。那么,软件直接接的就不是目标IP, 而是替换后的IP,该IP被替换之后,会自动把域名还原回来,并通过socks代理真正的连接到目标真正IP地址。这样,只需要软件执行域名解析,就会被默默的通过代理链接服务器,从而把不支持服务器变成支持。

    从上面的原理,看到,这个方法缺点很明显,就是如果软件没有使用域名,而是使用IP(跳过域名解析这一步骤)直接连接。

    实现的代码见这里: https://github.com/pagxir/libtx 代码可以在FreeBSD/linux/win32上执行,但是只有linux/win32下,功能能正常使用。

    编译很简单, 不需要依赖于额外的库,直接 checkout 执行 make即可,如果需要编译win32的版本,可以在linux 环境下安装 mingw32 来进行交叉编译,执行 checkbuild.sh就可以。

    编译完成之后,生成 txrelay.exe (win32执行文件), txrelay (linux执行文件)。

    默认的配置文件: dnstxrelay.conf,

    1、将里面的 translate white-list 替换为 translate black-list

    2、将里面的 nameserver 127.0.0.1:53 172.24.63.162:53 替换成 nameserver 127.0.0.1:53 <your-real-dns-server-ip>:53, 然后把你电脑的主dns设置为 127.0.0.1。

    3、修改 relay socks5://127.0.0.1:8080 这一行设置为你的代理的IP地址和端口(不要写域名), 如果是你代理服务器是 https类型 则将 socks5 替换为https,如果socks4则以此类推。目前不支持代理认证。配置文件仅作参考。

    修改完成之后, 执行txrelay -f dnstxrelay.conf, 软件就会自动侦听80/443端口,如果你的代理服务器能访问youtube的话,这个时候,你IE浏览器设置成步需要代理应该可以访问youtube的了。

    你可以可以试试 nslookup www.facebook.com, 如果解析出来的IP地址是127.0.0.x 说明dns开始正常工作的了。

    注意linux下因为需要绑定tcp/80 tcp/443 udp/53端,所以需要root权限。

    如果有更新,请看这里: http://www.shifenwa.com/archives/16
    21 条回复    2015-04-16 16:47:36 +08:00
    gv0900
        1
    gv0900  
       2014-12-20 16:44:02 +08:00 via Android
    我是小白来学习了
    ifwangs
        2
    ifwangs  
       2014-12-20 16:50:40 +08:00
    学习下
    LazyZhu
        3
    LazyZhu  
       2014-12-20 16:55:26 +08:00
    协议没有哦
    tony1016
        4
    tony1016  
       2014-12-22 10:26:32 +08:00
    不错,继续努力
    mwylaoma
        5
    mwylaoma  
       2015-04-02 10:40:55 +08:00
    能否编译一下给我?我这边没有编译的环境
    mwylaoma
        7
    mwylaoma  
       2015-04-02 13:13:50 +08:00
    @pagxir 谢谢
    mwylaoma
        8
    mwylaoma  
       2015-04-02 13:33:38 +08:00
    @pagxir 我这边会提示出错,
    domain go.baidu.com 2d00007f
    domain li.baidu.com 2e00007f
    translate blacklist
    antigfw: 6060808 20
    nameserver: 127.0.0.1:53 210.21.196.6:53
    nsttl not supported yet!
    relay server socks5://127.0.0.1:1080

    password (
    user 'u
    get target address failure!
    dynamic-range: 127.0.0.1 127.255.255.255
    bind tcp port failure: port=80
    Assertion failed: err == 0, file txrelay.cpp, line 1053

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    pagxir
        9
    pagxir  
    OP
       2015-04-02 13:43:31 +08:00
    80端口被占用,或者需要系统管理员身份才能绑定这个端口。你是什么系统的?
    LazyZhu
        10
    LazyZhu  
       2015-04-15 13:19:19 +08:00 via iPhone
    @pagxir 监听端口可否改成自定义?
    pagxir
        11
    pagxir  
    OP
       2015-04-15 13:25:33 +08:00
    @LazyZhu 修改这个文件 dnstxrelay.conf 就可以了,增加删除端口都可以。如果不是给浏览器用的话,直接把里面的 80 / 443 端口删除。
    LazyZhu
        12
    LazyZhu  
       2015-04-15 13:28:31 +08:00 via iPhone
    @pagxir 不看源码的话,配置文件完全看不懂。
    pagxir
        13
    pagxir  
    OP
       2015-04-15 13:30:00 +08:00
    并且由两个特殊的后缀 .int 和 .ext
    .int 是域名强转换操作, 比如www.163.com.int 将 返回 转换后 www.163.com 的地址,访问www.163.com.int 就相当于通过 代理连接 www.163.com, 同理 8.8.8.8.int会自动通过代理链接到 8.8.8.8

    .ext 则会直接返回没有转换的地址,而直接忽略配置文件。比如 www.google.com.ext 会返回google的没经过代理的地址。
    pagxir
        14
    pagxir  
    OP
       2015-04-15 13:31:54 +08:00
    @LazyZhu
    删掉配置文件众的这两行:

    listen 80 dynamic ns-ttl 60
    listen 443 dynamic ns-ttl 60
    LazyZhu
        15
    LazyZhu  
       2015-04-15 23:58:15 +08:00
    LazyZhu
        16
    LazyZhu  
       2015-04-16 00:09:22 +08:00
    @pagxir
    匹配到的fakedn是否是通过代理进行DNS查询的?
    pagxir
        17
    pagxir  
    OP
       2015-04-16 10:15:23 +08:00
    @LazyZhu 不是的,是直接配置文件加载的。只有fakeip才是通过DNS查询返回的结果。

    openwrt可以修改一下:
    dynamic-range 127.0.0.12 127.255.255.255

    dynamic-range 100.61.0.12 100.61.255.255

    同时增加回环IP,执行命令:
    ip addr add 100.61.0.1/10 dev lo scope global

    同时你可以用iptables把端口转发一下。
    pagxir
        18
    pagxir  
    OP
       2015-04-16 10:33:42 +08:00
    @LazyZhu 已经增加了个类似的功能,但是不依赖与fakeip.
    LazyZhu
        19
    LazyZhu  
       2015-04-16 15:02:44 +08:00 via iPhone
    @pagxir
    无法理解你的回复,参数的作用能不能写个使用说明?
    pagxir
        20
    pagxir  
    OP
       2015-04-16 16:01:38 +08:00
    默认的配置文件中,所有被转换的域名生成的地址都是127.0.x.x (范围在dynamic-range 127.0.0.12 127.255.255.255 中)。所以,当这个程序运行在openwrt中当作dns中继的时候,其他设备将这个openwrt当作路由器时,进行域名解析时候收到的被转换的域名是127.0.x.x, 会被设备当作是本地回环地址,而无法路由出去。

    而修改成 dynamic-range 100.61.0.12 100.61.255.255, 设备就会自然的将发包给openwrt进路由。

    这一行的功能是:
    ip addr add 100.61.0.1/10 dev lo scope global
    将这个网段的捕获给回环设备,从而交给txrelay处理,这样txrelay就可以成功的将域名的访问透明的转换为socks5的代理方法连接。

    之所以用iptables的原因是因为可能默认的80/443端口可能被其他进程用到,所以可以把
    100.61.0.1/10 的这个网段的80/443转发成其他端口,让rxrelay在其他端口上监听。
    pagxir
        21
    pagxir  
    OP
       2015-04-16 16:47:36 +08:00
    关于判断是否域名污染的原理,有个人写过,但是暂时无法找到了。大致是,往境外发一个DNS请求包,目的地址的服务器并非是一个DNS服务器,所以期待的结果是完全没有应答。但是经过GFW的时候,因为GFW认为它是个被墙的域名,所以会伪造一个DNS应答。

    也就是说,如果收到GFW的伪造的应答就说明该域名被墙了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2710 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:29 · PVG 15:29 · LAX 23:29 · JFK 02:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.