实现 v2rayN 的节点可以设置出口为Socks 方便使用落地节点 套别的隧道 实现链式代理

需求

上一篇讲了怎么手动修改配置文件, 实现出口为Socks, 这样可以套别的隧道, 实现链式代理.

为了方便使用, 我们修改v2rayN, 实现这个功能.

比如, 一个 vless + websocket + tls 节点, 设置出口为Socks, 而不是自由的出去.


方案

在 outbounds出站列表 里面 增加一个 Socks 的 outbound出站, tag 设置为 tunnel

在原本的 outbound出站 的 streamSettings 里面 增加一个 sockopt, 里面设置一个属性 dialerProxy, 值为 tunnel (和上面那个outbound出站的tag一致)

界面设计

参数设置 窗口 增加一页 "出口设置"

解决方案资源管理器里面找到 参数设置 窗口.

选择中间这个面积最大的 TabControl 控件.

在空白处右键菜单, 添加TabItem.

点击这个新增的 TabItem, 设置 宽 高 属性为 Auto, 设置 Header 属性为 "Core出口设置"

拖动控件, 添加 2个 Label, 2个 TextBox


设置 Label 的 Content 属性, 设置为 "Socks5出口的接收方IP", "Socks5出口的接收方端口"

设置 TextBox 的 名称 为: txtSocksOutboundIPtxtSocksOutboundPort

编译, 运行一下, 看看界面显示效果是否正常.


绑写数据

给窗口 OptionSettingWindow 添加两个数据属性. socksOutboundIPsocksOutboundPort.


把新增的这两个文本框与窗口的数据属性绑定.

按窗口的 确认 按钮之后, 调用的函数是 OptionSettingViewModel.SaveSetting 

进里面打个断点. 运行起来, 点击 确认 按钮, 监视 面板里面检查一下数据绑定没问题, 获取到了文本框的内容.

参数的保存和读取

参考一下现有代码写法, 要修改一些数据结构, 添加相关的属性.

添加一个数据结构 class SocksOutbound

class Config 添加数据成员

OptionSettingViewModel.SaveSetting 函数里面 把参数保存.

检查 保存界面参数的 json 文件, 没问题.

在 OptionSettingViewModel 参数设置 窗口的构造函数中, 添加加载数据的语句

编译, 运行, 检查各种操作下, 这两个参数的设置和加载没有问题.


生成config.json配置文件

阅读代码, 找到生成配置文件的逻辑.

找到 CoreConfigV2ray.outbound 函数. 根据代码的逻辑, 本来要在这个函数里新增一个Socks 的 outbound, 调试的时候发现, 这时候 v2rayConfig.outbounds 数组里面已经有好几个outbound了, 除了要设置参数的, 还有1条 direct 的 freedom 和1条 block 的 blackhole.


那我要看看是哪里构造的. 

经过调试发现, 原来在这一步已经读入了一个默认配置文件, 里面就已经有了 direct 和 black的 outbound. 那我们不是在这里把 tunnel 加进去就行了?


找了一找, 发现默认配置文件放在这里

修改这个默认配置文件, 增加一个 outbound, 如下

outbound 中新增的 Socks5 tunnel 已经添加好了. 


接下来是 streamSettings 里面 增加一个 sockopt, 里面设置一个属性 dialerProxy, 值为 tunnel

还是修改默认配置文件, 在现有的 outbound里面, streamSettings 结构里面增加一个 sockopt

为了支持这个新增的部分, class StreamSettings4Ray 的数据结构也需要相应的同步修改

相应地, 也要新增一个 class SockoptObject 的数据结构, 包含一个 dialerProxy 属性

到目前为止, 可以编译运行一下, 调试确认把我们新设置的默认配置文件都加载到内存的数据结构中去了.




有了这些以后, 我们不能老是跑写死的  127.0.0.1 : 10086 是吧?  所以还差一步, 把界面上输入的Socks的IP和端口赋值给当前配置.

在函数 CoreConfigV2ray.GenerateClientConfigContent 中, 增加一步处理 socksOut


然后再简单的实现具体步骤.

把程序的总配置参数中的 socksOut的 IP 和 端口 设置到准备生成配置文件的数据结构中.


好了, 编译运行, 测试一下功能.


========

Github源码 https://github.com/crazypeace/v2rayN/tree/outboundSocks


如果你觉得这个功能有用, 就来官方 PR 涨人气! 目前官方还没有合入主线, 作者还在考虑.

评论

The Hot3 in Last 30 Days