国内很多朋友们都想科学上网,去国外查找资料,因此很多人苦恼没有科学上网工具VPN,而四处购买各种很贵的VPN,本文就讲解如何使用国外的服务器搭建一个VPN科学上网平台,能够轻松访问国外任何网站,而且很稳定。AWS全称是Amazon Web Services,产品线非常丰富。

EC2

Amazon EC2属于「计算」分类,全称是Amazon Elastic Compute Cloud(亚马逊弹性云计算),官方的产品简介就是「云中的虚拟服务器」,和常见的VPS(Virtual Private Server)基本上相同,都是提供一台用户可以完全控制的虚拟服务器。

Why EC2

传统的VPS提供的服务比较单一,而EC2可以和AWS的其它产品无缝集成。打个比方,传统的VPS就像品牌专卖店,而EC2是坐落在AWS这家购物中心的品牌专卖店,周边还围绕着一堆品牌,用户可以一站式解决「吃喝玩乐购」所有需求。 AWS可以说是云计算领域的开山鼻祖,硬件和软件都经历了多年的考验,文档丰富,服务品质值得信赖。而为了吸引用户,AWS的多种产品都提供了免费套餐,有些是第一年免费,有些则是永久免费,EC2就提供了永久免费的t2.micro实例。

免费套餐限额

一个AWS账号可以创建多个免费实例,所有免费实例共享750小时的免费使用时间,超出750小时的使用时间需要付费。 30GB的Amazon EBS存储(以任意方式对通用型 (SSD) 或磁性介质型进行组合),附加200万次I/O(采用EBS磁性介质)和1GB快照存储。 适用于所有AWS服务的共计15GB的带宽传出量。 更多AWS免费套餐限额参见AWS免费使用套餐常见问题。

正因为存在这些限制,用户应当主动跟踪AWS免费套餐使用量。How to use EC2注册AWS账号 注册很简单,此处略过,关键是两点: 绑定一张可以正常扣费的国际信用卡。

某些AWS服务需要用户提供「a valid business URL」,也就是用户自己拥有的域名,为了证明所有权,用户要用这个域名关联的email地址把相关信息发送给AWS客服。以下是AWS当初要求我提供相关信息的邮件: You have not been granted access to Amazon Route 53 or CloudFront. We require you to provide us with a valid business URL. Please email us the valid URL from an email address associated with that URL (example: yourname@yourbusinessname.com). You must also include the email address that is associated with your AWS account or your AWS account ID.

创建实例

在EC2上,一台虚拟服务器被称为一个「实例」,AWS官方提供了《通过Amazon EC2启动Linux虚拟机》10分钟教程让新手快速创建实例,非常容易上手,但这里有几个注意事项:

  1. 这个入门教程使用的Linux发行版是「Amazon Linux」,由Amazon基于RedHat Enterprise Linux开发,尽管可以查看源代码,但这个发行版主要在AWS平台使用,并没有得到其它云服务厂家的支持,建议使用主流的发行版,如RHEL、SUSE Linux Enterprise Server、Ubuntu Server。
  2. 打开EC2控制台之后,首先在右上角选择实例运行的区域,选择的标准是让实例距离目标用户越近越好: 所谓越近越好,其实是Ping值越小越好,可以通过 http://www.cloudping.info/ 测试浏览器访问各区域服务器的ping值。中国大陆用户推荐使用东京区域。不推荐使用北京区域,因为中国大陆的AWS业务是独立运营的,提供的产品远远少于国际版AWS。

我通过官方教程创建了一个运行Amazon Linux的实例,借此了解EC2的操作流程,然后我终止了(terminated)这个实例,用我熟悉的RHEL创建了新的实例,整个过程仅需要几分钟。

如果一个实例不再使用,官方建议将其终止,也就是从硬盘上彻底删除所有数据,避免继续产生费用。 除了终止,实例还可以重启、停止,但我在停止一个没有弹性IP的实例半个月之后再重启时,无法ssh远程连接,根据官方的排错文档也找不到原因,最后只能创建新的实例。

连接实例

EC2实例创建成功、状态变为「running」后,就可以用SSH远程连接了,但开始必须使用私钥文件,ssh登录成功后,可以在ssh里设置密码登录,但要重新修改密码,重新生成pem私钥文件。私钥文件在创建实例时生成、下载,登录用户名默认是ec2-user(仅在Amazon Linux和RHEL上测试通过,Ubuntu18的用户名默认是ubuntu)你可以在网页控制端点击连接那里看到。

macOS和Linux连接命令如下:

ssh -i path_to_your_private_key.pem ec2-user@public_ip_of_your_instance

注意,私钥文件必须保管好,丢失之后将无法远程访问实例,而任何人拿到私钥都可以远程访问实例!

设置用户密码

ec2-user默认已经属于wheel用户组,登录成功之后,可以sudo执行系统管理相关的命令,但ec2-user默认没有设置密码,如果要设置密码,命令如下:

sudo passwd ec2-user

如果要设置root用户的密码(默认未设置),命令如下:

sudo passwd

macOS和Linux连接命令如下:

ssh -i path_to_your_private_key.pem ec2-user@public_ip_of_your_instance

注意,私钥文件必须保管好,丢失之后将无法远程访问实例,而任何人拿到私钥都可以远程访问实例!

Shadowsocks服务器安装

Shadowsocks是目前最流行的科学上网方案,支持多种平台,开发活跃,安装配置简单,速度快,占用资源少,实为科学上网首选。 Shadowsocks服务器有多种实现:Python版本、Go版本、C(libev)版本等等,推荐使用Python版本,因为Shadowsocks服务器最早就是用Python实现的,而且Python版安装最方便:

sudo yum install -y python-setuptools git
sudo easy_install pip
sudo pip install git+https://github.com/shadowsocks/shadowsocks.git@master

配置

Shadowsocks服务器可以通过命令行指定启动选项,也可以通过配置文件启动。我喜欢配置文件,可以让命令更简洁,也便于以后做更复杂的设置:

sudo vim /etc/shadowsocks.json

粘贴以下内容,然后修改password字段的值:

{
"server": "0.0.0.0",
"server_port": 9999, #设置任意没被占用的端口
"local_address": "127.0.0.1", #localhost
"local_port": 1080, #本地监听端口
"password": "your_password", #设置密码
"timeout": 300, #超时时间 秒
"method": "aes-256-cfb", #加密方式
"fast_open": false #是否启用TCP-Fast-Open
}

注意,配置文件的关键是server字段的值。官方对server字段的解释是「the address your server listens」,意思是「服务器监听的地址」,直白的说就是,Shadowsocks服务器只接受来自这个地址的请求。 网上许多文章把server字段理解成「Shadowsocks服务器所在主机的公网IP」,这是不对的。这样设置会导致Shadowsocks服务器启动失败,日志文件/var/log/shadowsocks.log会记录失败原因是socket.error: [Errno 99] Cannot assign requested address server字段正确的值应该是0.0.0.0,表示「接受来自任意IP地址的连接」。

启动

Shadowsocks服务器的二进制可执行文件是ssserver,我喜欢后台启动它,因为对于一个服务来说,大多数时候都是后台启动,前台启动通常是为了调试:

# 启动服务
sudo ssserver -c /etc/shadowsocks.json -d start

# 停止服务
sudo ssserver -c /etc/shadowsocks.json -d stop

如果要前台启动,命令如下:

# 从配置文件启动
sudo ssserver -c /etc/shadowsocks.json
# 命令行指定启动参数# -s: server address, default is 0.0.0.0

# -p: server port, default is 8388
sudo ssserver -p 443 -k password -m aes-256-cfb

# 停止服务
sudo ssserver -d stop

确认启动状态:

$ /bin/ps axu | grep ssserver | grep -v grep
nobody 4602 0.0 0.9 209844 9356 ? Ss Feb20 0:10 /usr/bin/python /bin/ssserver -c /etc/shadowsocks.json --user=nobody -d start

如果能看到类似上面的输出,就表示启动成功了。

设置开机启动

sudo sh -c 'echo "sudo ssserver -c /etc/shadowsocks.json -d start" >> /etc/rc.d/rc.local'# RHEL 7上必须执行这一步
sudo chmod +x /etc/rc.d/rc.local开启防火墙端口

EC2实例的防火墙由「安全组」控制——安全组是AWS的专用术语——默认只开启了22端口用于SSH连接,必须在安全组开启Shadowsocks服务器使用的端口,否则无法连接。

  1. 首先找到实例关联的安全组,这里是launch-wizard-1
  2. 点击安全组名称,在跳转到的页面选中同名条目,然后点击「操作→编辑入站规则」,点击「添加规则」,类型选择「自定义TCP规则」,端口范围填写前面Shadowsocks配置文件里设置的端口,来源选择「自定义」并输入0.0.0.0/0,描述可以不填,最后点击「保存」。保存的规则立即生效。设置完成后需要到亚马逊AWS中重启一下实例,否则可能无法科学上网。

此时就可以从Shadowsocks客户端连接服务器了。

SELinux

RHEL实例默认开启了SELinux,但并不会阻止Shadowsocks server的启动和网络连接,不过为了提高性能,我仍然将其禁用:

sudo setenforce 0

sudo sed -i.bak -r 's/^(SELINUX=)enforcing/\1disabled/' /etc/selinux/config

客户端安装

根据你的使用环境区https://github.com/shadowsocks下载安装相应的版本,打开填写相关配置参数,服务地址就写你公网的ip,其他根据你服务器上配置参数填就行

总结

在EC2实例上安装Shadowsocks服务器既可以帮助熟悉EC2的用法,也可以借此获取稳定免费的翻墙渠道,解决生活和工作中的实际问题,可谓一举多得。 但不要忘记,免费套餐是有限额的,如果滥用,仍然可能产生费用。

如果遇到错误:AttributeError: /lib64/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup 以前在openssl,有EVP_CIPHER_CTX_cleanup函数.1.1.0版本中替换成为EVP_CIPHER_CTX_reset

解决办法:

找到报错的文件

python2

vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py

python3

vim /usr/local/lib/python3.6/site-packages/shadowsocks/crypto/openssl.py

全文搜索cleanup 将所有EVP_CIPHER_CTX_cleanup替换成为EVP_CIPHER_CTX_reset:

%s/cleanup/reset/g
:x

本文链接:http://nix.pub/article/aws/