撸了个转换 socks 代理的小工具,有点点像 proxifier, proxycap 的小工具,让不支持的代理可以使用代理访问网络。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
pagxir
V2EX    分享创造

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

  •  1
     
  •   pagxir 2014-12-20 16:15:15 +08:00 10326 次点击
    这是一个创建于 3950 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原理是这样:
    多数软件都会执行域名解析。在系统执行域名解析时,悄悄的将解释出的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
    我是小白来学习了
    ilay1678
        2
    ilay1678  
       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     Solana     963 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:35 PVG 06:35 LAX 15:35 JFK 18:35
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86