基本工具🔨

首先我们需要使用v2ray进行科学上网, 而不是继续使用SS, 我们使用v2rayWebsocket + nginxSSL 功能作为我们的主要使用的功能之一.

还有因为要使用SSL, 所以我们需要一个域名, 还有一个证书, 现在的话, 域名可以随便申请和注册一个普通域名就行, 然后证书的话, 可以申请一个免费的HTTPS证书.

我们需要你知道基本的linux terminal 操作, 需要有一台在国外的VPS, 比如lindo, vultr或者搬瓦工, 然后安装好了ubuntu的操作系统, 知道基本的vim 操作指令.

v2ray安装✈️

废话少说, 我们现在马上进入正题. 为了快速安装v2ray我们直接使用233boy提供的仓库脚本进行安装和管理v2ray.

我们首先使用terminal登录你的VPS, 打开你的terminal, 我这里使用的是Mac+iTerm2 所以直接输入ssh user@host然后输入密码就可以登录进去了.

接着我们进入到用户目录然后准备下载233boy的安装/管理脚本

cd ~

接着我们安装一下wgetgit, 如果有的话, 就不需要再安装了

sudo apt install wget
sudo apt install git

安装成功之后我们下载仓库:

git clone https://github.com/233boy/v2ray.git

接着checkoutmaster分支

cd v2ray/
git checkout master

然后直接安装, 要使用root权限:

sudo chmod +x ./install.sh
sudo ./install.sh

在进入安装步骤的时候我们使用ws+ssl的传输方式来使用v2ray, v2ray自身传输方式使用ws协议协议, 然后我们使用NGINX来加载https:

WS协议

安装完成

我们这里选择只使用WS协议, HTTPS通过NGINX或者caddy反向代理配置完成, 如果是使用WS+TLS的话, 证书是由v2ray服务端程序直接加载.
安装好了之后可以输入命令来进行管理

sudo v2ray

然后v2ray的配置信息在/etc/v2ray/目录下, 这些配置文件等下我们会使用到, 我们这里贴一下v2ray服务端最基础的config.json配置文件:

{
    "log": {
        "access": "/var/log/v2ray/access.log",
        "error": "/var/log/v2ray/error.log",
        "loglevel": "warning"
    },
    "inbounds": [{
            "port": 10000,
            "protocol": "vmess",
            "settings": {
                "clients": [{
                    "id": "xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx",
                    "level": 1,
                    "alterId": 64
                }]
            },
            "streamSettings": {
                "network": "ws",
                "wsSettings": {
                    //注意分流地址
                    "path": "/app/",
                    "headers": {}
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            }
        }
        //include_ss
        //include_socks
        //include_mtproto
        //include_in_config
        //
    ],
    "outbounds": [{
            "protocol": "freedom",
            "settings": {}
        }, {
            "protocol": "blackhole",
            "settings": {},
            "tag": "blocked"
        }, {
            "protocol": "freedom",
            "settings": {},
            "tag": "direct"
        }, {
            "protocol": "mtproto",
            "settings": {},
            "tag": "tg-out"
        }
        //include_out_config
        //
    ],
    "dns": {
        "server": [
            "1.1.1.1",
            "1.0.0.1",
            "8.8.8.8",
            "8.8.4.4",
            "localhost"
        ]
    },
    "routing": {
        "domainStrategy": "IPOnDemand",
        "rules": [{
                "type": "field",
                "ip": [
                    "0.0.0.0/8",
                    "10.0.0.0/8",
                    "100.64.0.0/10",
                    "127.0.0.0/8",
                    "169.254.0.0/16",
                    "172.16.0.0/12",
                    "192.0.0.0/24",
                    "192.0.2.0/24",
                    "192.168.0.0/16",
                    "198.18.0.0/15",
                    "198.51.100.0/24",
                    "203.0.113.0/24",
                    "::1/128",
                    "fc00::/7",
                    "fe80::/10"
                ],
                "outboundTag": "blocked"
            }, {
                "type": "field",
                "inboundTag": ["tg-in"],
                "outboundTag": "tg-out"
            }, {
                "type": "field",
                "domain": [],
                "outboundTag": "blocked"
            }, {
                "type": "field",
                "protocol": [
                    "bittorrent"
                ],
                "outboundTag": "blocked"
            }
            //include_ban_ad
            //include_rules
            //
        ]
    },
    "transport": {
        "kcpSettings": {
            "uplinkCapacity": 100,
            "downlinkCapacity": 100,
            "congestion": true
        },
        "sockopt": {
            "tcpFastOpen": true
        }
    }
}

我们这里需要注意的是端口是10000, 还有传输方式是ws, 然后ws传输方式的设置是加了一个分流路径, 地址是/app/

注意是/app/它和/app是不同的. 这个路径和nginx的配置文件要一致

配置nginx🕸

我们接着配置v2rayssl功能部分, 首先我们需要安装一下NGINX

sudo apt install nginx

安装好了之后我们进入配置文件目录新建一个配置文件:

cd /etc/nginx/sites-enabled/

sudo touch example.com.conf

接着我们修改这个配置文件, 增加一些内容:

如果没有vim的话, 直接使用sudo apt install vim进行安装或者使用vi

sudo vim example.com.conf

conf文件的内容如下

server{

    listen 443 ssl;
    server_name example.com;

    root /var/www/html;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols         TLSv1.1 TLSv1.2;
    ssl_ciphers           HIGH:!aNULL:!MD5;

    location / {
        autoindex on;
        autoindex_exact_size on;
        autoindex_localtime on;

    }

    location /app/ {
        proxy_redirect off;
        # 反向代理到v2ray的10000端口
        proxy_pass http://127.0.0.1:10000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
}

接着输入:wq👈按回车退出vim然后输入sudo nginx -t检查配置文件是否正确, 完了正确的话, 我们输入几个命令重启一下NGINX:

sudo service nginx reload
sudo service nginx restart

重启完成之后, 访问检查一下证书是否正确, 我们访问https://example.com的时候正常来说会显示你的/var/www/html目录下的文件, 这个是默认的www目录, 我们无需理会. 然后我们访问https://example.com/app/的时候应该会提示Bad Request如果是这样的话, 应该是没有问题了.

客户端的配置🛴

服务器的配置安装完成, 测试通过后,我们安装客户端的配置文件,我这里是MacOS系统, 我们直接使用brew安装v2ray:

brew install v2ray-core

安装完成之后可以使用brew services 来进行管理v2ray

brew services v2ray-core restart

安装好了之后v2ray的配置文件在这里, 我们直接进入这个位置查看和修改v2ray clientconfig.json配置文件:

cd /usr/local/etc/v2ray/

vim config.json

然后使用的配置文件:

// Config file of V2Ray. This file follows standard JSON format, with comments support.
// Uncomment entries below to satisfy your needs. Also read our manual for more detail at
// https://www.v2ray.com/
{
    "log": {
        // By default, V2Ray writes access log to stdout.
        // "access": "/path/to/access/log/file",

        // By default, V2Ray write error log to stdout.
        // "error": "/path/to/error/log/file",

        // Log level, one of "debug", "info", "warning", "error", "none"
        "loglevel": "warning"
    },
    // List of inbound proxy configurations.
    "inbounds": [{
        // Port to listen on. You may need root access if the value is less than 1024.
        "port": 7878,

        // IP address to listen on. Change to "0.0.0.0" to listen on all network interfaces.
        "listen": "127.0.0.1",

        // Tag of the inbound proxy. May be used for routing.
        "tag": "http-inbound",

        // Protocol name of inbound proxy.
        "protocol": "http",

        // Settings of the protocol. Varies based on protocol.
        "settings": {
            "auth": "noauth",
            "udp": false,
            "ip": "127.0.0.1"
        },

        // Enable sniffing on TCP connection.
        "sniffing": {
            "enabled": true,
            // Target domain will be overriden to the one carried by the connection, if the connection is HTTP or HTTPS.
            "destOverride": ["http", "tls"]
        }
    }, {
		"tag": "socks-inbound",
		"port": 1080, // SOCKS
		"listen": "127.0.0.1",
		"protocol": "socks",
		"settings": {
			"udp": true,
			"auth": "noauth",
			"ip": "127.0.0.1"
		}
	}],
    // List of outbound proxy configurations.
    "outbounds": [{
        "protocol": "vmess",
        "settings": {
            "vnext": [{
                "address": "example.com",
                "port": 443,
                "users": [{
                    "id": "xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx",
                    "level": 1,
                    "alterId": 64,
                    "security": "auto"
                }]
            }]
        },
        "streamSettings": {
            "network": "ws",
            "security": "tls",
            "wsSettings": {
                "path": "/app/"
            }
        },
        "mux": {
            "enabled": true
        }
    }, {
        // Protocol name of the outbound proxy.
        "protocol": "freedom",

        // Settings of the protocol. Varies based on protocol.
        "settings": {},

        // Tag of the outbound. May be used for routing.
        "tag": "direct"
    }, {
        "protocol": "blackhole",
        "settings": {},
        "tag": "blocked"
    }],

    // Transport is for global transport settings. If you have multiple transports with same settings
    // (say mKCP), you may put it here, instead of in each individual inbound/outbounds.
    "transport": {
        // "kcpSettings": {
        //     "congestion": true,
        //     "downlinkCapacity": 100,
        //     "uplinkCapacity": 100
        // },
        // "sockopt": {
        //     "tcpFastOpen": true
        // }
    },

    // Routing controls how traffic from inbounds are sent to outbounds.
    "routing": {
        "domainStrategy": "IPOnDemand",
        "rules": [{
            // Blocks access to private IPs. Remove this if you want to access your router.
            "type": "field",
            "ip": ["geoip:private"],
            "outboundTag": "blocked"
        }, {
            // Blocks major ads.
            "type": "field",
            "domain": ["geosite:category-ads"],
            "outboundTag": "blocked"
        }]
    },

    // Dns settings for domain resolution.
    "dns": {
        // Static hosts, similar to hosts file.
        "hosts": {
            // Match v2ray.com to another domain on CloudFlare. This domain will be used when querying IPs for v2ray.com.
            "domain:v2ray.com": "www.vicemc.net",

            // The following settings help to eliminate DNS poisoning in mainland China.
            // It is safe to comment these out if this is not the case for you.
            "domain:github.io": "pages.github.com",
            "domain:wikipedia.org": "www.wikimedia.org",
            "domain:shadowsocks.org": "electronicsrealm.com"
        },
        "servers": [
            "8.8.8.8",
            "9.9.9.9",
            "127.0.0.1",
            "1.1.1.1", 
            {
                "address": "114.114.114.114",
                "port": 53,
                // List of domains that use this DNS first.
                "domains": [
                    "geosite:cn"
                ]
            }
        ]
    },

    // Policy controls some internal behavior of how V2Ray handles connections.
    // It may be on connection level by user levels in 'levels', or global settings in 'system.'
    "policy": {
        // Connection policys by user levels
        "levels": {
            "0": {
                "uplinkOnly": 0,
                "downlinkOnly": 0
            }
        },
        "system": {
            "statsInboundUplink": false,
            "statsInboundDownlink": false
        }
    },

    // Stats enables internal stats counter.
    // This setting can be used together with Policy and Api. 
    //"stats":{},

    // Api enables gRPC APIs for external programs to communicate with V2Ray instance.
    //"api": {
    //"tag": "api",
    //"services": [
    //  "HandlerService",
    //  "LoggerService",
    //  "StatsService"
    //]
    //},

    // You may add other entries to the configuration, but they will not be recognized by V2Ray.
    "other": {}
}

完事儿了之后, 可以使用brew services重启一下v2ray client

重启v2ray

这里的配置文件要注意的地方是hostport 然后传输方式是ws, 然后还有要使用tls, user的配置信息要注意id, alterIdsecurity.

本地代理设置, 要注意地址是127.0.0.1 然后socks 端口是1080, http代理的端口是7878.

在不支持socks的代理方式的环境中, 比如terminal, 我们可以用http代理, 修改我们的zshrc文件:

http代理

其他贴士📄

如果你没有MacOS或者使用的是其他方式, 我们可以直接去官方仓库下载可执行的二进制文件, 比如brew速度太慢了, 我完全下不了, 就可以这么做, 去到Release页面之后, 下载你对应的平台的zip文件, 然后解压 进入到解压之后的目录:

直接运行v2ray

使用全路径(绝对路径)执行v2ray可执行文件和同一级目录的修改后的配置文件, 直接来运行v2ray而不是通过brew的方式, Windows平台同理.

DNS的设置和证书申请📘

因为我的域名是去namecheap申请的, 所以修改DNS方式可能和其他域名提供商不太一致, 不过大概过程是一样的, 我们首先把DNS服务器修改为cloudfraleDNS服务器:

custom dns

修改了之后, 注册一下cloudflare的账号, 以便下一步设置CDN. 有了DNS解析之后, 我们还需要申请SSL证书, 我使用的是腾讯云的免费证书服务.

注册和登录腾讯云之后搜索证书服务, 进入证书申请控制台, 然后选择免费的证:

ssl 证书申请

输入你的域名信息之后, 下一步, 开始验证证书, 我们进入cloudflare的控制台, 创建一个域名, 就是你的域名, 然后设置DNS服务器, 完成之后, 打开DNS选项, 为你的域名添加证书的验证信息:

TXT记录

我们添加一个TXT记录, 添加完成无误之后, 静待证书审核通过.

证书审核通过

证书审核通过之后, 可以下载, 然后拷贝放置到NGINX的证书配置的文件夹中, 然后重启一下nginx, SSL的证书应该就配置好了.

DNS的设置中我们还需要添加一条A记录,把你的域名example.com指向你的VPS IP.

我们直接添加就好:

这里的example.com1.1.1.1都是示例, 请以你自己实际的域名和IP进行添加.

添加A记录

配置CDN🚀

配置好SSL证书和DNS解析之后, 我们还需要cloudflareCDN服务, 具体就是进入到cloudflarecrypto选项卡, SSL的栏目中选择full或者full(strict), 其他地方如果你不懂的话, 就不要动, 保持默认就好了.

启用CDN

接着我们回到DNS选项卡, 把指向你的VPS的IP的A记录的这朵云打开(已经打开了的话,就不需要再启用), 隔几分钟之后, 你的域名指向的应该就是cloudflareCDN地址了.

可以使用ping命令检查一下, 如果ping你的域名, 指向的ip不再是你的vpsip, 表明CDN应该是已经生效了

如果不生效, 比如cloudflarecrypto选项这里, SSL子项显示的不是激活状态的话, 可能你需要等待24小时后看是否激活:

ssl激活状态

最后🎏

至此, 我们的科学上网方案就全部完成了, 速度也很快, 我们可以打开youtube测试一下速率:

youtube

没有问题的话, 这次的配置圆满完成. 👏

copyright© kanda.me 版权所有, ⛔️ 禁止转载
题图