起因
ZJU 的校园网出口存在限速,而物理上的网线接口却可以跑到千兆,在校内传输时就可以跑满。在很久以前,只要插上网线就能获取到ip地址,同时还可以直接用ipv6跑满带宽。但是在某个暑假的某天,技术中心突然给有线网加了一个网页认证,并且给ipv6也加上了限速。不过虽然存在限速,但ipv6 的速度任可以达到 500Mbps。那么很显然,如果我们能将出口流量全部用ipv6进行转发,那么就可以体验到大带宽。
至于如何建立一个代理,我想这对看这篇文章的诸位不是一个太大的问题。本文在很大程度上是作为我的一个备忘录,之后每次入手新小鸡都可以马上配置,同时记录一些 v6 特有的机制。这里我选用了 Hysteria2 和 Vmess+ws+tls 的组合。
Tabby远程目录
很显然我们需要一个 ssh 客户端,我使用的是 Tabby,但是说实话目前的 Tabby 并不是很好用。
这段命令可以在 Tabby 中的 sftp 显示在当前目录
~/.bash_profile:
1export PS1="$PS1\[\e]1337;CurrentDir="'$(pwd)\a\]'
配置方法
下面进入正式的配置教程
拿到一个带有公网的VPS首先要考虑的肯定是安全性。开启防火墙是第一步,之后为了防止爆破还是建议改为使用密钥登录。
使用密钥登录
生成密钥
1ssh-keygen -t rsa -b 4096
得到结果
1root@local:~# ssh-keygen -t rsa -b 4096
2Generating public/private rsa key pair.
3Enter file in which to save the key (/root/.ssh/id_rsa):
4Enter passphrase (empty for no passphrase):
5Enter same passphrase again:
6Your identification has been saved in /root/.ssh/id_rsa
7Your public key has been saved in /root/.ssh/id_rsa.pub
8The key fingerprint is:
9aa:8b:61:13:38:ad:b5:49:ca:51:45:b9:77:e1:97:e1 root@local
10The key's randomart image is:
11+--[ RSA 2048]----+
12| .o. |
13| .. . . |
14| . . . o o |
15| o. . . o E |
16|o.= . S . |
17|.*.+ . |
18|o.* . |
19| . + . |
20| . o. |
21+-----------------+
公钥会保存在服务端,私钥 ~/.ssh/id_rsa 需要保存在我们自己这作为登录凭证
之后我们将公钥复制到 ~/.ssh/authorized_keys 中
1cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
将 ~/.ssh/authorized_keys 的权限设置为 600
1chmod 600 ~/.ssh/authorized_keys
将私钥 ~/.ssh/id_rsa 下载到本地
编辑 sshd 文件
1vim /etc/ssh/sshd_config
修改下面几项
1#禁用密码验证
2PasswordAuthentication no
3#启用密钥验证
4PubkeyAuthentication yes
5#指定公钥
6AuthorsizedKeysFile .ssh/authorized_keys
重启 sshd 服务
1systemctl restart sshd
并查看状态
1systemctl status sshd
安装 Hysteria2 和 V2ray
下面就是安装代理环节,如今的安装说实话已经很方便了,唯一值得注意的是有没有遗漏哪个环节
1bash <(curl -fsSL https://get.hy2.sh/) #Hysteria2
2bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh) #V2ray
创建SSL证书
SSL 证书在 Hysteria2 和 V2ray 中都需要使用到,下面我们用 acme.sh 来申请证书
1
2#安装acme:
3curl https://get.acme.sh | sh
4#安装socat:
5apt install socat
6#添加软链接:
7ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
8#注册账号:
9acme.sh --register-account -m my@example.com
10#开放80端口:
11ufw allow 80
12#申请证书:
13acme.sh --issue -d yourdomain.com --standalone -k ec-256
14#安装证书:
15acme.sh --installcert -d yourdomain.com --ecc --key-file /etc/hysteria/server.key --fullchain-file /etc/hysteria/server.crt
16#添加权限
17chmod +r /etc/hysteria/server.key
18chmod +r /etc/hysteria/server.crt
19
20#切换 Let’s Encrypt:
21acme.sh --set-default-ca --server letsencrypt
22#切换 Buypass:
23acme.sh --set-default-ca --server buypass
24#切换 ZeroSSL:
25acme.sh --set-default-ca --server zerossl
这里需要注意的是,如果你的的域名解析同时有 A 和 AAAA 解析,证书签发机构访问哪个解析是不知道的,最好保证两个解析都指向你的服务器,如果你的某个ip是仅出站的,建议将其删除。
证书所申请域名是否包含该服务器的所有ip并不重要,如果你只使用代理的话,只要能申请下来证书就可以。如果实在不行也可以使用自签名证书。
Hysteria2
目录默认为 /etc/hysteria,修改下面的 config.yaml 文件
1listen: :7800 #记得放行该端口
2
3#使用CA证书
4tls:
5 cert: /etc/hysteria/server.crt
6 key: /etc/hysteria/server.key
7
8
9auth:
10 type: password
11 password: yourpassword
12
13# 服务端带宽限制
14bandwidth:
15 up: 500 mbps
16 down: 500 mbps
17
18masquerade:
19 type: proxy
20 proxy:
21 url: https://yourdomain.com/
22 rewriteHost: true
随后启动服务
1systemctl start hysteria-server
2systemctl status hysteria-server
3systemctl enable hysteria-server #开机自启
之后在客户端我们就可以进行相应配置
1- name: 'lite'
2 type: hysteria2
3 server: v6.yourdomain.com # 需要指向服务器,不需要证书
4 port: 7800
5 up: ""
6 down: ""
7 password: !977F45&S9v4
8 sni: yourdomain.com # 需要和服务器上的证书相匹配
9 skip-cert-verify: false
这里的 v6.yourdomain.com 专门解析到ipv6的地址上,因为我没明白 mihomo 核心在连接时是如何选择 ipv4 和 ipv6的,不如直接指定到ipv6上。在测试的时候,有时候有ipv6地址但却依然使用ipv4连接,有时候没有ipv6地址却仍使用了ipv6连接导致timeout。
具体 ipversion 配置可以看 mihomo 中的 ip-version 部分,默认使用 dual。
不同软件逻辑也确实会不一样。举个例子,Windows会优先使用ipv6连接,而 Chrome 会选择两种中更快的那个(v4会延迟发送)。至于 mihomo 是怎么做的,我就不清楚了,反正也不重要。
上面的配置也可以变为一行
1- { name: 'lite',type: hysteria2,server: v6.yourdomain.com,port: 7800,up: "" ,down: "" ,password: !977F45&S9v4,sni: yourdomain.com,skip-cert-verify: false}
V2ray
目录默认为 /usr/local/etc/v2ray,修改下面的 config.json 文件
1{
2 "inbounds": [
3 {
4 "port": 8388,//记得放行该端口
5 "listen":"127.0.0.1",
6 "protocol": "vmess",
7 "settings": {
8 "clients": [
9 {
10 "id": "4b6b9d51-c9aa-4ac8-9811-8726a23e480a", //替换4UUID
11 "alterId": 0
12 }
13 ]
14 },
15 "streamSettings": {
16 "network": "ws",
17 "wsSettings": {
18 "path": "/4b6b9d51-c9aa-4ac8-9811-8726a23e480a"
19 }
20 }
21 }
22 ],
23 "outbounds": [
24 {
25 "protocol": "freedom",
26 "settings": {}
27 }
28 ]
29 }
1systemctl start v2ray
2systemctl status v2ray
3systemctl enable v2ray #开机自启
这样在客户端做如下配置
1- { name: 'lite-vmess', type: vmess, server: v6.yourdomain.com, port: 443, uuid: 4b6b9d51-c9aa-4ac8-9811-8726a23e480a,alterId: 0, udp: true,tls: true,cipher: zero ,skip-cert-verify: false,network: ws, ws-opts: { path: /4b6b9d51-c9aa-4ac8-9811-8726a23e480a, headers: { Host: yourdomain.com } } }
这里大部分配置都很清晰,需要说明的是证书需要和 Host 一致
Nginx
最后我们来配置nginx ,配置在 /etc/nginx/nginx.conf 中,修改 http 部分
1http {
2 server {
3 listen 443 ssl;
4 listen [::]:443 ssl;
5
6 server_name yourdomain.com;
7 ssl_certificate /etc/hysteria/server.crt;
8 ssl_certificate_key /etc/hysteria/server.key;
9 ssl_session_timeout 1d;
10 ssl_session_cache shared:MozSSL:10m;
11 ssl_session_tickets off;
12
13 ssl_protocols TLSv1.2 TLSv1.3;
14 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
15 ssl_prefer_server_ciphers off;
16
17 location /4b6b9d51-c9aa-4ac8-9811-8726a23e480a {
18 proxy_redirect off;
19 proxy_pass http://127.0.0.1:8388;
20 proxy_http_version 1.1;
21 proxy_set_header Upgrade $http_upgrade;
22 proxy_set_header Connection "upgrade";
23 proxy_set_header Host $host;
24 proxy_set_header X-Real-IP $remote_addr;
25 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
26 }
27
28}
29
30}
1systemctl start nginx
2systemctl status nginx
3systemctl enable nginx #开机自启
如此我们就完成了
最后测试一下就能看到效果了