在Amazon EC2 Linux实例上安装Shadowsocks服务器

2018-02-21|Categories: Cloud, Linux|

AWS产品线

AWS全称是Amazon Web Services,产品线非常丰富,仅大分类就有20个:

每个大分类又包含若干个产品,「计算」分类的主要产品如下:

What is 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分钟教程让新手快速创建实例,非常容易上手,但这里有几个注意事项:

  • 这个入门教程使用的Linux发行版是「Amazon Linux」,由Amazon基于RedHat Enterprise Linux开发,尽管可以查看源代码,但这个发行版主要在AWS平台使用,并没有得到其它云服务厂家的支持,建议使用主流的发行版,如RHEL、SUSE Linux Enterprise Server、Ubuntu Server。
  • 打开EC2控制台之后,首先在右上角选择实例运行的区域,选择的标准是让实例距离目标用户越近越好:

  • 所谓越近越好,其实是Ping值越小越好,可以通过 http://www.cloudping.info/ 测试浏览器访问各区域服务器的ping值。中国大陆用户推荐使用东京区域。不推荐使用北京区域,因为中国大陆的AWS业务是独立运营的,提供的产品远远少于国际版AWS。

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

如果一个实例不再使用,官方建议将其终止,也就是从硬盘上彻底删除所有数据,避免继续产生费用。

除了终止,实例还可以重启、停止,但我在停止一个没有弹性IP的实例半个月之后再重启时,无法ssh远程连接,根据官方的排错文档也找不到原因,最后只能创建新的实例。

远程连接实例

EC2实例创建成功、状态变为「running」后,就可以用SSH远程连接了,但必须使用私钥文件。私钥文件在创建实例时生成、下载,登录用户名默认是ec2-user(仅在Amazon Linux和RHEL上测试通过),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 su
passwd root

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": 8388,
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "password": "your_password",
    "timeout": 300,
    "method": "aes-256-cfb",
    "fast_open": false
}

注意,配置文件的关键是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服务器使用的端口,否则无法连接。

首先找到实例关联的安全组,这里是launch-wizard-1

点击安全组名称,在跳转到的页面选中同名条目,然后点击「操作→编辑入站规则」:

点击「添加规则」,类型选择「自定义TCP规则」,端口范围填写前面Shadowsocks配置文件里设置的端口,来源选择「自定义」并输入0.0.0.0/0,描述可以不填,最后点击「保存」。保存的规则立即生效。

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

SELinux

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

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

总结

在EC2实例上安装Shadowsocks服务器既可以帮助熟悉EC2的用法,也可以借此获取稳定免费的翻墙渠道,解决生活和工作中的实际问题,可谓一举多得。

但不要忘记,免费套餐是有限额的,如果滥用,仍然可能产生费用。

Leave A Comment