1. 首页
  2. 代理•路由

路由器添加trojan支持

在lean的ssr-plus里添加trojan支持,可以实现局域网分流出国

    在我的上一篇文章新的代理方式trojan安装使用记录里写了在vps上安装trojan的过程,但直接用电脑客户端使用不是很方便,trojan官方出了在openwrt上运行trojan的程序,但只能全局翻墙,这样访问国内网站速度较慢,且浪费vps流量,不是很实用。目前大佬lean的ssr-plus还不支持trojan,让我苦恼了一阵。lean大佬迟迟没有加入,就萌生了自己修改ssrplus的想法,研究了下lean开源的ssr-puls代码,发现加入不是很困难。自己修改编译运行了一个月左右,还是比较稳定的,原有功能也都正常。
    lean大佬的github地址:https://github.com/coolsnowwolf/lede  ,ssr-plus在/package/lean/luci-app-ssr-plus里。trojan的openwrt程序官方github地址 https://github.com/trojan-gfw/openwrt-trojan ,把他们都下载下来
    修改完成后我们添加trojan服务器界面如下:

   把上述2地址的文件下载到本地,建议用notepad++、notepad2、ultraedit64等工具修改。由于lean大佬经常改代码,本次用的201911月份的代码修改,具体添加内容的位置可自行修改,写的行号是每次修改后的行号以作为参考。
1、首先我们进入  luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua,
在第10行后增加一行,写入

local http  = require "luci.http"

在130行后增加一行,并加入如下代码:

if nixio.fs.access("/usr/bin/trojan/trojan") then
o:value("trojan", translate("trojan"))
end
这句是判断有没有trojan可执行程序,没有就不显示可选trojan,trojan可执行程序位置在/usr/bin/trojan/trojan
找到o = s:option(Value, "password", translate("Password"))  和o = s:option(Flag, "fast_open", translate("TCP Fast Open")) 这两段后面各添加上
o:depends("type", "trojan")
这是给trojan设置界面增加密码输入框及tcp fastopen选择框
在156行后(o = s:option(Value, "password", translate("Password"))这一段后)再增加一行写入关于证书上传的代码,由于有些一键脚本是用的openssl做的自签证书,自签证书并不在openwrt内置的信任证书里面,所以要增加自签证书字段,并获取到证书的地址位置。我们用caddy申请letsencrypt是openwrt、windows内置信任的证书。
o = s:option(Flag, "certificate", translate("certificate"))
o.rmempty = true
o.default = "0"
o:depends("type", "trojan")
o.description = translate("If you have a self-signed certificate,please check the box")

o = s:option(DummyValue, "upload", translate("upload"))
o.template = "shadowsocksr/certupload"
o:depends("certificate", 1)

cert_dir = "/etc/ssl/private/"
local path

http.setfilehandler(
    function(meta, chunk, eof)
      if not fd then
        if (not meta) or (not meta.name) or (not meta.file) then return end
           fd = nixio.open(cert_dir .. meta.file, "w")
        if not fd then
           path = translate("Create upload file error.")
        return
        end
     end
     if chunk and fd then
     fd:write(chunk)
     end
     if eof and fd then
       fd:close()
       fd = nil
       path = '/etc/ssl/private/' .. meta.file .. ''
    end
    end
    )
if luci.http.formvalue("upload") then
   local f = luci.http.formvalue("ulfile")
    if #f <= 0 then
        path = translate("No specify upload file.")
   end   
end

o = s:option(Value, "certpath", translate("current certificate path"))
o:depends("certificate", 1)
o:value(path)
o.description = translate("Please confirm the current certificate path")
以上添加了自签证书选项和上传证书功能并自动获取到证书放置的路径,上传还要用上传模板certupload。
2、增加上传证书模板
在luci-app-ssr-plus/luasrc/view/shadowsocksr/ 里面增加一个文件certupload.htm
<%+cbi/valueheader%>
    <input class="cbi-input-file" style="width: 400px" type="file" id="ulfile" name="ulfile" />
    <input type="submit" class="cbi-button cbi-input-apply" name="upload" value="上传" />
<%+cbi/valuefooter%>
这样就可以在界面显示上传功能了,注意别用windows记事本创建,因有中文字符,易出错。建议用notepad++ unix utf-8格式创建,下同。
3、增加trojan配置模板
在luci-app-ssr-plus/root/usr/share/shadowsocksr里创建trojanconfig.lua 文件
local ucursor = require "luci.model.uci".cursor()
local json = require "luci.jsonc"
local server_section = arg[1]
local proto = arg[2] 
local local_port = arg[3]
local server = ucursor:get_all("shadowsocksr", server_section)

local trojan = {
    run_type = "nat",
    local_addr = "0.0.0.0",
    local_port = tonumber(local_port),
    remote_addr = server.server,
    remote_port = tonumber(server.server_port),
    password = {
       server.password
    },
    log_level =  1 ,
    ssl = {
        verify = true,
        verify_hostname = true,
        cert = (server.certificate == "1") and server.certpath or "",
        cipher = "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256",
        sni = "",
        alpn = {
            "h2",
            "http/1.1"
        },
        reuse_session = true,
        session_ticket =  false,
        curves = ""
    },
    tcp = {
        no_delay = true,
        keep_alive = true,
        fast_open = (server.fast_open == "1") and true or false,
        fast_open_qlen = 20
    }
}

print(json.stringify(trojan, 1))
此次加解密选择只用了tls1.3协议,翻墙更加快速。模式选用的是nat模式,大雕lean里面的ssr-plus已经写好了iptable防火墙规则,我们可以直接使用。
4、修改ssr-plus 执行脚本文件
找到luci-app-ssr-plus/root/etc/init.d/shadowsocksr 进行修改增加
在127行后增加一行(sed -i 's///g' /var/etc/v2-ssr-retcp.json行后)
      elif [ "$stype" == "trojan" ] ;then
        lua /usr/share/shadowsocksr/trojanconfig.lua $GLOBAL_SERVER tcp $(uci_get_by_name $1 local_port) > /var/etc/trojan-ssr-retcp.json
        sed -i 's///g' /var/etc/trojan-ssr-retcp.json
此处是用lua生成json格式的trojan配置文件
在306行( sscmd="/usr/bin/v2ray/v2ray"行)后增加一行写入
elif [ "$stype" == "trojan" ] ;then
sscmd="/usr/bin/trojan/trojan"
创建按tcp方式trojan可执行文件路径
在317行(ucmd="/usr/bin/v2ray/v2ray")后增加一行写入
elif [ "$stype" == "trojan" ] ;then
 ucmd="/usr/bin/trojan/trojan"
创建udp方式的Trojan可执行文件路径,注意目前trojan nat模式下还不支持udp,因此这行可不加入。写在这里是方便以后支持的时候修改。

在340行(echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) Started!" >> /tmp/ssrplus.log)行后增加
  elif [ "$stype" == "trojan" ] ;then
    $sscmd -c /var/etc/trojan-ssr-retcp.json >/dev/null 2>&1 &
    echo "$(date "+%Y-%m-%d %H:%M:%S") Trojan Started!" >> /tmp/ssrplus.log
执行tcp协议的trojan翻墙
在358行($ucmd -config /var/etc/v2-ssr-reudp.json >/dev/null 2>&1 & )行后增加

 elif [ "$utype" == "trojan" ] ; then
        lua /usr/share/shadowsocksr/trojanconfig.lua $UDP_RELAY_SERVER udp $(uci_get_by_name $UDP_RELAY_SERVER local_port) > /var/etc/trojan-ssr-reudp.json
        sed -i 's///g' /var/etc/trojan-ssr-reudp.json
        $ucmd -c /var/etc/trojan-ssr-reudp.json >/dev/null 2>&1 & 
执行udp协议的trojan翻墙,注意目前trojan nat模式下还不支持udp,因此这行可不加入。写在这里是方便以后支持的时候修改。
在555行(killall -q -9 v2ray)行后增加一行
   killall -q -9 trojan
关闭ssr-plus或切换其他方式翻墙时杀死trojan进程。

5、修改翻译文件
打开luci-app-ssr-plus/po/zh-cn/ssr-plus.po文件,我们进行汉化
381行修改为
msgstr "ShadowSocksR Plus+ 设置(支持SS/SSR/V2RAY/TROJAN)"
在文件末增加
msgid "certificate"
msgstr "自签证书"

msgid "If you have a self-signed certificate,please check the box"
msgstr "如果你使用自签证书,请选择"

msgid "upload"
msgstr "上传证书"

msgid "No specify upload file."
msgstr "没有上传证书"

msgid "current certificate path"
msgstr "当前证书路径"

msgid "Please confirm the current certificate path"
msgstr "请选择确认所传证书,证书不正确将无法运行"
6、修改编译make文件,增加编译时可选项
我们编译时可在目标openwrt固件的/target/linux/x86/makefile里面增加一个trojan即可,如何须在在ssr-plus编译界面下选择可以这么修改
在第11行(CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Socks 行后)后面增加一行
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan
在24行(空行)后增加一行写入
config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan
     bool "Include Trojan"
     default y if x86_64
在50行(+PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray )后面增加一行写入
    +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan 
这样编译时候就可以选择trojan了

7、修改openwrt里trojan可执行文件的位置
打开trojan/trojan/Makefile文件
修改第69行(DEPENDS:=+libpthread +libstdcpp )
把这一行改为
DEPENDS:=+libpthread +libstdcpp +ca-certificates 
增加一个证书依赖,这样除自签证书之外的证书openwrt都能自动支持.
在第75行(define Package/trojan/install)后把下面原有的这些删除
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/trojan $(1)/usr/sbin/trojan
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/trojan.config $(1)/etc/config/trojan
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/trojan.init $(1)/etc/init.d/trojan
$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/trojan/config.json $(1)/etc/trojan.json
删除后换上
            $(INSTALL_DIR) $(1)/usr/bin/trojan
            $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/trojan $(1)/usr/bin/trojan/trojan
为和ssr-plus配合删除原有的安装位置,此处把可执行文件的位置放到了/usr/bin/trojan/下面
lean目前的openwrt使用的时openssl1.0.2版本,Trojan因支持tls1.3需要openssl1.1.1,因此在trojan文件夹里有openssl 1.1.1的补丁,不要改位置,和lean的openssl1.0.2能共存。官方openwrt已经支持openssl1.1.1,如果不用trojan文件夹里的openssl补丁,需要再修改trojan文件夹里的makefile文件,就暂时不提供了。

    以上就完成了ssr-plus增加trojan的翻墙支持,经测试下来,自动切换、分流、守护程序都比较正常。x86、ipq4019都能正常编译使用,其他类型的路由器未测试。目前发现对不在GFW列表里的域名,dns解析还存在问题,如访问https://trojan-gfw.github.io/trojan/时,域名被污染解析到facebook了,trojan也把流量转发至facebook,浏览器会提示证书不符合。域名在【GFW列表】数据里面的则不受影响,可以正常解析。技术有限,尚未找到解决办法。对于这类被污染的域名我们可以把域名放入域名黑名单(强制走代理的域名)即可正常访问。
    编译时把修改好的luci-app-ssr-puls和trojan文件夹放入/package/lean 里面覆盖原有文件夹,即可正常编译。
最后提供我修改好后的源码下载:
ssr-plus-trojan.rar

本站文章,欢迎转发。转载请注明出处:https://www.bandwh.com/net/51.html

发表评论

用户名: 验证码:点击我更换图片

最新评论