迷人的小妖精--VPS折腾记

总算找到时间来调教VPS你这迷人的小妖精。本文以Ubuntu为基础逐渐深入与展开学习。从linux基本命令,linux操作,各种环境搭建,硬件信息,安全,各种应用,GIT服务器搭建,SS搭建逐渐展开。

linux

对于学习linux,这个在自己设计使用中遇到问题在解决,才能学到更多。Mooc网站上很多这方面的课程。值得学习。说道这些网站,就想到自己的计算机基础了。想办法抽时间完成计算机基础、数据结构和算法这些课程。对于偏向入门与某个技术点使用来说,慕课这些国内网站挺好;对于深入学习就得去coursera这类真正的MOOC网站了。

vps使用:ubuntu 14.04

https://help.ubuntu.com/ Ubuntu 官方文档与支持
https://help.ubuntu.com/lts/serverguide/git.html GIT服务器
http://www.ee.surrey.ac.uk/Teaching/Unix/ UNIX Tutorial for Beginners
http://linuxtools-rst.readthedocs.org/zh_CN/latest/ linux快速教程

VPS virtual private server

http://baike.baidu.com/item/VPS 百度百科提供了关于VPS的详细资料
virtualprivateserver 维基百科

VPS(Virtual Private Server 虚拟专用服务器)技术,将一部服务器分割成多个虚拟专享服务器的优质服务。实现VPS的技术分为容器[1] 技术,和虚拟化技术[2] 。在容器或虚拟机中,每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的隔离,为用户和应用程序模拟出“独占”使用计算资源的体验。VPS可以像独立服务器一样,重装操作系统,安装程序,单独重启服务器。VPS为使用者提供了管理配置的自由,可用于企业虚拟化,也可以用于IDC资源租用。

配置,指南,教程

首先来说是命令,但命令太多,最好是遇到问题再查手册文档。然后是连接服务器,自然是SSH。再然后是自身的模块和第三方应用。

命令

http://man.linuxde.net/ 命令大全
http://explainshell.com/ 命令详细解释
http://www.runoob.com/linux/linux-tutorial.html

SSH:

那么什么是SSH呢?通过wiki:Secure_Shell

简单的讲:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。通常用来连接远程机器和执行命令,也支持 tunneling、forwarding TCP ports 和 X11 连接;也可以通过与其相关的sftpscp协议来传输文件.

## SSH协议框架中最主要的部分是三个协议:

  • 传输层协议(The Transport Layer Protocol):传输层协议提供服务器认证,数据机密性,信息完整性等的支持。
  • 用户认证协议(The User Authentication Protocol):用户认证协议为服务器提供客户端的身份鉴别。
  • 连接协议(The Connection Protocol):连接协议将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用。

## 安全验证:

  • 第一种级别(基于密码的安全验证),知道帐号和密码,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。也可能被暴力破解。
  • 第二种级别(基于密钥的安全验证),需要依靠密钥,也就是你必须为自己创建一对密钥,并把公有密钥放在需要访问的服务器上。客户端软件会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公有密钥,然后把它和你发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有密钥加密“质询”(challenge)并把它发送给客户端软件。从而避免被“中间人”攻击。

## 工作流程:

为了实现 SSH的安全连接,服务器端与客户端会经历几个阶段,这里就不对每个阶段细讲:

  • 版本号协商阶段,SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本
  • 密钥和算法协商阶段,SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法
  • 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证
  • 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
  • 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互

SSH keys

1: 生成:

  • ssh-keygen 命令
  • puttygen 等一些工具

对于windows,推荐CMDER命令行神器完成操作,也就不用使用putty这类工具了。若已经安装有git,那么肯定也已经有SSH key了,也可以直接使用,因此也可以使用git bash完成下面的命令的执行。

对于windows,生成的key 在 C:\Users\yourName\.ssh 下:默认为id_rsa密钥, id_rsa.pub公钥

2: 将公钥复制到远程服务器:

第一种方法:

$ scp ~/.ssh/id_ecdsa.pub username@remote-server.org:    //使用scp命令传输公钥到服务器
$ ssh username@ip
username@ip's password:  
$ mkdir ~/.ssh
$ cat ~/id_ecdsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_ecdsa.pub
$ chmod 600 ~/.ssh/authorized_keys  //设置权限

第二种方法:

ssh-copy-id username@ip  

即ssh-copy-id命令

SSH 安全&配置

sshconfig和sshdconfig都是ssh服务器的配置文件,二者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。两个配置文件都允许你通过设置不同的选项来改变客户端程序的运行方式。

编辑SSH配置文件

nano /etc/ssh/sshd_config  
  1. 禁止root用户远程登录
    root是linux里的最高统帅了,一个最基本的建议就是:平时登陆和工作的时候都使用普通用户进行操作.另外因为root用户是每个linux系统里都内置的,恶意的黑客可能会拿它做用户名然后尝试用不同的密码登陆密码. 在sshd_config中修改如下就可以了: PermitRootLogin no
// 添加用户,并且加入sudo组
adduser user  
gpasswd -a user sudo  
  1. 禁止空密码登陆
    再有就是空密码.一般来说linux系统都会内置很多帐号,而这些用户的密码我们是不知道的.谁知道哪天哪个linux的发行版,对其中的帐号设置空密码或者指定的密码呢?所以还是禁止为妙,省得夜长梦多. 在sshd_config这样修改: PermitEmptyPasswords no

  2. 使用非默认端口,非22端口
    服务器被盯上,随机的用软件扫了一个ip段,而你的ip正好在里面.而人家的扫描规则就是:是否开启22端口.修改默认端口,打开sshd_config文件,修改成: Port 300031025到65536之间的任意一个整数, 再打开/var/log/secure,查看日志。

  3. 限制ssh监听的ip
    在服务器有多个ip的时候.设置ssh服务器只监听在指定的ip,在sshd_config中修改如下: ListenAddress 192.168.1.5 如上的写法,是ssh服务器只监听192.168.1.5这个ip.

  4. 使用的协议版本2: ssh v2
    ssh协议有两个版本.肯定v2要比v1安全高效的多了.ssh服务器默认会接受两种协议的连接.为了保证服务器的安全,定义服务器只使用v2: 在sshd_config中修改如下:Protocol 2

  5. 禁用密码登陆,推荐使用密钥登录,并且私钥使用强密码加密
    只用ssh。ssh服务器不单支持密码认证,还支持通过key的认证方式,而且是默认的. 在sshd_config中修改如下: PasswordAuthentication no

  6. 限制连接IP,仅保证有限的机器能够远程访问
    杀手锏:限制ssh服务连接的ip 在/etc/hosts.allow输入
    sshd:192.168.1.5:allow(其中192.168.1.5是你要允许登陆ssh的ip,或者是一个网段192.168.1.0/24)
    /etc/hosts.deny输入 sshd:ALL(表示除了hosts.allow中允许的,其他的ip拒绝登陆ssh)

  7. 日志
    记录好日志,经常做日志分析。 用户登录成功日志: /var/log/wtmp , 使用 # last 命令查看 用户登录失败日志: /var/log/btmp , 使用 # lastb 命令查看 查看所有用户上次登录情况: 使用 #lastlog [-u User]

  8. denyhosts 是 Python 语言写的一个程序,它会分析 sshd 的日志文件,当发现重复的失败登录时就会记录 IP 到 /etc/hosts.deny 文件,从而达到自动屏 IP 的功能。这和我之前介绍的 自动屏蔽扫描的脚本 是一个思路。但是我安装时出现不可用,通过这里 http://askubuntu.com/questions/592394/e-unable-to-locate-package-denyhosts 得到目前就是这玩意不可用了,最好用IPTABLES或者 fail2ban

问题

一般修改后,通过下面的命令来重启SSH使得上面的配置生效。

sudo /etc/init.d/ssh restart  

但是,我运行后并没有生效,原因还没找到,但是通过下面命令使得重启生效。可能是ubuntu的原因吧。

service ssh reload  
//  通过查看端口,看自己的配置是否生效。
sudo netstat   -anp   |   grep sshd  
其它

## 快捷登录

在本机~/.ssh文件夹下创建config文件(无后缀名),内容如下。

Host me  
HostName 128.199.209.242   // 远程主机IP  
User yourName   // 你的ssh用户名  
Port 25000      // 设置的端口  
PreferredAuthentications publickey  // 指明验证方式  
IdentityFile ~/.ssh/id_rsa  

那么下次连接就:

ssh me  

方便快捷多了。

## Banner 警示条

Banner /etc/issue.net 现在,/etc/ssh/sshd_config中的警示条已经被激活。您可以使用下列的流程创建警句条的实际实际内容。在这里我们给出了一个例子:

使用sudo启动你喜欢的文本编辑软件,创建文件/etc/issue,并把下面的文字拷入此文件作为警示条的内容:

***************************************************************************
NOTICE TO USERS  
This computer system is the private property of its owner, whether  
individual, corporate or government. It is for authorized use only.  
Users (authorized or unauthorized) have no explicit or implicit  
expectation of privacy.  
....
****************************************************************************

保存文件,并且使用下列命令创建一个到 /etc/issue.net的符号连结: sudo ln -s /etc/issue /etc/issue.net 重新启动sshd后,任何用户想要登陆时都会在登陆提示符前看到上面的信息。

## hosts.allow hosts.deny

关于修改这两个文件: 有一系列规则:

关于修改后的生效问题: 搜索到的国内网站绝对有:service xinetd restart重启来使之生效。国内的这些采集站真TM烦。恶心至极。 而其实这俩个文件的修改是立即生效的。

重启下网络服务
# /etc/rc.d/init.d/network restart

要检查是否生效了,查看服务器日志就知道了。

参考:

参考链接

了解每个SSH文件,原理

更多详细内容就看参考链接:

参考:

防火墙

设置防火墙:iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端 和 图形界面 配置。iptables 用于 ipv4,ip6tables 用于 ipv6。

iptables 需要很多配置,和设置规则

参考:

文件传输

  • FTP
  • SFTP
  • RCP
  • scp
  • wget
  • curl
  • rsync

## 几种方法比较与总结:

  • 传输性能 wget 通过支持后台执行及断点续传提高文件传输效率 ; rsync 则以其高效的传输及压缩算法达到快传输的目的。
  • 配置难度 rcp 只需进行简单的配置,创建 .rhost 文件以及设置 /etc/hosts 文件中主机名与 IP 地址列表; wget 设置设置方便简单,只需在客户端指定参数执行命令即可; rsync 在使用前需要对服务端 /etc/rsyncd.conf 进行参数设定,配置内容相对复杂。
  • 安全性能 ftp、rcp 不保证传输的安全性,scp、rsync 则均可基于 ssh 认证进行传输,提供了较强的安全保障。 wget 也可通过指定安全协议做到安全传输。
    通过上述的对比不难发现,每种文件传输方法基于其自身的特点与优势均有其典型的适用场景:
  • ftp 作为最常用的入门式的文件传输方法,使用简单,易于理解,并且可以实现脚本自动化;
  • rcp 相对于 ftp 可以保留文件属性并可递归的拷贝子目录;
  • scp 利用 ssh 传输数据,并使用与 ssh 相同的认证模式,相对于 rcp 提供更强的安全保障;
  • wget,实现递归下载,可跟踪 HTML 页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构,适合实现远程网站的镜像;
  • curl 则适合用来进行自动的文件传输或操作序列,是一个很好的模拟用户在网页浏览器上的行为的工具;
  • rsync 更适用于大数据量的每日同步,拷贝的速度很快,相对 wget 来说速度快且安全高效。

## 可能会遇到的问题:

scp命令:

-1:使用ssh协议版本1; 
-2:使用ssh协议版本2; 
-4:使用ipv4; 
-6:使用ipv6; 
-B:以批处理模式运行; 
-C:使用压缩; 
-F:指定ssh配置文件; 
-l:指定宽带限制; 
-o:指定使用的ssh选项; 
-P:指定远程主机的端口号; 
-p:保留文件的最后修改时间,最后访问时间和权限模式; 
-q:不显示复制进度; 
-r:以递归方式复制。

使用scp命令时,普通用户会遇到Permission denied 问题,由于我们禁用了root的登录,就得靠其他解决办法:

  1. 修改文件夹权限: 可以直接chmod 777 files,但是参照用户所需权限,按需修改权限最好
  2. 使用tmp: /tmp先传输到tmp文件夹,在移动文件到指定位置
scp text.txt user:/tmp  
sudo mv或者cp.  

scp不能断点续传

另外window下客户端工具:winscp 支持SFTP 、FTP、 SCP 但是winscp 仅支持puttygen生成的key

## 关于SFTP:

SFTP ,即 SSH 文件传输协议( SSH File Transfer Protocol ),或者说是安全文件传输协议( Secure File Transfer Protocol )。SFTP 是一个独立的 SSH 封装协议包,通过安全连接以相似的方式工作。它的优势在于可以利用安全的连接传输文件,还能遍历本地和远程系统上的文件系统。

参考:

linux权限

在上面讲的文件传输,可能会出现一些问题,很多就是权限设置的问题。

在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。

## ls -l 查看权限:

test@test:/test$ ls -l  
-rw-r--r--  1 test test   4264 Feb 18 19:17 config.example.js

用户分为:拥有者、组群(Group)、其他(other)

## -rw-r--r--

  • 最前面那个 - 代表的是类型,d是目录文件,l是链接文件,-是普通文件,p是管道;
  • 中间那三个 rw- 代表的是所有者(user)拥有的权限, - 表示相应的权限还没有被授予
  • 然后那三个 r-- 代表的是组群(group)拥有的权限
  • 最后那三个 r-- 代表的是其他人(other)拥有的权限

## chmod : 改变文件读、写、执行等属性

权限范围的表示法如下:

  • u User,即文件或目录的拥有者;
  • g Group,即文件或目录的所属群组;
  • o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
  • a All,即全部的用户,包含拥有者,所属群组以及其他用户;
  • r 读取权限,数字代号为“4”;
  • w 写入权限,数字代号为“2”;
  • x 执行或切换权限,数字代号为“1”;
  • - 不具任何权限,数字代号为“0”;
  • s 特殊功能说明:变更文件或目录的权限。

参数:

  • -c或——changes:效果类似“-v”参数,但仅回报更改的部分
  • -f或--quiet或——silent:不显示错误信息;
  • -R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
  • -v或——verbose:显示指令执行过程;
  • --reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
  • <权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置;
  • <权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置;
  • <权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置;

示例:

将file1设置为所有人可读

chmod ugo+r file1  
或
chmod a+r file1  
或
chmod a+4 file1  

将file1设置为所有人可读写执行

chmod a=rwx file  
或
chmod 777 file  

将file1设置为所有者及同组用户可读写,其它用户可读写

chmod ug=rw,o=r file  
或
chmod 664 file  

对于数字表示:把rwx看成二进制数,如果有则有1表示,没有则有0表示,那么rwx r-x r--则可以表示成为:111 101 100再将其每三位转换成为一个十进制数,就是754

## chown : 改变某个文件或目录的所有者和所属的组

http://man.linuxde.net/chown

## gpasswd命令是Linux下工作组文件/etc/group和/etc/gshadow管理工具。

添加用户到组; 从组删除用户;指定组管理员; http://man.linuxde.net/gpasswd

参考:

HTTPS支持与HTTP2:

Let's Encrypt是最近很火的一个免费SSL证书发行项目

我的ghost在DO,所以完全参考DO的教程。只有一个要变的地方:配置nginx(nginx也是一大块内容):

sudo nano /etc/nginx/sites-available/default // 不是修改这个  
nano /etc/nginx/sites-available/ghost  // 而是修改这个  

要注意的是启用HTTPS后,只保留443端口开放,那么全站都要启用HTTPS,包括引用的脚本、图片。所有有点尴尬,都不能用图片外链了,还有其他的一些东西。但是可以配置nginx同时支持http和HTTPS,我发现一些大网站如jsbin也是同时支持的,不做强制调转。但目前我只好配置我的七牛支持HTTPS了。

HTTPS

HTTPS,也被称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通讯,但利用SSL/TLS来对数据包进行加密。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。

我的网站blog./lwxyfer.com评分:

wiki: https://en.wikipedia.org/wiki/HTTPS

SSL/TLS

SSL/TLS协议提供的服务主要有:

  • 认证用户和服务器,确保数据发送到正确的客户机和服务器;
  • 加密数据以防止数据中途被窃取;
  • 维护数据的完整性,确保数据在传输过程中不被改变。

通信建立:

针对TLS/SSL已有很多文章,所以不做的介绍,内容都在参考链接。

参考:

证书工作流程:

简单的介绍:

SS 科学上网

部署SS实现科学上网: https://blog.lwxyfer.com/shadowsocks/

nginx

WIKI:https://zh.wikipedia.org/wiki/Nginx

nginx东西太多了,至于教程,那么淘宝的这个绝对就很好啦:http://tengine.taobao.org/book/chapter_02.html

性能优化:infQ

监控

自己搭建监控服务实属没必要。第三方就很好:oneAPM、监控宝等等。

名词

张三李四,相互认识认识。太多专业名词了,需要逐渐认识和学习。

Openstack

https://zh.wikipedia.org/wiki/OpenStack wiki
https://en.wikipedia.org/wiki/OpenStack
http://baike.baidu.com/item/OpenStack 百度百科讲的很清楚嘛

OpenStack is a free and open-source software platform for cloud computing, mostly deployed as an infrastructure-as-a-service (IaaS). The software platform consists of interrelated components that control hardware pools of processing, storage, and networking resources throughout a data center. Users either manage it through a web-based dashboard, through command-line tools, or through a RESTful API.

OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。
OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。OpenStack因Open而开放,因组件而灵活,因包容而博大。有计算、网络、对象存储、块存储、身份、镜像服务、门户、测量、部署编排、数据库服务等等组件,有的组件可以根据需要选择安装,组网结构也很灵活、多样。实现了支持接入多种主流虚拟机软件:KVM、LXC、QEMU、Hyper-V、VMware、XenServer,也可以自行开发插件接入其他的虚拟化软件。

简单了解即可,不做深入。

参考: https://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-network/ Openstack网络

云计算

http://www.ibm.com/cloud-computing/cn/zh/what-is-cloud-computing.html IBM商用服务的简介

对于其详细的定义就是没有,一个范畴就是提供付费的服务。

互联网上的云计算服务特征和自然界的云、水循环具有一定的相似性,因此,云是一个相当贴切的比喻。根据美国国家标准和技术研究院的定义,云计算服务应该具备以下几条特征:

  • 随需应变自助服务。
  • 随时随地用任何网络设备访问。
  • 多人共享资源池。
  • 快速重新部署灵活度。
  • 可被监控与量测的服务。

美国国家标准与技术研究院(NIST)定义:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。

参考:

http://baike.baidu.com/view/1316082.htm
https://zh.wikipedia.org/wiki/%E9%9B%B2%E7%AB%AF%E9%81%8B%E7%AE%97

floating ip

A DigitalOcean Floating IP is a publicly-accessible static IP address that can be assigned to one of your Droplets. A Floating IP can also be instantly remapped, via the DigitalOcean Control Panel or API, to one of your other Droplets in the same datacenter. This instant remapping capability grants you the ability to design and create High Availability (HA) server infrastructures—setups that do not have a single point of failure—by adding redundancy to the entry point, or gateway, to your servers. Achieving a complete HA setup also requires redundancy at every layer of your infrastructure, such as your application and database servers, which is often difficult to implement but can prove to be invaluable for reducing downtime and maintaining a happy user base.

https://www.digitalocean.com/community/tutorials/how-to-use-floating-ips-on-digitalocean
digitalocean官方的对于FP的介绍与详细配置

一张图片做简单的介绍:

A Basic High Availability server

VM

https://en.wikipedia.org/wiki/Virtual_machine 嗯,就是虚拟机啦。

虚拟化技术

深入就是谈论虚拟化技术,虚拟化的实现。

虚拟化技术的分类 虚拟化技术主要分为以下几个大类 [1]:

  • 平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化。
  • 资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。
  • 应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。

我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor 或 Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。

linux 平台下常见的虚拟化技术

  • Openvz介绍
  • Xen 虚拟化技术介绍
  • KVM虚拟化技术介绍
  • VMware

windows平台下常见的虚拟化技术

  • Hyper-V
  • VMware

参考:

反向代理-Reverse Proxy

在计算机网络中,反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器上获取资源,然后再将这些资源返回给客户端。

反向代理的主要作用为:

  • 加密和SSL加速
  • 负载均衡
  • 缓存静态内容
  • 压缩
  • 减速上传
  • 安全
  • 外网发布

正向代理

与反向代理相对。正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理服务器向原始服务器转发请求并将获得的内容返回给客户端。

参考