# 自己搭建服务器

### 如何选择服务商

{% embed url="https://zhuanlan.zhihu.com/p/31856700" %}

> Linode是一个总部建立于美国新泽西州加洛伟的虚拟专用服务器（VPS）提供商。它的名字是由英文中Linux中的Li和node（即“节点”一词）构成的混成词。Linode VPS 在业界有着较高的信誉评价,在国外和国内用户中的口碑不错，价格适中。Linode 提供很多了原生的系统。成立于2003年的Linode历经这么多年，依然是vps界的常青树。
>
> 优势：最强的硬件配置，最棒的技术支援以及售后服务，稳定性强的一匹，同时各种免费付费服务一应俱全。对于Linode的优势我无需多言，这么多年，全球用户的一致信赖品牌。我16年把我的数据就从Vultr又搬迁回了Linode，玩了这么多年的vps，最后还是回归了Linode。对于个人站长而言，Linode绝对是不二选择。
>
> 劣势:和vultr一样，日本Tokyo2机房晚高峰ping值也高，毕竟他俩都是走ntt，要崩溃一起崩溃。另外一大劣势就是你要有一个双币信用卡来验证。虽然Linode已经支持paypal付款了，但是没有信用卡验证依然不能使用他家服务。

> vultr是一家成立于2014年的VPS提供商。根据域名所有者资料，母公司是2005年成立于新泽西州的ClanServers Hosting LLC公司，他们家的游戏服务器托管在全球6个国家的12个数据中心，选择非常多。vultr家的服务器采用的E3的CPU，清一色的Intel的SSD硬盘，vultr的计费按照使用计费（自行选择配置、可以按月或按小时计费），用多少算多少，可以随时取消，vultr的服务器托管在全球14个数据中心，即时开通使用。堪称是拥有最多机房的vps服务商。
>
> 优势：今年开始支持支付宝了，对小白而言是个好消息。其次他家日本机房5刀每月，到国内速度算是说得过去的。当然比起IDCF之类的速度肯定不行，但是胜在你能买到呀！而且使用vultr的人不算少，相关教程一搜就能搜到。至于硬件配置，api等等，也都是业界顶尖的，仅次于Linode
>
> 劣势：Vultr成也日本，败也日本。当年日本机房开通电信联通双直连的时候，我就预言要被国人活活艹死。仅仅半年，东京机房的晚高峰ping值就从原先的六七十飙升到一百三十左右了。然而即使这样，大家也没多少选择，提供日本机房的大商家一共就那么几家，你选啥？

### CentOS中搭建自己的ss服务器

{% embed url="https://crifan.github.io/scientific_network_summary/website/server_client_mode/ss_server/self_build_ss_server.html" %}

#### 准备工作 <a href="#zhun-bei-gong-zuo" id="zhun-bei-gong-zuo"></a>

**准备一台可以访问国外网站的VPS主机**

在自己搭建ss服务器之前，首先要求你自己有一台可以访问国外网站的服务器，典型的是去（比如[Linode](https://www.linode.com/)、[Vultr](https://www.vultr.com/)、[DigitalOcean](https://www.digitalocean.com/)等）主机提供商购买一个VPS主机，这样可以远程通过SSH工具登录主机，然后再去安装ss服务。

比如我此处就是用自己之前从Linode买的VPS，接着在上面折腾，安装ss服务，变成提供了ss服务器。

**最好用Python 2的版本**

为了兼容性，此处最好Python是2.x的版本，比如此处的是2.7.5：

```
[root@crifan ~]# python --version
Python 2.7.5
Copy
```

**Python包管理工具：pip**

如果没有python的包管理工具，比如`pip`，则最好先去安装：

```
yum -y install python-setuptools && easy_install pip && pip install --upgrade pip
Copy
```

#### 方式1: 用Python的shadowsocks实现ss服务 <a href="#fang-shi-1-yong-python-de-shadowsocks-shi-xian-ss-fu-wu" id="fang-shi-1-yong-python-de-shadowsocks-shi-xian-ss-fu-wu"></a>

**用pip去安装shadowsocks**

```
pip install shadowsocks
Copy
```

**配置shadowsocks**

去添加配置文件`/etc/shadowsocks.json`。

内容可以参考下面的`shadowsocks-libev`的配置文件`/etc/shadowsocks-libev/config.json`

**启用shadowsocks**

启动shadowsocks：

```
ssserver -c /etc/shadowsocks.json -d start
Copy
```

停止shadowsocks：

```
ssserver -c /etc/shadowsocks.json -d stop
Copy
```

#### 方式2: 用shadowsocks-libev实现ss服务 <a href="#fang-shi-2-yong-shadowsockslibev-shi-xian-ss-fu-wu" id="fang-shi-2-yong-shadowsockslibev-shi-xian-ss-fu-wu"></a>

**安装shadowsocks-libev**

```
cd /etc/yum.repos.d/
curl -O https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/repo/epel-7/librehat-shadowsocks-epel-7.repo
yum install -y shadowsocks-libev
Copy
```

**配置shadowsocks-libev**

新建配置文件（如果不存在的话）：

`/etc/shadowsocks-libev/config.json`

然后配置对应的参数：

* `server`：当前自己的服务器的地址
  * 比如：`0.0.0.0`
* `server_port`：ss服务的端口
  * 一般要大于1024，小于65536
  * 可以随意取值，只要不和其他端口冲突即可
    * 比如：`21500`
* `password`：ss客户端使用ss时要使用的密码
  * 比如一个复杂但安全的，包含数字和大小写字母的密码：`Ci20s5a6y96F`
* `method`：加密方式
  * 以前常见的方式是：`aes-256-cfb`
  * 最新更加复杂但更安全的是：`chacha20-ietf-poly1305`
    * 但是注意需要ss客户端要支持该加密方式才能正常使用ss服务
* `timeout`：超时时间，单位：秒
  * 比如：`300`
* `mode`：ss服务的模式
  * 比如：`tcp_and_udp`，即支持tcp也支持udp

举例，比如我此处的设置是：

```
{
  "server": "0.0.0.0",
  "server_port": 21500,
  "password": "Ci20s5a6y96F",
  "method": "aes-256-cfb",
  "timeout": 300,
  "mode": "tcp_and_udp"
}
Copy
```

**启动shadowsocks-libev**

* 启动：`systemctl restart shadowsocks-libev`

想要以后每次重启（Linux的CentOS）服务器时都可以自动启动此ss服务，则可以去：

* 设置开机启动：`systemctl enable shadowsocks-libev`

其他相关命令：

* 查看状态：`systemctl status shadowsocks-libev`
* 查看日志：`journalctl -u shadowsocks-libev`
* 重启：`systemctl restart shadowsocks-libev`

**如何确认ss是否正在正常运行**

有多种手段查看ss是否正常运行：

**systemctl status shadowsocks-libev**

比如用 `systemctl status shadowsocks-libev` 去查看状态是否正常：

```
[root@crifan yum.repos.d]# systemctl status shadowsocks-libev
[0m shadowsocks-libev.service – Shadowsocks-libev Default Server Service
   Loaded: loaded (/usr/lib/systemd/system/shadowsocks-libev.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2017-10-23 20:32:02 CST; 25s ago
     Docs: man:shadowsocks-libev(8)
Main PID: 20915 (ss-server)
   CGroup: /system.slice/shadowsocks-libev.service
           20915 /usr/bin/ss-server -c /etc/shadowsocks-libev/config.json -u
Oct 23 20:32:02 crifan.com systemd[1]: Started Shadowsocks-libev Default Server Service.
Oct 23 20:32:02 crifan.com systemd[1]: Starting Shadowsocks-libev Default Server Service…
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: UDP relay enabled
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: initializing ciphers… aes-256-cfb
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: tcp server listening at 0.0.0.0:21500
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: udp server listening at 0.0.0.0:21500
Copy
```

**journalctl -u shadowsocks-libev**

可以查看对应的log输出是否正常，比如：

```
[root@crifan yum.repos.d]# journalctl -u shadowsocks-libev
— Logs begin at Thu 2017-10-12 03:56:54 CST, end at Mon 2017-10-23 20:39:17 CST. —
Oct 23 20:32:02 crifan.com systemd[1]: Started Shadowsocks-libev Default Server Service.
Oct 23 20:32:02 crifan.com systemd[1]: Starting Shadowsocks-libev Default Server Service…
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: UDP relay enabled
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: initializing ciphers… aes-256-cfb
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: tcp server listening at 0.0.0.0:21500
Oct 23 20:32:02 crifan.com ss-server[20915]: 2017-10-23 20:32:02 INFO: udp server listening at 0.0.0.0:21500
Copy
```

**netstat -autn**

通过命令：`netstat -autn` 或：`netstat -lnp`，去查看ss的端口是否正常：

```
[root@crifan yum.repos.d]# netstat -autn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21500           0.0.0.0:*               LISTEN     
...
tcp        0      0 45.79.205.194:443       222.188.39.139:52004    ESTABLISHED
...
tcp        0      1 45.79.205.194:80        61.147.173.53:45254     LAST_ACK   
tcp6       0      0 :::22                   :::*                    LISTEN     
udp        0      0 0.0.0.0:21500           0.0.0.0:*
Copy
```

其中的`21500`就是上面设置的ss的端口，对应着`tcp`和`udp`的服务，表示都在正常运行。

**ps ax |grep ss-server**

也可以用`ps ax |grep ss-server`去看看当前已经通过ss-server启用了哪些ss的服务

**用shadowsocks-libev实现多账号/多用户**

上述创建的ss服务，只有一个（账号）密码，只能供一个人用，或者说，如果多个人使用，则使用的是同一个（账号）密码，显得很不方便和不安全。

如果想要多个用户每人有不同的账号（密码），则可以：用shadowsocks-libev实现多账号/多用户

新建另外一个配置文件，比如：

`/etc/shadowsocks-libev/config2.json`

内容和之前一致，只是端口号`server_port`和密码`password`改了一下即可：

```
{
    "server": "0.0.0.0",
    "server_port": 21501,
    "password": "passowrd2",
    "method": "aes-256-cfb",
    "timeout": 300,
    "mode": "tcp_and_udp"
}
Copy
```

> 注意: 端口号不要和系统中其他服务的端口号冲突了。

另外再去用：

```
setsid ss-server -c /etc/shadowsocks-libev/config2.json -u
Copy
```

启用新端口对应的ss服务。

### 说明+坑+注意事项 <a href="#shuo-ming-keng-zhu-yi-shi-xiang" id="shuo-ming-keng-zhu-yi-shi-xiang"></a>

关于更多的折腾的细节可以参考：[【已解决】Linode的CentOS 7中搭建shadowsocks – 在路上](https://www.crifan.com/linode_centos_7_install_and_config_shadowsocks/)

此处把一些常见的坑/注意事项/说明解释，整理如下：

#### Shadowsocks官网 <a href="#shadowsocks-guan-wang" id="shadowsocks-guan-wang"></a>

**官网也有介绍如何安装ss服务端**

其实Shadowsocks的官网中也有管理server端的介绍：[Shadowsocks - Servers](https://shadowsocks.org/en/download/servers.html)，也可以参考官网去安装服务端的ss。

**官网也有介绍如何ss的配置的**

官网也有关于ss的配置信息的介绍的，包括：

* 基本的配置信息的介绍：[Shadowsocks - Quick Guide](https://shadowsocks.org/en/config/quick-guide.html)
  * 其中包含关于二维码的规则的介绍
* 更加高级的配置：[Shadowsocks - Advanced](https://shadowsocks.org/en/config/advanced.html)

#### 建议设置一个复杂但安全的密码 <a href="#jian-yi-she-zhi-yi-ge-fu-za-dan-an-quan-de-mi-ma" id="jian-yi-she-zhi-yi-ge-fu-za-dan-an-quan-de-mi-ma"></a>

为了使得自己的ss的相对更加安全，建议设置一个相对比较复杂的密码

比如可以使用第三方密码生成工具：[Generate Password](http://ucdok.com/project/generate_password.html)

去生成一个比较复杂的密码，就类似于：`ci20s5a6y96f`

#### FirewallD is not running <a href="#firewalld-is-not-running" id="firewalld-is-not-running"></a>

在启用ss服务期间，在检查是否可能是由于防火墙的问题而导致ss服务没有正常运行时，可能会遇到：

`FirewallD is not running`

-> 其表示：防火墙并没有运行

-> 对应着（和我此处类似的Linode的）CentOS中的防火墙，默认是关闭的

-> 所以不是防火墙的问题。

### 其他问题

> 错误：软件包：shadowsocks-libev-3.2.0-2.el7.x86\_64 (librehat-shadowsocks) 需要：libsodium >= 1.0.4&#x20;
>
> 错误：软件包：shadowsocks-libev-3.2.0-2.el7.x86\_64 (librehat-shadowsocks) 需要：mbedtls

解决：

```
安装libsodium的方法：

yum install epel-release -y
yum install libsodium -y

安装mbedtls-devel的方法：

yum install epel-release
yum update
yum install mbedtls-devel
```

### 看起来服务器一切正常，客户端也已连接，但实际上就是打不开谷歌的问题：

```
实际是服务器centos7 情况下，没有自动开放端口，开放端口配置详见：
https://www.cnblogs.com/moxiaoan/p/5683743.html

添加
firewall-cmd --zone=public --add-port=80/tcp --permanent    （--permanent永久生效，没有此参数重启后失效）
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone= public --query-port=80/tcp

开放udp端口也一样如上配置。
```

新版ss服务器已不需要配置"mode": "tcp\_and\_udp"

### 关于开启多个配置的可以参考（没试过）

&#x20;[https://www.bzblg.com/article/103.html](https://www.bzblg.com/article/103.html)
