Featured image of post 在云服务器上用Shadowsocks搭建VPN

在云服务器上用Shadowsocks搭建VPN

在云服务器上搭建Shadowsocks服务,实现科学上网

缘起

由于版权问题,在国外无法使用国内很多视频、音乐资源,因此就想搭建一个VPN,以便翻墙回国。于是我在国内的云服务商那里租了一台服务器,然后在上面搭建了Shadowsocks服务,实现了翻墙回国。在这个过程中遇到了不少问题,这里记录一下。

前提

  • 一台位于国内的云服务器

安装Shadowsocks

安装Shadowsocks的过程我主要参考了这篇文章:给小白的Shadowsocks翻墙教程。但依照这篇文章的步骤,我搞了好多次都没有成功,原因是这篇文章里有不少坑,这里主要记录一下是如何解决这些问题的。

云服务器网络

上面安装Shadowsocks的教程需要下载一些位于GitHub上的资源,而由于众所周知的原因,GitHub在国内是无法访问的。因此,我们需要先解决这个问题。即我们想在国外翻墙回国,首先需要让国内的云服务器翻墙出去。

如果是在国内的普通电脑上,那只需要用一些通用的翻墙软件就行了。但我们的云服务器以命令行的形式运行,因此我们需要在命令行中翻墙。这里有两种方案:

方案(一):使用ssh代理

首先,因为我们本身就在国外,不需要再为我们在国内的云服务器专门购买一个VPN,只需要利用我们在国外的电脑就行。

  1. 从国外的电脑(以下简称“电脑”)ssh到国内的云服务器(以下简称“云服务器”)上:

    1
    
    ssh username@cloud_server_ip
    
  2. 从云服务器ssh到电脑上,并使用代理端口(端口号可以在1到65535中任选一个,这里我选了11111):

    1
    
    ssh -D 11111 username@foreign_computer_ip
    
  3. 设置云服务器的网络代理,将代理端口设置为11111:

    1
    
    export ALL_PROXY=socks5://127.0.0.1:11111
    

    这样,经过云服务器的网络请求都会被转发到端口11111,然后通过ssh隧道转发到电脑上,这样当云服务器需要访问国外的网络时,就会通过电脑的网络访问,从而实现了翻墙。

  4. 查看一下云服务器此时的ip地址:

    1
    
    curl ipinfo.io
    

    如果显示的ip地址是电脑的ip地址,那就说明我们成功了。

然后按照上面的教程中的步骤安装Shadowsocks,但是我发现依然有问题。问题似乎是,教程中安装Shadowsocks的脚本会使用wget下载一些文件,但是wget似乎不会走我们设置的代理,因此依然会提示连接超时。但是curl是可以走我们的代理网络的,因此我们可以把脚本中的wget请求全部换为curl请求,这样就可以解决这个问题了。

方案(二):先在本地下载,再上传到云服务器

上面的方案设置起来比较复杂,而且可能会出各种问题。其实我之后可能并不会再频繁使用云服务器连接国外的网络,如果只是为了这次的需求,完全可以把需要的文件事先下载下来,然后再上传到云服务器上就行了。

使用这个方案就无法使用上面教程中的单个命令完成了,我们需要拆分一下这个命令:

  1. 在电脑上下载Shadowsocks安装脚本:

    1
    
    wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
    
  2. 将下载好的脚本上传到云服务器上:

    1
    
    scp shadowsocks-all.sh root@cloud_server_ip:/root
    
  3. 在云服务器上安装Shadowsocks:

    1
    
    bash shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log
    

    需要注意的是,现在运行这个安装脚本依然会失败,有两个原因:

    • 无法连接GitHub下载一些文件
    • 无法找到Python的安装包

Python版本

上面的安装脚本需要使用pythonpython2),但是Ubuntu 22中的apt源中并没有python,而需要显式地指定Python版本,例如明确是python2还是python3

因此这里需要做两件事:

  1. 将脚本中apt_depends里的python改为python2python-dev改为python2-dev
  2. /usr/bin目录下创建一个软链接,将python指向python2
    1
    
    ln -s /usr/bin/python2 /usr/bin/python
    

然后再按照上面教程中的安装步骤就行了。这里我选择安装的Shadowsocks版本是Shadowsocks-Python

完成Shadowsocks安装

确认Shadowsocks在正常运行

安装完成后,我们可以使用如下命令查看Shadowsocks的运行状态:

1
/etc/init.d/shadowsocks status

如果显示的是Shadowsocks (pid xxxxx) is running...,那就说明Shadowsocks已经在正常运行了。

云服务器防火墙开启端口

需要在云服务器的防火墙中开启Shadowsocks的端口(默认是8388),否则无法连接到Shadowsocks服务。运行下面的命令:

1
2
ufw allow 8388
ufw enable

然后使用下面的命令查看防火墙的状态:

1
ufw status

如果显示的是Status: active,并且Shadowsocks使用的端口处于ALLOW状态,那就说明防火墙已经开启了。

在云服务器管理界面开启端口

对很多云服务器来说,仅在云服务器命令行中开启防火墙是不够的,还需要在云服务器的管理界面中开启端口。在管理界面找到安全组,然后添加一个入方向的规则,将端口设置为Shadowsocks使用的端口(默认是8388),协议设置为TCP, 源地址设置为0.0.0.0/0

使用Shadowsocks翻墙回国

下载Shadowsocks客户端,然后配置Shadowsocks客户端,将服务器地址设置为云服务器的ip地址,端口设置为Shadowsocks使用的端口(默认是8388),密码设置为Shadowsocks服务的密码,确保加密方式与Shadowsocks服务端的一致。 如果之前的设置都正常的话,现在就可以连接到国内的网络了。

comments powered by Disqus