Linux折腾科学上网过程

文档地址: https://v2raya.org/docs/prologue/introduction/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker run -d \
--restart=always \
--privileged \
--network=host \
--name v2raya \
-e V2RAYA_LOG_FILE=/tmp/v2raya.log \
-e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
-e V2RAYA_NFTABLES_SUPPORT=off \
-e IPTABLES_MODE=legacy \
-v /lib/modules:/lib/modules:ro \
-v /etc/resolv.conf:/etc/resolv.conf \
-v /etc/v2raya:/etc/v2raya \
mzz2017/v2raya
  • 配置文件会被写入到系统的/etc/v2raya,
  • 由于是host模式,无需手动分配端口,启动成功后,直接打开浏览器访问 你的IP:2017
  • 首次进入后台管理需要创建管理密码。
  • 进入管理界面后导入订阅地址即可,订阅地址一定要国内可访问,否则会出现connection reset by peer的问题。

明明文档说Docker已经包含v2ray-core,但是为何仍然提示没找到呢?我们进容器查看一下bin目录

1
2
root@tignioj:/home/tignioj# docker exec -it v2raya sh
~ # ls /usr/local/bin

果然是空白,猜测可能是docker镜像没有下载最新版v2raya,检查一下镜像

1
2
3
REPOSITORY       TAG      IMAGE ID       CREATED         SIZE

mzz2017/v2raya   latest   998cc326cf58   2 years ago     84.9MB

查看镜像详细信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
root@tignioj:/home/tignioj# docker inspect mzz2017/v2raya
[
    {
        "Id": "sha256:998cc326cf586d37ce2cf24d055dbb79b799a98faa1b590123e0e7d0669ac471",
        "RepoTags": [
            "mzz2017/v2raya:latest"
        ],
        "RepoDigests": [
            "mzz2017/v2raya@sha256:890443d0b1c41b72ea69ac6fa604981fdff5c07a7c27da0a2d2b6c07bde1c3ed"
        ],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2021-12-09T05:28:12.051263892Z",

竟然是2年前的镜像,果然不是最新版。我们手动下载最新版。

1
docker pull mzz2017/v2raya:v2.2.4.6

删掉正在运行的容器

1
docker rm -f v2raya

指定最新版本启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker run -d \
--restart=always \
--privileged \
--network=host \
--name v2raya \
-e V2RAYA_LOG_FILE=/tmp/v2raya.log \
-e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
-e V2RAYA_NFTABLES_SUPPORT=off \
-e IPTABLES_MODE=legacy \
-v /lib/modules:/lib/modules:ro \
-v /etc/resolv.conf:/etc/resolv.conf \
-v /etc/v2raya:/etc/v2raya \
mzz2017/v2raya:v2.2.4.6

再次进入容器查看bin目录,找到v2ray和xray了

1
2
3
4
root@tignioj:/home/tignioj# docker exec -it v2raya sh
/ # ls /usr/local/bin/
ip6tables         ip6tables-nft     iptables-legacy   v2ray
ip6tables-legacy  iptables          iptables-nft      xray

尽管clash已经删库跑路了,但是还留了个docker镜像,可惜没有文档只能盲目摸索。

  1. 准备好你的config.yaml文件
  2. 创建docker-compose.yml文件,并添加如下内容:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
version: '3.8'
services:
  clash:
    image: dreamacro/clash
    volumes:
      - ./config.yaml:/root/.config/clash/config.yaml
    ports:
      - "7890:7890"
      - "9090:9090"
    restart: always

  clash-dashboard:
    image: centralx/clash-dashboard
    container_name: clash-dashboard
    ports:
      - "9999:80"
    restart: always
  1. 执行docker compose -d 后台启动该项目
  • 9090是docker的后端调用地址,公网IP必须开启9090端口,因为dashboard要访问这个服务
  • 7890是代理地址

clash-dashboard只是查看clash配置的,所以要让dashboard连接上clash,而clash开启的9090端口提供了接口。

  1. 第一步准备的config.yaml中可以修改clash的监听地址和端口
1
2
3
4
5
6
mixed-port: 7890
allow-lan: true
mode: Rule
log-level: info
secret: '访问密码'
external-controller: 0.0.0.0:9090 # clash监听地址和端口
  1. 输入你的ip:9999,进入clash-dashboard的网页,会提示配置clash地址和端口,密码等信息。clash地址请输入公网IP!

令人感到困扰的是,在clash-dasboard容器内部执行curl clash:9090时,clash有响应,但是在web界面却无法设置host为clash (密码肯定是正确的)

1
2
3
4
root@iZwz9f6aasa5nbfbk126doZ:~/clash# docker compose exec clash-dashboard bash
root@10461afe8fa5:/# curl clash:9090
{"message":"Unauthorized"}
root@10461afe8fa5:/# 

设置失败!

/linux%E6%8A%98%E8%85%BE%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E8%BF%87%E7%A8%8B/Pasted%20image%2020231231185740.png

于是尝试了下其他形式的IP,通过docker inspect 项目的网络,可以看到他们都在 192.168.48.x 同一网段下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
"Containers": {
	"10461afe8fa569cb8ddbf53ffcb36b6789155d3cbdf8356596063ed5127fd8d3": {
		"Name": "clash-dashboard",
		"EndpointID": "09da4c8acdc52f672d82362a35d05f79f11047b2a3edb591cf92faa46f39d025",
		"MacAddress": "02:42:c0:a8:30:03",
		"IPv4Address": "192.168.48.3/20",
		"IPv6Address": ""
	},
	"d647ce609be8a47fe7670d82bd3b7d45895bb39ea1a38975d34e8f3f5d1184e3": {
		"Name": "clash-clash-1",
		"EndpointID": "a4975a9dfd13dfa7132fe84d08c5e421b48b5b8f7316f755c55612bb93bc3bfc",
		"MacAddress": "02:42:c0:a8:30:02",
		"IPv4Address": "192.168.48.2/20",
		"IPv6Address": ""
	}
},

通过 ip a查看docker网关地址,可以看到是172.17.0.1

1
2
3
4
5
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:24:44:77:ef brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:24ff:fe44:77ef/64 scope link 

在容器内通过局域网IP和docker0网关访问都没问题

1
2
3
4
root@iZwz9f6aasa5nbfbk126doZ:~/clash# curl 192.168.48.2:9090
{"message":"Unauthorized"}
root@iZwz9f6aasa5nbfbk126doZ:~/clash# curl 172.17.0.1:9090
{"message":"Unauthorized"}

但是在网页端仍然无法设置成功,最后发现只能设置成公网IP(需要在安全组开启端口)

  1. 使用docker compose up -d启动docker和面板
  2. 复制你的配置文件到config.yml
  3. 在config.yml中配置以下两项
    • secret: '后端控制密码'
    • external-controller: 0.0.0.0:9090 # 后端监听地址
  4. 进入dashboard界面,连接clash的公网IP地址。
  1. 命令行设置快捷代理,请查看-> index.zh-cn
  2. 验证代理是否开启成功 curl -I https://www.google.com

参考:

相关内容

Linux磁盘管理-LVM
openwrt编译v2raya并设置负载均衡
openwrt编译passwall到固件里面
docker中运行自己编译的openwrt镜像
docker编译openwrt