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

分享个可以把多个 tcp 端口流量通过 http 或者 socks5 转发的脚本

  •  
  •   sujin190 ·
    snower · 2021-08-21 15:01:36 +08:00 · 1377 次点击
    这是一个创建于 1218 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://gist.github.com/snower/f2852ea703b2ddffbec48b0fa294ffff

    有时候访问很多连接或者速度不佳的网址时,但又不方便为整个程序设置代理,或者整个程序不支持设置代理,那么可以使用该脚本配合 hosts 和 iptables 就可以为特定域名配置通过代理访问远程网址了,解除也很方便,删掉 IP tables 就是直接访问不走代理了

    使用方式也简单,在 arguments 数组中填写需要代理的域名和为这个域名指定一个单独端口,然后脚本启动的时候用-P 参数指定代理服务器地址就行了,hosts 和 iptables 添加信息在脚本中都有示例,而且该脚本运行机器和 iptabels 和 hosts 添加修改的机器不是同一台机器也是可以的

    9 条回复    2021-08-23 23:49:22 +08:00
    xingheng
        1
    xingheng  
       2021-08-21 16:39:26 +08:00
    楼主能解释一下原理吗?没看懂这个代理流量是怎么走的
    sujin190
        2
    sujin190  
    OP
       2021-08-21 16:57:48 +08:00
    @xingheng #1 很简单啊,在 hosts 文件中为需要走代理的域名指定一个特定的 ip,然后在 iptables nat 的 OUPUT 中添加捕获这个 ip 的流量做 DNAT 改写目的地址到脚本启动对应域名配置的端口,这个端口在收到流量后加上 http 或者 socks5 协议信息,发往代理服务器,代理服务器就能正常的连接远程服务器了,通过这种方式可以在不给程序配置代理或者程序不支持代理的情况下也可以使用代理访问远程服务器了

    如果你在 hosts 中写的 ip 地址就是这个域名正常解析的 ip 地址,那么其实只需要控制 iptables 记录就可以非常简单的控制是直接访问还是通过代理访问

    当前脚本添加的代理协议地址只是比较简单的不支持账户密码认真的方式,我想大部分情况估计也够用了吧
    xingheng
        3
    xingheng  
       2021-08-21 17:17:10 +08:00
    @sujin190 #2 受教了!很巧妙的方式,确实有用。
    还有一个问题,我应该怎样调试目标 ip 被拦截的情况呢?
    xingheng
        4
    xingheng  
       2021-08-21 17:22:25 +08:00
    没成功,看不出来哪儿错了,没有捕获的日志什么的,1080 确实是可用的 socks 端口。
    sujin190
        5
    sujin190  
    OP
       2021-08-21 18:52:42 +08:00
    @xingheng #4 有错误会打印出来,可以看看代理那边的日志看看是否正常收到请求了,不行抓包大法看看流量怎么转发的,应该可以看出来哪一步没有完成
    sujin190
        6
    sujin190  
    OP
       2021-08-21 19:07:42 +08:00
    @xingheng #4 看这个地方的日志,似乎 iptables 并没有完成把流量转到脚本这边的过程

    2021-08-21 19:04:03 I listen server at 0.0.0.0:443 to github.com:443
    2021-08-21 19:04:03 I listen server at 0.0.0.0:9091 to raw.githubusercontent.com:443
    2021-08-21 19:04:03 I use socks5 proxy 172.25.32.1:1099 forward to github.com:443
    2021-08-21 19:04:03 I use socks5 proxy 172.25.32.1:1099 forward to raw.githubusercontent.com:443
    2021-08-21 19:04:38 I socks5 proxy connected 127.0.0.1:49944 -> 172.25.32.1:1099 -> github.com:443
    2021-08-21 19:04:39 I socks5 proxy closed 127.0.0.1:49944 -> 172.25.32.1:1099 -> github.com:443 864B 208.174K 835.56ms

    正常的日志应该是这样的,2021-08-21 19:04:38 I socks5 proxy connected 127.0.0.1:49944 -> 172.25.32.1:1099 -> github.com:443 表示脚本收到 iptables 重定向的请求并完成了 socks5 协议建立连接的过程
    xingheng
        7
    xingheng  
       2021-08-21 19:23:50 +08:00
    @sujin190 #6 最后面两行日志应该是 sevent 输出的,我这就是没有,1080 端口代理没有相关的日志,用浏览器下载 gist 文件也失败。
    我找找怎么调试 sevent
    sujin190
        8
    sujin190  
    OP
       2021-08-21 20:17:33 +08:00
    @xingheng #7 其实更简单的是,你把监听端口改到 443,然后 hosts 把域名直到 127.0.0.1 就行,这样就不用管 iptables 做流量重定向了,只不过很多时候 443 端口可能已经被占用了,而且只有一个端口,那么也转发一个域名了
    someonedeng
        9
    someonedeng  
       2021-08-23 23:49:22 +08:00
    大概类似 privoxy 一类的东西?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2683 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:51 · PVG 22:51 · LAX 06:51 · JFK 09:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.