Featured image of post vps服务器配置

vps服务器配置

购买vps服务器后的配置笔记

断断续续也换过好几家服务器提供商了。由于服务器配置工作并不频繁,导致每次配置后过段时间就忘。每次拿到新服务器后,总是要重新搜索相关资料。因此在这里对服务器配置工作做一个总结,方便之后自己查阅。

用户相关工作

在拿到新的服务器运行时,一般不直接使用root用户进行登陆和操作,而是创建两个用户。一个用户拥有root权限,用来做服务器的管理工作。另一个用户只拥有少量权限且不可ssh登陆,用来安全地运行系统各项网络服务。具体步骤如下:

创建用户

ubuntu系统下使用adduser命令分别创建两个用户,并输入相应的用户名和密码等信息。对于其他系统,可使用通用的更为复杂的useradd命令并自行创建用户目录文件夹等。对于root权限用户,可将密码设置的更复杂以获得更好的安全性。 而对于低权限用户,可使用adduser –disabled-password –disabled-login {用户名}在创建时锁定其密码,来禁止其使用密码登陆。 下面将拥有root权限的用户称为“{用户A}”,少量权限的用户称为“{用户B}”。请根据自己实际情况进行替换

赋予用户A root权限

打开/etc/sudoers,找到root ALL=(ALL:ALL) ALL行并在它底下添加相似的一行,只不过把用户名改为要赋权的目标用户名:

1
2
3
#User privilege specification
root    ALL=(ALL:ALL) ALL
{用户A}  ALL=(ALL:ALL) ALL

随后,使用su {用户A}从root用户切换到用户A。执行sudo su,输入用户A的密码,看用户A是否能切换到root用户,以此来检查用户A是否已获得root权限。(重要!请务必检查此步正确,因为我们之后会关闭其他用户的root 权限,如果这步错误,除非rebuild你的服务器,否则再无方法拿到root权限,若系统无sudo,请使用系统自带的软件包管理器安装sudo)。

关闭root用户和用户B的登陆权限

为了进一步增加服务器的安全性,还可以通过编辑/etc/ssh/sshd_config文件来禁止root用户登陆、完全关闭用户B的ssh权限、修改ssh登陆端口。

  • /etc/ssh/sshd_config文件中,找到PermitRootLogin项,将后面的yes改为no即可禁止root用户登陆。

  • 如果在创建用户B时未禁止其密码登陆,可通过passwd -l {用户B}来锁定其密码。即使用户B密码被锁定,仍可使用ssh来与用户B通信。如果确定不会使用用户B的ssh功能,可在/etc/ssh/sshd_config文件最后新加一行DenyUsers {用户B},来彻底禁止使用ssh连接用户B。

  • /etc/ssh/sshd_config文件中,将Port 22修改为Port {任意非常用端口数字}即可将ssh登陆端口修改为其他端口

再执行完这些修改后,之后在登陆服务器时,将使用用户A以及相应ssh登陆端口来登陆:

1
ssh -p {端口号} {用户A}@{服务器IP}

当需要root权限执行命令时,使用sudo {命令}来执行。当需要切换到root用户时,使用sudo su。当需要切换到其他用户时,使用sudo su {其他用户名}

用户B防火墙设置

(以下内容来自于这篇博客,源博客已找不到,只找到转载的)

新建一个叫SHADOWSOCKS的Chain。并加入防范最常见的垃圾邮件攻击的规则

1
2
iptables -N SHADOWSOCKS
iptables -t filter -m owner --uid-owner {用户B} -A SHADOWSOCKS -p tcp --dport 25 -j REJECT --reject-with icmp-port-unreachable

最后,把SHADOWSOCKS这个Chain,打到OUTPUT上去

1
iptables -A OUTPUT -j SHADOWSOCKS

使用iptables-persistent工具来保存和自动加载规则

1
2
apt install iptables-persistent
/etc/init.d/netfilter-persistent save

代理相关

主要通过v2ray解决。对于目前市面上出现的新的Xray以及更古老的shadowsocks,有兴趣可以自行查看。

首先切换到低权限用户B并通过cd进入其根目录,通过mkdir新建文件夹后进入此文件夹,下载v2ray最新的release。最新版本的发布页详见此Github页面,并在 最新版的Assets里寻找Linux 64位版本:v2ray-linux-64.zip的地址,随后下载并解压缩。下面以4.38版本为例:

1
2
3
wget https://github.com/v2fly/v2ray-core/releases/download/v4.38.0/v2ray-linux-64.zip
unzip v2ray-linux-64.zip
rm v2ray-linux-64.zip

随后,新建一个名为server.json的配置文件进行代理配置。具体可参考这个教程。一般基本配置即可使用,但大流量有被封风险。如果为了更高的安全性,可以参阅高级配置中的TLS配置章节进行配置。 下面仅对websocket+tls+web配置进行说明。

此项配置需要申请一个域名,如果想长期使用的话,可花钱在国外购买一个域名(不要购买国内的域名,因为需要备案才能使用)。如果仅是为了代理的话,推荐使用freenom不停地换一年免费的域名即可。获得域名后 还需将域名和你的服务器IP连接,在相应控制面板中使用A连接IPV4地址,AAAA连接IPV6地址即可。

随后,对server.json文件进行配置,一个典型的websocket+tls+web配置文件如下所示,请根据自己需要修改。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  "log": {
    "loglevel": "warning",
    "access": "/home/{用户B}/{自定义的logFolder}/v2ray_access.log",
    "error": "/home/{用户B}/{自定义的logFolder}/v2ray_error.log"
  },
  "inbound": {
    "port": {自定义port},
    "listen":"127.0.0.1",
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "{自定义UUID,可找个网站生成}",
          "alterId": 0,
          "security": "auto"
        }
      ]
    },
    "streamSettings":{
      "network": "ws",
      "wsSettings": {
        "path": "/ws/"
      }
    }
  },
  "inboundDetour": [
  ],
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  }
}

随后,使用nginx(推荐)或Apache等软件架设一个网页,随后就可使用域名来访问网页了。对于nginx,建设相对简单,详情可参考这篇XRay配置文档第五章,这里仅简单记录相关命令。 当然这篇文档内部也有其他很有用的信息,可自行查阅。而Apache,则可参阅底下的“网盘相关”章节。

首先,安装nginx,安装完成后进入http://{服务器IP}:80即可检查是否成功

1
sudo apt update && sudo apt install nginx

之后,新建一个存放网页专属文件夹并新建一个index.html的placeholder(如果已有网站的话,也可直接把相关网站地址软链接过来,详情例子参考底下的博客相关章节)。nginx支持对配置文件进行修改把其网页目录放到低权用户B的管理下以提升安全 性(apache应该也可以,但我目前还不会)。因此,建议切换至低权用户B并将网页放至低权用户

1
2
3
4
cd {你想存放网页的目录}
mkdir www/webpages
cd www/webpages
#凭个人喜好,用vim还是nano等新建一个index.html

一个典型的placeholder网址如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<html lang="">
  <!-- Text between angle brackets is an HTML tag and is not displayed.
        Most tags, such as the HTML and /HTML tags that surround the contents of
        a page, come in pairs; some tags, like HR, for a horizontal rule, stand
        alone. Comments, such as the text you're reading, are not displayed when
        the Web page is shown. The information between the HEAD and /HEAD tags is
        not displayed. The information between the BODY and /BODY tags is displayed.-->
  <head>
    <title>Enter a title, displayed at the top of the window.</title>
  </head>
  <!-- The information between the BODY and /BODY tags is displayed.-->
  <body>
    <h1>Enter the main heading, usually the same as the title.</h1>
    <p>Be <b>bold</b> in stating your key points. Put them in a list:</p>
    <ul>
      <li>The first item in your list</li>
      <li>The second item; <i>italicize</i> key words</li>
    </ul>
    <p>Improve your image by including an image.</p>
    <p>
      <img src="https://i.imgur.com/SEBww.jpg" alt="A Great HTML Resource" />
    </p>
    <p>
      Add a link to your favorite
      <a href="https://www.dummies.com/">Web site</a>. Break up your page
      with a horizontal rule or two.
    </p>
    <hr />
    <p>
      Finally, link to <a href="page2.html">another page</a> in your own Web
      site.
    </p>
    <!-- And add a copyright notice.-->
    <p>&#169; Wiley Publishing, 2011</p>
  </body>
</html>

随后编辑nginx的控制文件/etc/nginx/nginx.conf,如果你现在还未有https证书,那么网址应该放到80端口下:

1
2
3
4
5
6
server {
  listen 80;
  server_name {二级域名}.{你的域名}.{域名后缀};
  root {存放网页文件夹绝对路径};
  index index.html;
}

如果你已经有https证书了,那么网址应该放到443端口下并让80端口转发至443:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
server {
  listen         80;
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl;
  server_name {二级域名}.{你的域名}.{域名后缀};
  root {存放网页文件夹绝对路径};
  index index.html;
  # https底下应该还有些ssl配置
}

完成后之后重启nginx,访问配置文件中书写的{二级域名}.{你的域名}.{域名后缀},应该就可以看到具体网页了

1
sudo systemctl reload nginx

有些情况网页会提示403 forbidden,这是由于nginx启动的用户无权访问此文件夹。这时候可以尝试直接将nginx的启动用户就改为用户B。编辑/etc/nginx/nginx.conf,寻找文件前面的user那行,将其改为用户B:

1
user {用户B};

在成功建站后,还需对其申请SSL证书。一般为通过设置计划任务不断申请Let’s encrypt的90天免费证书。主要的工具有acme.sh,certbot等。acme.sh使用可参照这篇XRay配置文档第六章。而certbot则更为简便,只需要使用snap或pip安装certbot后,即可一站式完成SSL证书申请。

如果使用snap

1
2
3
4
#使用snap场合
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot

如果使用pip

1
2
3
#使用pip情况,适用于不想安装snap或无法安装snap(如openvz服务器)的场合
sudo su
pip install certbot

随后,即可使用certbot --nginx(nginx场合),certbot --apache(apache场合)来安装证书。

对于nginx,当开启SSL后,由于我们将网页放至低权用户B,为防之后证书更新时出现问题,我们还需修改/etc/nginx/sites-enabled/default文件中这两行:

1
2
listen 80 default_server
listen [::]:80 default_server

在它们前面加上#来对它们进行注释,变为

1
2
#listen 80 default_server
#listen [::]:80 default_server

安装完成后,还需对它们的配置文件进行修改来让v2ray使用申请到的SSL证书。对于nginx,在/etc/nginx/nginx.conf文件中找到listen 443 ssl;行,在其后面添加这些行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#v2ray websocket
location /ws/ {
    proxy_redirect off;
    proxy_pass http://127.0.0.1:{自定义port};
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;

    # Show realip in v2ray access.log
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

对于Apache则需首先启用一些模块:

1
2
3
4
5
6
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_wstunnel
sudo a2enmod proxy_http
sudo a2enmod rewrite
sudo a2enmod headers

随后编辑/etc/apache2/sites-available/000-default-le-ssl.conf文件(如果不是的话去对应目录用grep找找哪个文件包含了<VirtualHost *:443>),并在<VirtualHost *:443>的一栏中加入以下内容:

1
2
3
4
5
6
7
8
#v2ray websocket,只需把{自定义port}换成你用的port
<LocationMatch "/ws/">
        ProxyPass ws://127.0.0.1:{自定义port}/ws/ upgrade=WebSocket               
        ProxyAddHeaders Off                                                
        ProxyPreserveHost On
        RequestHeader set Host %{HTTP_HOST}s                               
        RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s                  
</LocationMatch>

随后在客户端中进行相应改变,可直接参考上面的v2ray典型配置,也可参考此详细教程

无论任何配置,在配置完成后,可使用./v2ray -c server.json后使用客户端连接进行测试来检验配置是否成功。

配置无问题后,为了能让v2ray在后台一直启用。使用守护进程supervisor来维持其启动状态。首先安装supervisor

1
sudo apt install supervisor

然后通过编写/etc/supervisor/conf.d/v2ray.conf新建守护配置文件。在其中填写:

1
2
3
4
5
6
7
8
9
[program:v2ray]
command=/path/to/your/v2ray --config /path/to/your/server.json
autostart = true
autorestart=true
user={用户B}
startretries = 5
stdout_logfile = /home/{用户B}/{自定义的logFolder}/v2ray_access.log
stderr_logfile = /home/{用户B}/{自定义的logFolder}/v2ray_error.log
stdout_logfile_maxbytes = 25MB

然后使用supervisorctl update更新配置列表,使用supervisorctl start v2ray开启v2ray,使用supervisorctl stop v2ray关闭v2ray,使用supervisorctl restart v2ray重启v2ray

既然已经为了代理花钱买下服务器并进行了繁琐的网站架设配置,那么不进一步物尽其用将架设的网站利用起来显然是个资源浪费的选择。一般把网页利用起来的方式有架设个人博客,搭建个人网盘等。

博客相关

搭建个人博客的方式主要有使用付费的WordPress框架搭建,或使用免费的hugojekyllhexo托管软件来生成静态的网页。 本博客使用的是hugo。相关详细的安装流程可参照官网教程。以下只列出大致步骤。

首先,在服务器中安装hugo。由于ubuntu官方源中的hugo版本太低,因此选择使用github中的release包来安装。进入官方github发布地址,选择hugo_extended相关的ubuntu 安装deb文件,下载到服务器中并使用dpkg安装,这里仅以此文章写下时最新压缩包地址作为例子。

1
2
wget https://github.com/gohugoio/hugo/releases/download/v0.82.1/hugo_extended_0.82.1_Linux-64bit.deb
sudo dpkg -i hugo_extended_0.82.1_Linux-64bit.deb

安装后,可使用hugo version查看安装版本。

切换到低权限用户B,创建博客文件夹

1
hugo new site blog

创建git工作区并将主题以git submodle的方式附加到博客中。主题可在https://themes.gohugo.io/中选一个自己喜欢的安装,这里使用的主题是hugo-theme-stack

1
2
3
cd blog
git init
git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git themes/hugo-theme-stack

随后修改根目录中的config.toml应用主题,就可以使用了。当然hugo-theme-stack这个主题使用方式和其他主题不一样,稍微较复杂(漂亮的代价),它需要把原本的配置文件config.toml删除, 并把themes/hugo-theme-stack/exampleSite/中的相应文件复制到根目录来修改hugo的一些编译行为。

在配置完成后,使用hugo server即可查看网页是否正常。当然由于在服务器上的localServer所以没法直接看效果,只能用作测试一切正常。

使用hugo -D即可编译网页,编译后的网页存放在public目录。假设你的网页托管文件夹为/path/to/your/www/html,如果想让他出现在域名子目录,只需在网页托管文件夹中创建软链接将编译好的目录链接过去即可。

1
2
cd /path/to/your/www/html
ln -s /path/to/your/blog/public blog

随后,进入https://{你的域名}/blog,就可看到生成的网页了。

如果想让它直接出现在域名中,我们只需删除原来的nginx或apache托管的网页文件夹,然后创建一个一模一样的名称的软链接将编译好的网页文件夹链接过去即可。。

1
2
3
4
#删除原本默认生成的网页目录
rm -r /path/to/your/www/html
#将hugo编译生成的public目录软链接至托管目录
ln -s /path/to/your/blog/public /path/to/your/www/html

随后,进入https://{你的域名},就可看到生成的网页了。

网盘相关

个人网盘搭建主要使用的是NextCloud。当然市面上也有ownCloudseafile等产品,有兴趣可以自行查看。

前期环境准备工作:

为了方便,通过sudo su切换到root用户。安装Apache2,MariaDB和PHP:

1
apt-get install apache2 mariadb-server mariadb-client php libapache2-mod-php

安装完成后,进入http://{你的服务器IP}即可查看apache2是否安装成功。

MariaDB安装情况检查:mysql -V

PHP安装情况检查:php7.0 -v

启用Apache2 mod_rewrite模块:a2enmod rewrite

为NextCloud创建数据库。名为nextcloud,用户名为nextcloud,密码为{passwd}。请根据实际情况更改信息,尤其是密码。

1
sudo mysql -u root -p

在进入MariaDB后,执行:

1
2
3
4
5
6
7
#创建数据库,名为:nextcloud
CREATE DATABASE nextcloud;
#设置用户,所在服务器,密码
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY '{passwd}';
FLUSH PRIVILEGES;
#退出
\q

一切完成后重启服务:service apache2 restart。并再次进入http://{你的服务器IP}查看一切是否正常

安装NextCloud

NextCloud压缩包地址请参照其官网。进入"Download for server"后获得最新的压缩包。这里仅以此文章写下时最新压缩包地址作为例子。

1
2
3
4
5
6
cd /var/www/html
wget https://download.nextcloud.com/server/releases/nextcloud-21.0.1.zip
unzip nextcloud-21.0.1.zip
rm nextcloud-21.0.1.zip
chown www-data nextcloud -Rf
chmod 770 nextcloud -Rf

随后,进入http://{你的服务器IP}/nextcloud,应该就可以访问NextCloud了。在首次配置页面中创建管理员用户和密码,并在配置数据库一栏中填写之前创建的数据库名,用户名和密码。完成配置后就可以进入进行更详细的 模块配置和使用了。

其他可能设置

BBR

对于linux内核版本大于4.9的kvm服务器,可以开启BBR来加快传输速度。

检查内核

1
uname -r

更改配置

1
2
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

使配置生效

1
sysctl -p

检查BBR是否开启

1
2
sysctl net.ipv4.tcp_available_congestion_control
lsmod | grep bbr

检查这两条命令的输出是否含有bbr字样即可

让程序运行在小于1024的端口

通过setcap程序解决。对于ubuntu,命令如下,其他发行版类似。

1
2
apt-get install libcap2-bin
setcap ‘cap_net_bind_service=+ep’ /path/to/your/program
Built with Hugo
Theme Stack designed by Jimmy