搞了个整合 Aria2 和 AriaNg 的 Docker 镜像,确保了 Aria2 RPC 的安全性。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
sanjusss

搞了个整合 Aria2 和 AriaNg 的 Docker 镜像,确保了 Aria2 RPC 的安全性。

  •  1
     
  •   sanjusss
    sanjusss 2019 年 12 月 26 日 8734 次点击
    这是一个创建于 2313 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    前几天想整个 Aria2,发现大部分镜像是需要暴漏 Aria2 RPC,或者是包含额外的文件浏览功能,又或者自带的 AriaNg 不能自动连接 Aria2 的。于是就研究了一下,自己整了一个。欢迎大家提出意见。
    这个镜像有以下特点:

    • 对 AriaNg 进行密码验证。
    • Aria2 RPC 不能被外部调用,和 AriaNg 使用一个端口。(除非主动暴露)
    • 自动更新 BT Tracker,可关闭。
    • 提供 linux/amd64、linux/arm/v6、linux/arm/v7、linux/arm64、linux/386、linux/ppc64le、linux/s390x 等平台 /CPU 下的 Docker 镜像。
    • 支持 AriaNg 自动连接容器内的 Aria2,根据实际场景可能需要指定EXTERNAL_PORT

    仓库地址

    Docker Hub https://hub.docker.com/r/sanjusss/aria2-ariang-docker
    Github https://github.com/sanjusss/aria2-ariang-docker

    使用方法

    快速启动

    docker run -d --name aria2 -p 80:80 -v ./data:/data sanjusss/aria2-ariang-docker 

    访问服务器 IP 即可进入 AriaNg 界面,默认用户密码均为 admin。

    假设我需要在 5003 端口开启服务,下载路径为 /home/data,aria2 设置保存到 /home/aria2,登录用户为 user,密码为 123456,UID/GID 为 1000

    命令行启动

    docker run -d --name aria2 \ -p 5003:80 \ -v /home/data:/data \ -v /home/aria2:/conf \ -e PUID=1000 \ -e PGID=1000 \ -e EXTERNAL_PORT=5003 \ -e USER_NAME=user \ -e PASSWORD=123456 \ sanjusss/aria2-ariang-docker 

    Docker-Compose 示例

    docker-compose.yml 文件

    version: '3' services: aria2: image: sanjusss/aria2-ariang-docker container_name: aria2 environment: PUID: 1000 PGID: 1000 EXTERNAL_PORT: 5003 USER_NAME: user PASSWORD: 123456 volumes: - /home/aria2:/conf - /home/data:/data ports: - 5003:80 

    参数

    可以直接参考 Github 上,这边表格发出来就乱了。

    第 1 条附言    2019 年 12 月 26 日
    增加了:每次启动 /重启容器时都会随机化 rpc 的路径和密钥。
    32 条回复    2020-01-02 12:06:52 +08:00
    pljhonglu
        1
    pljhonglu  
       2019 年 12 月 26 日 nbsp; 1
    关注一下。Aria2 RPC 协议改成 ws 照样可以被外部访问,而且还是无密码的
    sanjusss
        2
    sanjusss  
    OP
       2019 年 12 月 26 日
    @pljhonglu #1 我看看啊,确实没调试过 ws
    Buges
        3
    Buges  
       2019 年 12 月 26 日 via Android   2
    为啥非要整到一个镜像里,按照 docker 最佳实践,一个镜像跑 aria2 一个跑 web 双方在一个网络里通信不好吗?
    可以按需配置,暴露端口,远程调用等等。
    sanjusss
        4
    sanjusss  
    OP
       2019 年 12 月 26 日
    @Buges #3 你说的已经有人做过了。我搞的这个镜像是为了方便有同样需求的人。
    zyxfsky
        5
    zyxfsky  
       2019 年 12 月 26 日
    我也觉得应该分两个容器,compose 整合到一起就行,一个容器里起了 aria2 和 nginx 进程,然后又自己搞个健康检查,为啥不分开呢
    binux
        6
    binux  
       2019 年 12 月 26 日
    Aria2 RPC 不是还是被 nginx 暴露了,你这是掩耳盗铃?
    sanjusss
        7
    sanjusss  
    OP
       2019 年 12 月 26 日
    @binux #6 你试试除了容器里的 ariang,别的工具是不可以调用。
    Buges
        8
    Buges  
       2019 年 12 月 26 日
    @sanjusss #4 你说的这个需求不应该打包一个镜像,只需要用独立的镜像配置好一个 docker-compose.yaml 文件就能满足并方便同样需求的人。
    binux
        9
    binux  
       2019 年 12 月 26 日
    @sanjusss #7 https://binux.github.io/yaaw/demo/#path=ws://admin:admin@localhost/jsonrpc

    curl -d '{"jsonrpc":"2.0","method":"aria2.getGlobalOption","id":1,"params":[]}' http://admin:admin@localhost/jsonrpc

    你压根就不懂 HTTP 协议。
    julyclyde
        10
    julyclyde  
       2019 年 12 月 26 日
    @binux 现在不都这样么,做什么东西不看技术,完全看兴趣
    看到什么东西感兴趣,就拿过来用 docker 包一下
    sanjusss
        11
    sanjusss  
    OP
       2019 年 12 月 26 日
    @binux #9
    我在 2 楼已经回复了,我之前没用过 websocket 的方式调用。
    现在的更新的镜像里我直接干掉了 websocket 的转发。
    关于 websocket 的认证,我需要研究一下。

    我设想的是一个不需要更改 AriaNg 默认设置的场景,默认为 POST,对其他方式确实没有测试。
    至于手动指定用户名密码后可以远程调用,这个是 AriaNg 的限制,确实和使用密钥连接没啥区别。后面的修改中,我或许可以通过一些方法限制远程调用。

    @julyclyde #10
    做东西,兴趣更重要。
    binux
        12
    binux  
       2019 年 12 月 26 日
    @sanjusss #11 我都写了 curl 命令你都看不懂?
    这根本不是用不用 websocket 的问题,HTTP 在这里不行是因为你错误给 OPTIONS 请求配置了 basic authentication,导致“纯前端” 用 HTTP POST 访问受限。
    如果不是 “纯前端”,直接请求 RPC 接口,一点问题都没有。这不就是掩耳盗铃吗?

    另外一种 “纯前端” 能访问的方法是 HTTP GET (JSONP),但是现在没有人写 aria2 纯前端客户端的时候用 Aria2 RPC 的 GET 方法了(存在安全性问题),所以没办法展示给你看。
    binux
        13
    binux  
       2019 年 12 月 26 日
    @sanjusss #11 来来来,为了让你死得更难看一点,我给你找了一个用 HTTP GET 方式的客户端
    https://rawcdn.githack.com/ziahamza/webui-aria2/c11c931f47c98daa97531712ba0064ef100565c6/index.html
    设置地址 http://localhost/json 用户名 admin 密码 admin 就可以访问了。
    sanjusss
        14
    sanjusss  
    OP
       2019 年 12 月 26 日
    @binux #12
    我使用 get 方法调用 rpc,
    curl http://192.168.1.3/jsonrpc?jsOnrpc=2.0&method=aria2.getGlobalStat&id=QXJpYU5nXzE1NzczMzY3NjFfMC4wNDIyMzI4NzU3MTk3NzExOQ==

    <html>
    <head><title>401 Authorization Required</title></head>
    <body>
    <center><h1>401 Authorization Required</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>

    请指教在不使用用户名密码情况下调用方法。
    sanjusss
        15
    sanjusss  
    OP
       2019 年 12 月 26 日
    @binux #13
    呃,你的意思是说,我在有钥匙的情况下偷了我自己的东西,所以我的大门有问题?
    binux
        16
    binux  
       2019 年 12 月 26 日
    @sanjusss #15
    「大部分镜像是需要暴漏 Aria2 RPC 」?
    你也要暴露。
    「 Aria2 RPC 不能被外部调用」?
    我已经给你证实可以被外部访问了。
    「确保了 Aria2 RPC 的安全性」?
    你这和 aria2 自带的 --rpc-user 有什么区别,而且 rpc-user 已经是不推荐的认证方式了。
    7654
        17
    7654  
       2019 年 12 月 26 日
    {
    "language": "zh_Hans",
    "title": "${downspeed}, ${upspeed} - ${title}",
    "titleRefreshInterval": 5000,
    "browserNotification": true,
    "rpcAlias": "",
    "rpcHost": "xxxxx.com",
    "rpcPort": 8080,
    "rpcInterface": "jsonrpc",
    "protocol": "wss",
    "httpMethod": "POST",
    "secret": "XXXXXXXXXXXX=="
    }
    这是我自己的 AriaNG aria2 使用 LE 证书,wss+secret
    sanjusss
        18
    sanjusss  
    OP
       2019 年 12 月 26 日
    @binux #16
    现在你再用最新的镜像试试吧。
    我加了个最简单的认证,直接阻止了未过访问首页的调用。当然这个基于 cookie 的验证太简单了,后面我再改就行了。

    https://i.loli.net/2019/12/26/2fCAcJzEXLP1yN8.jpg
    binux
        19
    binux  
       2019 年 12 月 26 日
    @sanjusss #18 然而 cookie 并不能 CSRF,你作为用户访问过一次主页后,cookie 和 basic auth 已经存在浏览器中了,我用恶意脚本向你 aria2 RPC GET 请求是畅通无阻的。
    我建议你别继续下去了,缺少知识情况下,你包括这条路就是错。“对 AriaNg 进行密码验证” 压根就没有意义。
    sanjusss
        20
    sanjusss  
    OP
       2019 年 12 月 26 日
    @binux #19
    搞了半天,原来你是“对 AriaNg 进行密码验证”有意见啊!我的重点又不是加密,而是访问 AriaNg 时无需手动更改设置。
    登录即可用,这才是我要搞的。
    对于你的其他观点,不能苟同。
    binux
        21
    binux  
       2019 年 12 月 26 日 via Android
    @sanjusss #20 问题是你是在以降低 aria2 安全性的方式做的。
    保存一个带 RPC 地址的书签就这么难吗?实在不行你把默认地址硬编码到 AriaNg 也比你画蛇添足反代 aria2 好啊。
    pljhonglu
        22
    pljhonglu  
       2019 年 12 月 26 日
    @sanjusss #20 @binux 说的有道理,这么反代 aria2 没有任何密码保护确实是降低了 aria2 的安全性,感觉 aria2 打开 token 功能,把 token 硬编码到 ariang 里面比较好
    sanjusss
        23
    sanjusss  
    OP
       2019 年 12 月 26 日
    @pljhonglu 嗯,我现在在这么搞的。还没推送。
    pljhonglu
        24
    pljhonglu  
       2019 年 12 月 26 日
    @sanjusss #23 坐等推送~
    sanjusss
        25
    sanjusss  
    OP
       2019 年 12 月 26 日
    @pljhonglu #24 已经推送,每次启动 /重启容器时,都会随机化 rpc 的路径和密钥,可能需要清空浏览器缓存才能正常显示。
    Maskeney
        26
    Maskeney  
       2019 年 12 月 26 日
    恭喜你重复造了一个没什么卵用的轮子
    deorth
        27
    deorth  
       2019 年 12 月 26 日
    好奇你怎么实现自动填写 rpc-sercet 的。
    justin2018
        28
    justin2018  
       2019 年 12 月 27 日
    可以完美配合 115 下载助手么
    Lazaru5
        29
    Lazaru5  
       2020 年 1 月 1 日
    issue:内网穿透后 RPC 连不上
    Lazaru5
        30
    Lazaru5  
       2020 年 1 月 1 日
    需求:aria-ng rpc 端口可自定义
    sanjusss
        31
    sanjusss  
    OP
       2020 年 1 月 1 日 via iPhone
    @emtry 设置 EXTERNAL_PORT 为你外网访问最终网页的端口。这样设置后会导致内网访问时只能用外网访问的方法(除非你内外网用同样的 http 端口)
    Lazaru5
        32
    Lazaru5  
       2020 年 1 月 2 日
    @sanjusss 重启容器 seesion 没了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2863 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 133ms UTC 03:29 PVG 11:29 LAX 20:29 JFK 23:29
    Do have faith in what you're doing.
    ubao msn 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