自建 机场教程 小白版【小小白白话文】
1.1 这篇文档是写给谁的?一句话:写给 ① 零基础 ② 希望学习自建 VPS 的新人。
1.2 这篇文档不是写给谁的?
包括但不限于:各路大神大能、懒得自己折腾的小白、已经会折腾的高手、确定要用机场的土豪、确定要用一键脚本的逍遥派...... 总之只要有技术基础、或不愿不想自建的同学,您直接关闭本文即可,因为这篇文章大概是入不了您的法眼的,更可能会让您生一肚子闲气,那多划不来。
1.3 郑重声明及其他声明
郑重声明:
鄙人技术奇菜无比,故本文必然挂一漏万破绽百出。您若发现问题还请温柔提醒,莫要人参公鸡。
免责声明:
本文内容请您自行判断是否可信可靠可用,若您根据本文内容建立和使用 VPS 服务器时出了任何问题和不良结果,鄙人概不负责。
啰嗦声明:
基于本文【零基础用户】的目标受众,许多内容会尽力详尽说明,所以语言偏啰嗦,请做好心理准备。
1.4 为什么自建是个难题?
要回答这个问题,就需要稍微多说一点背景信息了。
一、科学上网这件事
科学上网这件事情,说来已经发展了近二十年(震惊!!!.jpg)。最初,自己稍微动动手即可(改改 host、连一下 ssh)、后来需要找一个网页代理,再后来需要写一个私有协议(比如 Shadowsocks)等等。
随着 GFW 技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于:
了解 Linux 系统基本命令
了解网络传输协议
有技术和经济能力完成 VPS 购买及管理
有技术和经济能力完成域名购买及管理
有技术能力完成 TLS 证书申请 等等。
这就让【自建 VPS 科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。
二、零基础用户的无奈
零基础的非技术用户,如果完成上面这一连串的操作,势必要学习大量的知识,但稍微搜索之后,新人只怕会更加迷茫:大量的信息散布在互联网的各个角落:博客、问答网站、群组、论坛、GitHub、Telegram、YouTube 等等等等)。这些信息纷乱复杂、水平良莠不齐、甚至可能互相矛盾。基本上就是不把新人彻底弄晕誓不罢休。
面对这些杂乱无章的信息,新人突然就从【信息匮乏】变成了【信息过剩】。若是几番连蒙带猜的折腾以失败告终(大概率如此)的话,他的积极性势必大受挫折。在这个过程中,若他又恰好去了一些不太友好的地方去求助,恐怕还要雪上加霜的被嘲讽一番:“这么菜,用机场不就行了,瞎折腾什么啊!”、“先去学会 Linux 再回来问吧”。
这时候,大概也只有一声“呵呵”可以表达心情了。
1.5 “用机场不就行了?”
首先,我想反问一下那些冷嘲热讽的人:“用机场”真的就是万灵药吗?
其次,我认为“不懂”和“不想懂”是有本质区别的。态度恶劣的巨婴伸手党自然惹人厌烦,但真心自学却不得要领的人不该受到无端的白眼和歧视,也正是这种对新人不加区分的恶劣社区氛围促使我写下本文。那么闲话少说,我们来看看机场的优势与劣势究竟如何:
一、“机场“的优势
所谓“机场”,就是“线路提供商”。他负责完成 1.4 提到的那一串技术操作和管理,用户则付费获得使用权。所以,它的优点至少有:
用户操作简单:扫码操作、一键添加规则等
线路选择多:可解锁不同国家、地区的网络服务;比如 iplc 等专线服务、游戏加速服务等
接入节点多:所以抵抗节点封锁的能力强一些,封了一个就换下一个
二、“机场”的风险
“方便”这枚硬币的另一面就是“风险”,基于“机场”的技术特点和市场情况,它的风险至少有:
“机场”可完全获得用户信息:用户在网上的所有痕迹,都【必然】经过且【非常可能】长期存储在其服务器上,这些记录无法受到任何具备法律效力的用户隐私协议的约束(窥视、记录你的一举一动)
“机场”缺乏市场管理:不可避免存在着以欺诈为目标的恶意商家(主动跑路)
“机场”面临监管压力:大机场相对有保障的同时,也无法避免树大招风。2020 年间,已经有几个大机场停运、跑路的事件发生,用户的正常使用受到严重干扰(被动跑路)
“机场”技术水平难以确定:线路质量良莠不齐,挂羊头卖狗肉的现象屡见不鲜(速度慢、掉线多、连不上)
1.6 那么你到底要不要自建呢?
现在,你已经看到了机场的优势和风险,要用什么,就请各位充分思考并自行决定。毕竟,最适合你的方案才是最好的方案。
如果决定使用机场的话,现在,你可以关闭本文了。
如果你决定自建,那就请继续阅读后面的章节吧!!
总之,本文的目标就是成为零基础用户的知识起点,提供对每一步充分的讲解和演示,清清楚楚(甚至婆婆妈妈、絮絮叨叨、啰啰嗦嗦)的协助新人完成【从输入第一条命令开始,完成 VPS 服务器部署,并成功在客户端完成科学上网】的全程。并在这个过程中帮助新人逐步接触和熟悉 Linux 的基础操作,为之后的进一步自学打下基础。
1.7 题外啰嗦几句
墙外的信息泥沙俱下,请务必学会理性、独立的思辨,不要随意站队,不要轻信猎奇的信息。
衷心希望大家获得更顺畅的网络后,可以获取更新鲜的知识、更丰富的娱乐、接触更美好的世界、结交更多志同道合的朋友,但不要成为任何有不可告人目的之人的替罪羊。
你的互联网身份依然是你的身份,绝对的匿名化是极为困难的,所以请务必遵守你个人所在地区和 IP 所在地区的相关法律法规。无论何时,自我保护都是最基本的底线。
1.8 你的进度
⬛⬜⬜⬜⬜⬜⬜⬜ 12.5%
【第 2 章】原料准备篇
这一章比较特殊,因为涉及到金钱交易行为,本文基于项目的中立立场,不做具体的推荐。我能做的,是告诉你需要准备哪些东西。2.1 获取一台 VPS你需要获取一台健康的、IP 没有被墙的 VPS,并在管理后台做下面这些基础准备:
[*]在 VPS 的后台安装 Debian 10 64bit 系统
[*]小本本记下 VPS 的 IP 地址(本文会用 "100.200.300.400" 来表示)提示这是一个故意写错的非法 IP,请替换成你的真实 IP)
[*]小本本记下 VPS 的 SSH 远程登陆端口(Port)
[*]小本本记下 SSH 远程登录的用户名和密码
购买 VPS 是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。说明关于选择 Debian 10 作为操作系统,这里稍微多说一句:不管你在网上听说了什么,不管哪个大神告诉你 XXX 版的 Linux 更好、XXX 版的 Linux 更牛,这些 Linux 的派系之争跟现在的你半毛钱关系也没有!使用 Debian 10 足以让你的 VPS 服务器在安全、稳健运行的同时得到足够的优化(如 cloud 专用内核、及时的 bbr 支持等)。等你对 Linux 熟悉之后,再回头去尝试其他的 Linux 发行版也不迟。
2.2 获取一个心仪的域名你需要获取一个域名、并在 DNS 设置中添加一条 A 记录,指向你 VPS 的 IP 地址
[*]请选择靠谱的国际域名服务商。选择一些常见的域名后缀就行,注意不要用 .cn 后缀。
[*]在 DNS 设置中,添加一条指向你 VPS 的 IP 地址的 A 记录(A 记录的名字可以随便起,本文会用 "a-name" 来表示。完整的域名则会用 "二级域名.你的域名.com" 或者 "a-name.yourdomain.com" 来表示)。效果如下图:
https://xtls.github.io/assets/ch02-img01-a-name-YcPasChp.png提示这不是一个真实可用的网址,请替换成你的真实网址
2.3 你本地电脑上需要安装的软件
[*]SSH 远程登录工具
[*]Windows: PuTTYopen in new tag
[*]macOS/Linux: Terminal
[*]远程文件拷贝工具
[*]Windows: WinSCPopen in new tag
[*]macOS/Linux: Terminal
[*]靠谱的文本编辑器
[*]Windows/macOS/Linux: VSCodeopen in new tag
2.4 你的进度如果上面的原材料你都准备好了的话,你已经拿到了开启新世界大门的钥匙。那还等什么,让我们快点进入下一章,走进这扇门吧!⬛⬛⬜⬜⬜⬜⬜⬜ 25%
【第 3 章】远程登录篇3.1 远程登录 VPS (PuTTY)
首先,鉴于零基础人群中 Windows 的用户基数最大,所以本文以 Windows 为例进行展示。其次,虽然 Windows 10 之后的 PowerShell 和 WSL 也可以达到很好的 SSH 操作体验。但是因为并非所有版本的 Windows 都有最新的组件,故本文还是以老牌的 PuTTY 为例,进行 SSH 远程登录的操作详解。(使用其他工具的话、在 SSH 登陆之后的操作都是一样的)下面就跟我一步步操作吧。
[*]进入 PuTTY 的官网open in new tag,选择适合你操作系统的版本下载。(本文以 64 位版本为例)https://xtls.github.io/assets/ch03-img01-putty-download-gVwywNaM.png
[*]安装运行后,将会看到 PuTTY 的主界面。现在请拿出你上一章记东西的小本本,在下图的对应位置填入你 VPS 的IP 地址(VPS IP)和端口(VPS PORT)。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions),未来使用时只要按 Load 即可一键载入设置。https://xtls.github.io/assets/ch03-img02-putty-settings-9F25dGfD.png
[*]我建议将 Connection 中的 keepalive 设置为 60 秒,防止你一段时间没有操作之后 SSH 自动断线。另外务必再次保存设置。https://xtls.github.io/assets/ch03-img03-putty-keepalive-dggTHgup.png
注意对 PuTTY 的任何设置更新都要再次手动保存 Session,不然关闭后就会丢失
[*]点击 Open 就会进入 SSH 连接窗口,对应下图输入用户名与密码,与你的 VPS 远程主机建立连接。(本文假设默认用户名是 root,另外,在 Linux 系统输入密码的时候,是不会出现 ****** 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!)https://xtls.github.io/assets/ch03-img04-ssh-login-8MrxOwy-.png
3.2 成功登录 SSH!初识命令行界面!
[*]如果你的信息都填写正确,你将会看到类似下图的界面,说明已登录成功:https://xtls.github.io/assets/ch03-img05-ssh-login-success-bpTQqXTk.png这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【命令行界面】- Command Line Interface,或者缩写为 CLI。接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,你说一句,它做一句。
[*]现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 4.19.37-5)、上次登录时间及 IP 等。当然根据 VPS 的不同,你看到的界面可能会略有不同。
[*]请注意命令行最下面一行,闪动的光标左边,有一串字符。图中显示的是root@vps-server:~#,这一串要怎么理解呢?很简单:
[*]现在的用户是 root
[*]root 所在的服务器是 vps-server
[*]root 现在所在的文件夹是 ~
[*]# 之后是你可以输入命令的地方
前两个很直观,无需多说。第三个是关于 Linux 的文件夹系统,现在也不需要过于深入,你只需要知道,"~"就是【当前用户的大本营】。第四个,提示符#,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "#" 或者 "$" 开头,提示你后面是你输入命令的地方。(所以你复制命令的时候,只需要复制后面的内容,不要复制提示符)
3.3 第一次更新 Linux 的软件!
[*]正如你的手机,无论安卓还是 iPhone,为了 APP 及时更新(获取安全补丁和新功能),都会时不时从应用商店获得更新信息,并且提示你有多少个 APP 可更新。Linux 系统也有逻辑十分类似的更新机制。所以只要你会更新手机 APP,就能学会更新 Linux 软件!
[*]Linux 下,每个 APP 都叫做一个“包” (package)。管理 APP 的程序自然就叫做“包管理器”(Package Manager)。你可以通过它安装、更新、卸载各种软件、甚至更新 Linux 系统本身。Linux 下的包管理器非常强大,此处按下不表,现在你只需要知道 Debian 系统的包管理器叫做 apt 即可。接下来,我们就先使用 apt 做一次软件的全面更新,让你熟悉它的基本操作。
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-01apt update查询软件更新
cmd-02apt upgrade执行软件更新
[*]现在请输入第一条命令,获取更新信息apt update
[*]然后请输入第二条命令,并在询问是否继续安装 (Y/n) 时输入 y 并回车确认,开始安装apt upgrade
[*]完整流程演示如下:https://xtls.github.io/assets/ch03-img06-apt-upgrade-full-PsNwQRq8.gif
3.4 你的进度恭喜你又迈出了坚实的一步! 现在,你已经可以通过 SSH 来登录你的远程服务器了!那登录进去之后,除了升级软件之外,应该再做点什么呢?敬请进入下一章一探究竟吧!⬛⬛⬛⬜⬜⬜⬜⬜ 37.5%
【第 4 章】安全防护篇4.1 为什么要做安全防护
Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在 Linux 的基石之上,这背后牵涉到巨大的经济利益和商业价值,当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力,这才让大家能享受到基本稳定的现代化数字生活。现在,你拥有了一台 VPS,并且将会敞开他的数据访问渠道来达到流量转发的目标,那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时,新人由于知识和信息的不足,看待安全问题是总是难免两极分化:要么觉得轻如鸿毛和自己没有半点关系,要么觉得重于泰山甚至惶惶不可终日。
[*]对于前者,我的建议是:安全无小事,尽量多查一些安全方面的信息,免得自己真的受了损失才后悔莫及
[*]对于后者,我的建议是:不用紧张,我们的服务器仍不具有太高的价值、一般不会吸引到高水平的攻击,需要面对的基本都是一些自动化脚本的恶意扫描和登录尝试,跟着本文做一些基础的防护即可
4.2 具体的风险到底是什么就像我们在《远程登录篇》配置的一样,任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的 VPS 服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
[*]【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏
[*]【端口】:如果使用默认端口,那么【端口 = 22】
[*]【用户名】:如果使用默认用户,那么【用户名 = root】
[*]【密码】:密码不存在默认值,一定是由 VPS 后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:
[*]如果你用了 VPS 管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全
[*]如果你为了好记、把密码改成了类似123456这种超弱的密码,破解你的 VPS 服务器可谓不费吹灰之力
[*]如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说密码表,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)
[*]但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 root 控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意 VPS 的登录记录、进程变化、CPU 占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的 VPS 服务商封禁你的账号、或者收到律师函为止。
[*]别忘了,你获得 VPS 时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,一旦这些坏事发生,它们就不可避免的与你产生了关联。
4.3 我们要做的安全防护有哪些基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险:
[*]【端口】:将 SSH 远程登录端口修改为【非 22 端口】 (4.4)
[*]【用户名】:建立【非 root】的新用户、并禁用 root 用户 SSH 远程登录 (4.5、4.6)
[*]【密码】:SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录 (4.7)
记得按顺序来,别把自己锁在门外了。4.4 将 SSH 远程登录端口修改为非 22 端口现在,我们来解决【端口 = 22】的问题。(注意:有些 VPS 服务商,默认的端口已经是非 22 端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-03nano文本编辑器
cmd-04systemctl restart重启某个服务
[*]小小白白 Linux 基础配置文件
编号配置文件位置文件说明
conf-01/etc/ssh/sshd_configSSH 远程登录程序设置
[*]我们要做的第一件事,当然就是【用nano这个文本编辑器打开SSH远程登录程序设置】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:nano /etc/ssh/sshd_config
[*]文件打开后,你就进入了nano的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢?https://xtls.github.io/assets/ch04-img01-nano-ui-Oo4HU2KZ.png
[*]我们要做的第二件事,是【在打开的文件中找到Port这一项,并修改它的端口】。Port 后面的数字就是 SSH 的端口,一般建议把它改成一个大于1024小于65535的整数(本文以9753为例)。请结合nano的快捷键,想一下该怎么操作呢?果然,你又说对了!就是:
[*]使用 ctrl+w 进入搜索模式,然后输入 Port 22 并回车
[*]删除 22 并改成 9753
[*]说明:如果这一行开头有个#,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带#的,或者把#删掉就好。
注意本文以9753为例,就意味着随着本文的发布,这个端口会变成一个不大不小的特征,也许会被攻击者优先尝试、也许被 GFW 干扰、阻断。所以我强烈建议你用一个自己想到的其他端口,毕竟,你有 6 万多个端口可以自由选择。
[*]我们要做的第三件事,是【保存文件并退出】
[*]如果第 3 步你有仔细观察,就会发现保存并不是常见的 ctrl+s。
[*]正确的快捷键:保存是 ctrl+o + 回车,退出是 ctrl+x
[*]我们最后要做的事,是【重启 ssh 服务,使变更生效】systemctl restart ssh
[*]完整流程演示如下:https://xtls.github.io/assets/ch04-img02-sshd-conf-full-7_JFMwvi.gif
[*]修改 PuTTY 配置现在新的端口已经生效,下次使用 PuTTY 登录时就要用9753了。所以现在请到 PuTTY 的设置中修改端口号码,然后保存 Session。嗯,你应该知道去哪里改了吧?(如果不知道的话,要重读前面的内容了哦!)
4.5 建立非 root 的新用户第二步,我们来解决【用户名 = root】的问题。首先你要理解, Linux 系统中的root,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦root账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-05adduser给系统新增用户
cmd-06apt install安装某个软件
cmd-07visudo修改 sudo 权限设置专用编辑器
[*]我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以vpsadmin为例:adduser vpsadmin
执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 ****** 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。https://xtls.github.io/assets/ch04-img03-adduser-opG_7XzM.png注意本文以vpsadmin为例,就意味着随着本文的发布,这个用户名也会变成一个不大不小的特征,也许会被攻击者优先尝试。所以和端口一样,我强烈建议你用一个自己想到的其他用户名。
[*]完整流程演示如下:https://xtls.github.io/assets/ch04-img04-adduser-full-4A5I1bZl.gif
[*]我们要做的第二件事,是【安装sudo功能】(sudo 就是在关键时刻,让普通账户临时获得 root 的神力,战力全开拯救世界)apt update && apt install sudo
聪明的你大概已经发现,这一行命令其实是两个命令。前一半 apt update 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 apt install 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的sudo程序】。 && 则是把两个命令连起来执行的意思。
[*]我们要做的第三件事,是【把vpsadmin用户加入sudo名单里,让他有资格借用root的神力】visudo
在 User Privilege Specification 下加入一行 vpsadmin ALL=(ALL) NOPASSWD: ALL 即可。注意我要特别说明的是NOPASSWD这个设置,它的意思是vpsadmin用户临时使用root权限时,不用额外输入密码。这与一般的安全建议相反。我之所以如此推荐,是因为很多新人不顾危险坚持使用root账号就是因为用root时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用root用户的风险】大于【使用sudo 时不用输密码的风险】,所以做了以上的建议。如果你希望遵守传统习惯、每次使用sudo时需要输入密码,那么这一行改成 vpsadmin ALL=(ALL:ALL) ALL 即可。
[*]完整流程演示如下:https://xtls.github.io/assets/ch04-img05-sudo-full-3iorC9_U.gif
4.6 禁用 root 用户 SSH 远程登录
[*]现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用nano编辑器打开SSH远程登录程序设置】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:nano /etc/ssh/sshd_config
[*]找到PermitRootLogin Yes这一项,然后把它后面的设定值改为no即可。还记得怎么操作吗?............ 正确答案:
[*]使用 ctrl+w 进入搜索模式,然后输入 PermitRootLogin 并回车
[*]删除 yes 并改成 no
[*]保存文件并退出。还记得怎么操作吗?............ 正确答案:
[*]保存是 ctrl+o,然后 回车 确认
[*]退出是 ctrl+x
[*]重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案:systemctl restart ssh
[*]完整流程演示如下:https://xtls.github.io/assets/ch04-img06-ssh-no-root-full-2Xke7pLI.gif
[*]下次通过 PuTTY 远程 SSH 登录的时候,root用户已无法连接,用户名就要换成vpsadmin了!方便起见,我们可以在 PuTTY 中把vpsadmin设置成默认登录用户名。(啰嗦君:别忘了保存 Session)https://xtls.github.io/assets/ch04-img07-putty-default-user-Uz6ByXtY.png
4.7 使用 RSA 密钥登录并禁用密码登录第三步,我们来解决【密码】可能被撞破的问题。前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助 1Password,或者 macOS 的 keychain 等密码管理工具),否则很容易中招。超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到 VPS 备用。每次登录时,SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)注意本文以 RSA 密钥举例,是因为 RSA 密钥在各种设备、各种 SSH 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。其他的常见密钥还有:
[*]DSA - 已经从数学层面被证明不安全,所以永远不要用它
[*]ECDSA - 密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的 VPS 上有值得 NSA 关注的东西就不要用它
[*]Ed25519 - 这是一个与 ECDSA 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门
所以,如果你的设备和软件都支持的话,我建议优先选择 Ed25519 密钥。
那我们现在就来配置【密钥验证】吧!
[*]运行PuTTYgen (PuTTY 密钥生成器)。位置是 开始菜单 --> 所有程序 --> PuTTY (64-bit) --> PuTTYgen
[*]点击Generate开始生成(在界面空白处乱晃鼠标增加随机数)https://xtls.github.io/assets/ch04-img08-puttygen-save-trq9BjLs.png
注意本图中是以 2048 位的 RSA 密钥为例的。但实际上,如果要获得与 EDCSA/Ed25519 的 256 位密钥相同的安全性,你需要使用 3072 位的 RSA 密钥。(即右下角的数字改成 3072)
[*]你可以给私钥设置密码,增加一层安全性
[*]点击 Save public key 保存公钥,文件名为 id_rsa.pub
[*]点击 Save private key 保存私钥,文件名为 id_rsa (PuTTY 私钥自带.ppk后缀)
[*]最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 authorized_keys。(用 vscode 保存,默认会变成带txt后缀的文本文件,这没关系,之后上传 VPS 时我们会把后缀名去掉)https://xtls.github.io/assets/ch04-img09-puttygen-save-keys-vLMRFWc3.png
[*]将公钥上传至 VPS 的vpsadmin用户下
[*]这一步就需要用到之前准备的WinSCP了。
[*]去官网open in new tag下载并安装,会提示你导入 PuTTY 的设置,当然一键导入啦!https://xtls.github.io/assets/ch04-img10-winscp-import-session-XcebKiQh.png
[*]如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可https://xtls.github.io/assets/ch04-img11-winscp-ui-qpe61gpr.png
[*]WinSCP 左边的目录就是本地电脑上的文件夹和文件,请定位到密钥所在的文件夹
[*]WinSCP 右边的目录则是 VPS 服务器上的文件夹和文件,默认就在 /home/vpsadmin/ 文件夹,此时在请点击右下角 X hidden 来显示隐藏文件https://xtls.github.io/assets/ch04-img12-winscp-locations-LVSFx0Gv.png
[*]在右边(VPS 中)点击右键并新建文件夹,起名.ssh (注意有一个.)https://xtls.github.io/assets/ch04-img13-winscp-newfolder-key-LCGlJF7z.png
[*]将【公钥】authorized_keys上传到.ssh文件夹内https://xtls.github.io/assets/ch04-img14-winscp-upload-key-cYDbKigI.png
[*]在上传时,将【公钥】从 authorized_keys.txt 改名为 authorized_keys(去掉.txt这个后缀名)https://xtls.github.io/assets/ch04-img15-winscp-rename-key-0HbKMEUe.png
[*]完整流程演示如下:https://xtls.github.io/assets/ch04-img16-winscp-full-f89kJTvj.gif
[*]在 VPS 端设置 SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-08sudo用root权限运行某个命令
cmd-09chmod修改目标文件/文件夹的权限
[*]SSH 远程连接到 VPS 上(PuTTY)
[*]修改 authorized_keys 文件权限为 600 (仅所有者可读可写)chmod 600 ~/.ssh/authorized_keys
[*]修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的root变成了普通用户vpsadmin,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用sudo命令了:sudo nano /etc/ssh/sshd_config
[*]找到(ctrl+w) PasswordAuthentication 改成 no
[*]找到(ctrl+w) PubkeyAuthentication 改成 yes,然后保存(ctrl+o)退出(ctrl+x)
[*]重启 SSH 服务。(啰嗦君:别忘了现在需要使用sudo来获得权限)sudo systemctl restart ssh
[*]完整流程如下:https://xtls.github.io/assets/ch04-img17-rsa-login-full-mcrVWcK9.gif
[*]VPS 端已经设置好了公钥,现在要给 PuTTY 指定私钥位置供登录时使用(啰嗦君:别忘了保存 Session)https://xtls.github.io/assets/ch04-img18-putty-privatekey-location-IFasU6Lo.png
[*]至此,【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给 PuTTY 保存了默认的登录用户名和私钥。未来使用 PuTTY 登录时,载入VPS-SERVER配置后,点击Open就可以一键登录了。如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图:https://xtls.github.io/assets/ch04-img19-putty-privatekey-passphrase-gyNqeCHk.png
[*]别忘了给WinSCP也做对应的密钥设置,否则之后想要传输文件时就无法登录了:https://xtls.github.io/assets/ch04-img20-winscp-privatekey-location-sNcUjGIT.png
注意任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦
4.8 你的进度到这里为止,你的 VPS 已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障,虽然远称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了!现在我们终于有了一个安全的系统基础,下一章,我们就可以开始逐步安装配置 Xray 需要的基础设施了!(什么基础设施呢?一个网页,一张证书)⬛⬛⬛⬛⬜⬜⬜⬜ 50%
【第 5 章】网站建设篇5.1 为什么要做一个网站?
新人也许会迷惑,为什么科学上网还要建一个网站?我不会编程啊,是不是特别麻烦?先回答第一个问题,建网站的原因有:
[*]申请合法的 TLS 证书(非常重要)
[*]提供合理的回落,防止主动探测攻击,提高安全性
[*]建设一个伪装站(如博客、私人网盘、多媒体网站、游戏网站等),直接访问时有合理的前台,使流量使用看上去更合理。
再回答第二个问题:
[*]本文作为演示,仅仅使用了一个最简单的【单文件 html 页面 + Nginx】来搭建,以此完成上面的目标,所以【非常简单】
[*]这个网站完全可以不仅仅是伪装,而是真的做大做强,这个复杂性就完全取决于你了
[*]对于“伪装”和“网站运营”这个目标,需要的就是各不相同、秀出真我,需要的同学可以自行搜索学习。这个内容已经完全偏离了科学上网,本文就不深入解析了。
5.2 登录 VPS、安装运行 Nginx
[*]这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。sudo apt update && sudo apt install nginx
[*]完成后,Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 http://100.200.300.400:80,若看到下图的界面就说明 Nginx 已经正常在运行了。https://xtls.github.io/assets/ch05-img01-nginx-default-running-gZQeEn-L.png
[*]如果无法看到上述Nginx默认页面,可能是需要配置Debian系统上默认的防火墙组件Uncomplicated Firewall (UFW),以便启用 HTTP (80) 和 HTTPS (443) 端口流量。a. 验证方法,输入:sudo ufw status
b. 如果输出如下,表明80和433端口未开启,需要执行c步骤Status: activeTo Action From-- ------ ----22/tcp ALLOW Anywhere22/tcp (v6) ALLOW Anywhere (v6)
c. 启用UFW的Nginx 80 和 443 端口命令sudo ufw allow 'Nginx Full'
d. 输入a中命令再次验证,如果输出如下,表示Nginx流量已经被防火墙放行,这样就应该可以看到前述第2点中的Nginx默认页面。Status: activeTo Action From-- ------ ----22/tcp ALLOW AnywhereNginx Full ALLOW Anywhere22/tcp (v6) ALLOW Anywhere (v6)Nginx Full (v6) ALLOW Anywhere (v6)
5.3 创建一个最简单的网页
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-10mkdir新建文件夹
cmd-11systemctl reload重新加载某个服务
[*]小小白白 Linux 基础配置文件:
编号配置文件位置文件说明
conf-02/etc/nginx/nginx.confNginx 程序设置
[*]创建一个网站专用的文件夹/home/vpsadmin/www/webpage/并建立网页文件index.htmlmkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
注意如果你用的不是 vpsadmin 这个用户名,请务必理解这条命令中 “~” 符号的意义(这关系到【第 5 步】你要写的内容):
[*]如果是 【非 root 用户】,“~” 就等价于 /home/用户名
[*]如果是 【 root 用户】,“~” 就等价于 /root
[*]把下面的内容完整的复制进去,然后保存(ctrl+o)退出(ctrl+x)<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>© Wiley Publishing, 2011</p></body></html>
赋予其他用户读取该文件的权限chmod -R a+r .
[*]修改 nginx.conf 并重启 Nginx 服务,将80端口的 http 访问定位到刚才建立的 html 页面上
[*]修改 nginx.conf 。sudo nano /etc/nginx/nginx.conf
[*]将下面一段,添加在 http{} 内,然后保存(ctrl+o)退出(ctrl+x)。(记得将域名替换为之前准备好的、包含二级域名的真实域名) server { listen 80; server_name 二级域名.你的域名.com; root /home/vpsadmin/www/webpage; index index.html; }
特别注意!如我在【第 3 步】中的提示所说,请务必确保 /home/vpsadmin/www/webpage 改成你的实际文件路径。
[*]让 nginx 重新载入配置使其生效sudo systemctl reload nginx
[*]完整的设置流程如下:https://xtls.github.io/assets/ch05-img02-nginx-conf-full-v03jv5Nl.gif
[*]此时如果你访问 http://二级域名.你的域名.com,你看到这样的页面则说明成功:https://xtls.github.io/assets/ch05-img03-nginx-http-running-pMqjJEDb.png
5.4 常见错误的说明首先,如果你一路按照文章的说明来操作,并且足够细心,那肯定不会出错。所以,我并不打算修改本文的写法。那为什么依然有很多同学卡在了这一步,网页怎么也打不开呢?基本上就是两个字:粗心。因为这里配置可能出现的问题只有两种,原因也只有两个。一、两种问题:
[*]nginx.conf 里面的 /home/vpsadmin/www/webpage 这一条,与你的实际文件路径不符,nginx 找不到文件
[*]路径正确,但 nginx 无权读取
二、两个原因:
[*]使用了【非 root 用户】,但仍然直接拷贝文中的命令不加修改。(这基本就等于抄答案时把同学的名字一起抄过去了)
[*]坚持使用【 root 用户】
碰到错误的同学,就回过头仔细看一下【5.3】中【第 3 步】和【第 5-2 步】的说明吧。注意本文前期已经用了大量篇幅说明了使用【非 root 用户】对安全的重要性,全文也是基于此而写。所以,因使用【 root 用户】而导致的问题并不在本文的设计范围里。但我相信,坚持使用【 root 用户】的同学应该是有主见、动手能力强、或者有一定 Linux 基础的同学。问题的症结我已经全部说明了,我相信你一定可以自行解决。
5.5 你的进度至此,Xray 的第一个基础设施【网页】已经就位,我们马上就进入第二个基础设施【证书】吧!⬛⬛⬛⬛⬛⬜⬜⬜ 62.5%
【第 6 章】证书管理篇6.1 申请 TLS 证书
接下来我们要做的,是为我们的域名申请一个真实的 TLS 证书,使网站具备标准 TLS 加密的能力及 HTTPS 访问的能力。这就是 Xray 等现阶段安全代理工具确保流量充分加密最重要的工具。注意请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。
这里我会使用一个叫做 acme.shopen in new tag 的证书管理工具,它简单、轻量、高效,并可完成证书自动更新。另外,我相信,现在你已经逐渐熟悉了 Linux 的基础操作,所以已经多次出现的命令从本章开始不再重复截图、只做简单的描述。如果实在想不起来怎么用的话,就稍微复习一下前面的章节吧。6.2 安装 acme.sh
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-12wget访问(或下载)某个网页文件
cmd-13acme.shacme.sh 证书管理相关的命令
[*]运行安装脚本wget -O -https://get.acme.sh | sh
[*]让 acme.sh 命令生效. .bashrc
[*]开启 acme.sh 的自动升级acme.sh --upgrade --auto-upgrade
[*]到这一步的完整流程如下图:https://xtls.github.io/assets/ch06-img01-acme-install-6MHbN7VN.gif
6.3 测试证书申请在正式申请证书之前,我们先用测试命令(--issue --test)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多 5 次),导致后面的步骤无法进行。
[*]测试证书申请的命令如下(本文均以 ECC 证书为例,因为时至今日,实在没什么理由不用它):acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
说明ECC证书的主要优势在于它的 Keysize 更小,意味着同等大小下安全性的提升和加密解密速度的加快。如 ECC-256bit 的强度大约相当于 RSA-3072bit,何乐而不为呢?当然,有人说 ECC 证书握手会明显更快,这我觉得就有些夸张了,因为 RSA 握手也没有太慢,就算有差别应该也是毫秒级,很难直接感知。另外,如果有些网站确实需要兼容某些古老设备的,那也还是请按需选择RSA证书。
[*]你最终应该看到类似这样的提示:[Wed 30 Dec 2022 04:25:12 AM EST Using ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory[Wed 30 Dec 2022 04:25:13 AM EST Using CA: https://acme-staging-v02.api.letsencrypt.org/directory[Wed 30 Dec 2022 04:25:13 AM EST Create account key ok.[Wed 30 Dec 2022 04:25:13 AM EST Registering account: https://acme-staging-v02.api.letsencrypt.org/directory[Wed 30 Dec 2022 04:25:13 AM EST Registered[Wed 30 Dec 2022 04:25:13 AM EST ACCOUNT_THUMBPRINT='CU6qmPKuRqhyTAIrF4swosR375194z_1ddUlWef8xDc'[Wed 30 Dec 2022 04:25:13 AM EST Creating domain key[Wed 30 Dec 2022 04:25:13 AM EST The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key[Wed 30 Dec 2022 04:25:13 AM EST Single domain='二级域名.你的域名.com'[Wed 30 Dec 2022 04:25:13 AM EST Getting domain auth token for each domain[Wed 30 Dec 2022 04:25:14 AM EST Getting webroot for domain='二级域名.你的域名.com'[Wed 30 Dec 2022 04:25:14 AM EST Verifying: 二级域名.你的域名.com[Wed 30 Dec 2022 04:25:23 AM EST Pending[Wed 30 Dec 2022 04:25:25 AM EST Success[Wed 30 Dec 2022 04:25:25 AM EST Verify finished, start to sign.[Wed 30 Dec 2022 04:25:25 AM EST Lets finalize the order.[Wed 30 Dec 2022 04:25:25 AM EST Le_OrderFinalize='https://acme-staging-v02.api.letsencrypt.org/acme/finalize/490205995/7730242871'[Wed 30 Dec 2022 04:25:25 AM EST Downloading cert.[Wed 30 Dec 2022 04:25:25 AM EST Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/xujss5xt8i38waubafz2xujss5xt8i38waubz2'[Wed 30 Dec 2022 15:21:52 AM EST Cert success.--BEGIN CERTIFICAT--sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtNcTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1SmpwAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRidSjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUbwXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVXtOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPYIeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmXTnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwFtYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7UxoshaiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVVFmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOcG6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQdAm65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIpyiLKcBFc5H7dgJCImo7us7aJeftC44uWkPIjw9AKH=--END CERTIFICAT--[Wed 30 Dec 2022 15:21:52 AM EST Your cert is in/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer[Wed 30 Dec 2022 15:21:52 AM EST Your cert key is in/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key[Wed 30 Dec 2022 15:21:52 AM EST The intermediate CA cert is in/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer[Wed 30 Dec 2022 15:21:52 AM EST And the full chain certs is there:/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
[*]注意:这里申请的是测试证书,没办法直接用的,只是用来证明你的域名、配置全都正确。仔细观察,你会发现给你发证书的域名是 https://acme-staging-v02.api.letsencrypt.org,这个 staging 你就理解成【测试服】吧!
[*]如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。(看不懂就隐藏掉敏感信息后,去 Xray 群里问吧)acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
嗯没错,就是在命令的最后加了一个 --debug 参数
[*]这一步确定成功之后,就可以申请正式的证书了。(测试证书不需要删除,它会自动被正式证书覆盖)
6.4 正式证书申请
[*]申请正式证书的命令如下(即删掉 --test 参数,并在最后加入 --force参数):acme.sh --set-default-ca --server letsencrypt
acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
说明--force 参数的意思就是,在现有证书到期前,手动(强行)更新证书。上一步我们从“测试服”申请的证书虽然不能直接用,但是它本身是尚未过期的,所以需要用到这个参数。
[*]你最终应该看到跟上面很像的提示:vpsadmin@vps-server:~$ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256[Wed 30 Dec 2022 15:22:51 AM EST Using CA: https://acme-v02.api.letsencrypt.org/directory[Wed 30 Dec 2022 15:22:51 AM EST Creating domain key[Wed 30 Dec 2022 15:22:51 AM EST The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key[Wed 30 Dec 2022 15:22:51 AM EST Single domain='二级域名.你的域名.com'[Wed 30 Dec 2022 15:22:51 AM EST Getting domain auth token for each domain[Wed 30 Dec 2022 15:22:51 AM EST Getting webroot for domain='二级域名.你的域名.com'[Wed 30 Dec 2022 15:22:51 AM EST Verifying: 二级域名.你的域名.com[Wed 30 Dec 2022 15:22:51 AM EST Pending[Wed 30 Dec 2022 15:22:51 AM EST Success[Wed 30 Dec 2022 15:22:51 AM EST Verify finished, start to sign.[Wed 30 Dec 2022 15:22:51 AM EST Lets finalize the order.[Wed 30 Dec 2022 15:22:51 AM EST Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/490205996/7730242872'[Wed 30 Dec 2022 15:22:51 AM EST Downloading cert.[Wed 30 Dec 2022 15:22:51 AM EST Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw'[Wed 30 Dec 2022 15:22:51 AM EST Cert success.--BEGIN CERTIFICAT--sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtNcTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1SmpwAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRidSjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUbwXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVXtOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPYIeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmXTnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwFtYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7UxoshaiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVVFmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOcG6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQdAm65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIpyiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM=--END CERTIFICAT--[Wed 30 Dec 2022 15:22:52 AM EST Your cert is in/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer[Wed 30 Dec 2022 15:22:52 AM EST Your cert key is in/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key[Wed 30 Dec 2022 15:22:52 AM EST The intermediate CA cert is in/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer[Wed 30 Dec 2022 15:22:52 AM EST And the full chain certs is there:/home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
[*]仔细观察,你会发现这次给你发证书的域名是 https://acme-v02.api.letsencrypt.org,少了 staging,自然就是【正式服】了!
6.5 证书安装
[*]证书申请完成后,需要安装,安装到指定位置,并在配置文件中引用即可:vpsadmin@vps-server:~$ acme.sh --installcert -d 二级域名.你的域名.com --cert-file /你要安装到的位置/cert.crt --key-file /你要安装到的位置/cert.key --fullchain-file /你要安装到的位置/fullchain.crt --ecc[Mon 14 Feb 2022 03:00:25 PM CST Installing cert to: /etc/xray/cert/cert.crt[Mon 14 Feb 2022 03:00:25 PM CST Installing key to: /etc/xray/cert/cert.key[Mon 14 Feb 2022 03:00:25 PM CST Installing full chain to: /etc/xray/cert/fullchain.crt
6.6 你的进度至此,Xray 所需要的两个基础设施终于全部就位!千呼万唤始出来的 Xray 马上就要揭开面纱,我们终于要进入最激动人心章节啦!⬛⬛⬛⬛⬛⬛⬜⬜ 75%
【第 7 章】Xray 服务器篇7.1 博观而约取,厚积而薄发
本文撰写过程中,大佬开玩笑的吐槽到:你这教程,居然连载了 6 章都还没到 Xray,不知道的还以为你是“手把手教你建网站”教程呢。(我竟无法反驳.jpg!)其实这样的结构是我多番思考之后的决定,毕竟只有打好基础,才能在后面事半功倍快速反超。我在群里看到许多新人连nano都无法正确使用,也不会用WinSCP,远程手写编辑出来的config.json自然错误百出,连查错也变得举步维艰。注意经过了前 6 章的准备,各位已经跟我一起翻越了 Linux 基本操作、VPS 远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置 Xray 时会有一种【水到渠成】的轻快感觉。
后面要做的事情非常简单:
[*]安装
[*]配置(如安装 TLS 证书、config.json)
[*]运行
[*]优化(如更新内核、开启bbr、网站http访问自动跳转https等)
7.2 安装 Xray首先,Xray 的官方载体,就是 xray-coreopen in new tag 开源项目(基于 MPL 2.0 开源协议)生成的二进制程序。你把这个二进制放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。主要区别来源于【配置】。安装时,直接使用官方安装脚本就很简单直接。它提供了多种安装选项,有兴趣的可以去官方的安装脚本仓库open in new tag中看看脚本的说明,本文使用的是【非 root 用户】安装模式。写本文时,安装脚本在使用非 root 账户时有一些小 bug,所以我决定正好把这几步分开操作,可以顺便说明一下 Linux 下的删除命令。
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-14rm删除命令
[*]将安装脚本下载至本地:wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh
[*]执行安装命令sudo bash install-release.sh
[*]使用完成之后可以删除该脚本rm ~/install-release.sh
注意使用 rm 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,我依然写了完整的路径: ~/install-release.sh,这是我使用 rm 时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。
[*]完整流程演示如下:https://xtls.github.io/assets/ch07-img01-xray-install-OkVIrYZ6.gif
7.3 给 Xray 配置 TLS 证书虽然我们前面已经申请好了 TLS 证书,但是按照 acme.sh的官方说明open in new tag,申请后的证书不建议直接使用。正确的方法是使用 --install-cert 命令安装给需要的程序。我们现在就来把证书安装给 xray-core 使用。
[*]为了规避非 root 账户的各种潜在的权限困扰,我们在 vpsadmin 账户下建立一个证书文件夹mkdir ~/xray_cert
[*]使用acme.sh的--install-cert正确安装(拷贝)证书文件acme.sh --install-cert -d 二级域名.你的域名.com --ecc \ --fullchain-file ~/xray_cert/xray.crt \ --key-file ~/xray_cert/xray.key
[*]xray.key文件默认对其他用户不可读,所以需要赋予其可读性权限chmod +r ~/xray_cert/xray.key
[*]过程比较简单就不放动图了:https://xtls.github.io/assets/ch07-img02-xray-cert-install-cipxwXde.png
[*]acme.sh 会每 60 天检查一次证书并自动更新临期证书。但据我所知是它并不会自动将新证书安装给 xray-core,所以我们需要新增一个系统的自动周期任务来完成这一步。
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-15crontab -e编辑当前用户的定时任务
[*]建立一个脚本文件(xray-cert-renew.sh)nano ~/xray_cert/xray-cert-renew.sh
[*]把下面的内容复制进去,记得替换你的真实域名,然后保存退出#!/bin/bash/home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.keyecho "Xray Certificates Renewed"chmod +r /home/vpsadmin/xray_cert/xray.keyecho "Read Permission Granted for Private Key"sudo systemctl restart xrayecho "Xray Restarted"
注意经大家提醒,acme.sh 有一个 reloadcmd 命令,可以在证书更新时自动执行特定命令,那么就可以指定自动给 Xray 安装证书,但因为 crontab 是 Linux 系统中一个非常有用、非常常用的功能,所以本文保留 crontab 的方式来更新 Xray 证书。(对 reloadcmd 感兴趣的同学可以查看 acme.sh 的官方文档open in new tag)另外,录制动图时,脚本中没有加入重启 Xray 的命令,是因为 Xray 计划支持【证书热更新】功能,即 Xray 会自动识别证书更新并重载证书、无需手动重启。待功能加入后,我将适当修改 config.json 开启此设置,并删除脚本中的重启命令。
[*]给这个文件增加【可执行】权限chmod +x ~/xray_cert/xray-cert-renew.sh
[*]运行 crontab -e,添加一个自动任务【每月自动运行一次xray-cert-renew.sh】 (注意不要加sudo,因为我们增加的是vpsadmin 账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的nano啦!)crontab -e
[*]把下面的内容增加在文件最后,保存退出即可。# 1:00am, 1st day each month, run `xray-cert-renew.sh`0 1 1 * * bash /home/vpsadmin/xray_cert/xray-cert-renew.sh
[*]完整流程演示如下:https://xtls.github.io/assets/ch07-img03-crontab-cert-renew-f3cEi7YH.gif
7.4 配置 Xray首先,各种配置都可以参考官方 VLESS 配置示例open in new tag。本文会基于官方示例,配置一个最精简的方式:【单 VLESS 协议入站 + 80 端口回落】,满足大多数场景的最大速度及必要安全。
[*]生成一个合法的 UUID 并保存备用(UUID可以简单粗暴的理解为像指纹一样几乎不会重复的 ID)xray uuid
[*]建立日志文件及文件夹备用
[*]小小白白 Linux 基础命令:
编号命令名称命令说明
cmd-16touch建立空白文件
[*]在vpsadmin的文件夹内建立一个【日志专用文件夹】mkdir ~/xray_log
[*]生成所需的两个日志文件(访问日志、错误日志)touch ~/xray_log/access.log && touch ~/xray_log/error.log
注意这个位置不是Xray标准的日志文件位置,放在这里是避免权限问题对新人的操作带来困扰。当你熟悉之后,建议回归默认位置: /var/log/xray/access.log 和 /var/log/xray/error.log 。
[*]因为 Xray 默认是 nobody 用户使用,所以我们需要让其他用户也有“写”的权限(*.log 就是所有文件后缀是log的文件,此时CLI界面的效率优势就逐渐出现了)chmod a+w ~/xray_log/*.log
[*]使用nano创建Xray的配置文件sudo nano /usr/local/etc/xray/config.json
[*]将下面的文件全部复制进去,并将之前生成的UUID填入第 61 行 "id": "", 之中。(填好之后的样子是 "id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid" ),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。// REFERENCE:// https://github.com/XTLS/Xray-examples// https://xtls.github.io/config/// 常用的 config 文件,不论服务器端还是客户端,都有 5 个部分。外加小小白解读:// ┌─ 1*log 日志设置 - 日志写什么,写哪里(出错时有据可查)// ├─ 2_dns DNS-设置 - DNS 怎么查(防 DNS 污染、防偷窥、避免国内外站匹配到国外服务器等)// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)// ├─ 4_inbounds 入站设置 - 什么流量可以流入 Xray// └─ 5_outbounds 出站设置 - 流出 Xray 的流量往哪里去{// 1\_日志设置"log": { "loglevel": "warning", // 内容从少到多: "none", "error", "warning", "info", "debug" "access": "/home/vpsadmin/xray_log/access.log", // 访问记录 "error": "/home/vpsadmin/xray_log/error.log" // 错误记录},// 2_DNS 设置"dns": { "servers": [ "https+local://1.1.1.1/dns-query", // 首选 1.1.1.1 的 DoH 查询,牺牲速度但可防止 ISP 偷窥 "localhost" },// 3*分流设置"routing": { "domainStrategy": "IPIfNonMatch", "rules": [ // 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等 { "type": "field", "ip": [ "geoip:private" // 分流条件:geoip 文件内,名为"private"的规则(本地) , "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽) }, { // 3.2 防止服务器直连国内 "type": "field", "ip": ["geoip:cn", "outboundTag": "block" }, // 3.3 屏蔽广告 { "type": "field", "domain": [ "geosite:category-ads-all" // 分流条件:geosite 文件内,名为"category-ads-all"的规则(各种广告域名) , "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽) } },// 4*入站设置// 4.1 这里只写了一个最简单的 vless+xtls 的入站,因为这是 Xray 最强大的模式。如有其他需要,请根据模版自行添加。"inbounds": [ { "port": 443, "protocol": "vless", "settings": { "clients": [ { "id": "", // 填写你的 UUID "flow": "xtls-rprx-vision", "level": 0, "email": "vpsadmin@yourdomain.com" } , "decryption": "none", "fallbacks": [ { "dest": 80 // 默认回落到防探测的代理 } }, "streamSettings": { "network": "tcp", "security": "tls", "tlsSettings": { "alpn": "http/1.1", "certificates": [ { "certificateFile": "/home/vpsadmin/xray_cert/xray.crt", "keyFile": "/home/vpsadmin/xray_cert/xray.key" } } } },// 5*出站设置"outbounds": [ // 5.1 第一个出站是默认规则,freedom 就是对外直连(vps 已经是外网,所以直连) { "tag": "direct", "protocol": "freedom" }, // 5.2 屏蔽规则,blackhole 协议就是把流量导入到黑洞里(屏蔽) { "tag": "block", "protocol": "blackhole" }}
[*]完整流程演示如下: https://xtls.github.io/assets/ch07-img04-xray-log-and-config-T-XHGfJD.gif
7.5 启动 Xray 服务!!(并查看服务状态)如果你是跟随本文一步步设置过来,其实就已经避开了最常见日志文件权限不足、证书文件权限不足 这两个大坑。那么现在运行Xray自然应该无比顺利。
[*]输入下面的命令,享受启动Xray的历史性时刻吧!!!
sudo systemctl start xray
[*]仅仅start我们并不能确定是否成功的开启了 Xray 的服务,要确定它的状态,就要用到下面的命令。
sudo systemctl status xray
看到那个绿色的、令人愉悦的 active (running) 了吗?它就是说 Xray 已经在正确的运行了
[*]完整流程演示如下:
https://xtls.github.io/assets/ch07-img05-xray-start-and-status-pesim605.gif7.6 回顾 systemd 进行基本的服务管理到现在为止,我们已经使用过了systemctl相关的start, status, reload 等命令,这些都是基于systemd管理模块对 Linux 系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。
[*]若你需要暂时关闭 Xray 的服务,那就用stop命令
sudo systemctl stop xray
[*]若你需要重启Xray的服务,那就用restart命令
sudo systemctl restart xray
[*]若你需要禁用Xray的服务(电脑重启后禁止 Xray 自动运行),那就用disable命令
sudo systemctl disable xray
[*]若你需要启用Xray的服务(电脑重启后确保 Xray 自动运行),那就用enable命令
sudo systemctl enable xray
7.7 服务器优化之一:开启 BBR
[*]传说中的BBR
我相信,你在搜索各种科学上网技术的时候,肯定不止一次的听过bbr这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有bbrplus, bbr2, 魔改bbr 等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?
[*]实际的BBR
BBR = Bottleneck Bandwidth and Round-trip propagation time,是一种 TCP 的拥塞控制算法。简单粗暴的理解就是数据流量的交通管理 :当公路不再塞车的时候,每辆车自然就能保持较快的车速了。那么它有没有用呢?一般而言,有BBR 和 没有BBR 会有可以感知的差别(速度、稳定性、延迟方面都会有一些改善),所以 【非常建议开启 BBR】。但开启之后,BBR 在 4.x 和 5.x 之间的差异往往比较微妙、见仁见智,造成体验差别的决定性因素仍然是线路质量。所以 【不必纠结版本、不必盲目追新、跟随你的发行版更新内核即可】
[*]bbrplus, bbr2, 魔改bbr 和其他各种听起来就酷炫的版本是不是更好?
一句话:不是!不要用这些!这些都为了吸引眼球乱起的名字!BBR 的更新和发布,都是跟随 Linux 的内核(Kernel)进行的。换言之,只要你用的是比较新的内核,就自然会使用到新版BBR。而这些名字看起来很酷炫的东西,说白了就是仍未正式发布的、尚在测试阶段的内核及其对应的BBR版本。这些脚本也仅仅就是通过下载预览版的内核(甚至第三方魔改内核)来率先开启而已。内核的稳定是一台服务器稳定运行的基石。【BBR 测试版带来的细微性能差异绝对不值得更换不稳定的内核。】 请选择你所在的 Linux 发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。注意所谓魔改bbr的【领先】是有非常强的时效性的。比如很多 bbrplus 脚本,因为几年来都没有更新,到现在还会把你的内核换成 4.19,要知道现在稳定如 Debian 已经是 5.9 的时代了,那么这个脚本放在 2018 年 1 月也许领先了一点,到 2018 年 10 月 4.19 正发布时就已经失去了意义,放在现在甚至可以说是完完全全的【降级】和【劣化】
[*]fq, fq_codel, fq_pie, cake和其他算法哪个好?
一句话:看不懂的话,请保持fq,足够、且不会劣化你的线路
[*]锐速、Finalspeed、LotServer 和其他“加速工具”
一句话:不要用这些!把他们丢进历史的垃圾桶吧!它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出 3 份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。说明它们的原理不是算法优化、不是提速、大多数是简单粗暴的多倍发包。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。
[*]啰嗦了这么多,就是因为围绕 BBR 忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对 BBR 有了相对清晰的理解。接下来,我们就动手安装最新的 Debian 内核并开启BBR 吧!(真的很简单)
[*]给 Debian 10 添加官方 backports 源,获取更新的软件库
sudo nano /etc/apt/sources.list
说明本文以 Debian 10 为例,所以使用 /etc/apt/sources.list 仍无问题,但如果你并不是根据本文从头开始,或者使用了其他 Linux 发行版,那么建议你建立 /etc/apt/sources.list.d/ 文件夹,并在这个文件夹内建立自己的配置文件,形如 /etc/apt/sources.list.d/vpsadmin.list ,以此保证兼容性,也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。
[*]然后把下面这一条加在最后,并保存退出。
deb http://deb.debian.org/debian buster-backports main
[*]刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的 VPS 对应的版本(本文以比较常见的【amd64】为例)。
sudo apt update && sudo apt -t buster-backports install linux-image-amd64
注意如果你的 VPS 支持,可以尝试【云服务器专用内核】linux-image-cloud-amd64,优点就是精简、资源占用低,缺点嘛是有同学反馈不支持的系统强行安装会导致无法开机(Kernel 无法识别)。为了避免无法识别的悲剧,请确保:
[*]尝试前做一个系统快照,或者
[*]你有 vnc 可以救场(并且你知道怎么用)
[*]修改 kernel 参数配置文件 sysctl.conf 并指定开启 BBR
sudo nano /etc/sysctl.conf
说明本文以 Debian 10 为例,所以使用 /etc/sysctl.conf 仍无问题,但如果你并不是跟着本文从头开始,或者使用了其他 Linux 发行版,那么建议你建立 /etc/sysctl.d/ 文件夹,并在这个文件夹内建立自己的配置文件,形如 /etc/sysctl.d/vpsadmin.conf,以此保证兼容性,因为部分发行版在 systemd 207 版本之后便不再从 /etc/sysctl.conf 读取参数。使用自定义配置文件也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。
[*]把下面的内容添加进去
net.core.default_qdisc=fqnet.ipv4.tcp_congestion_control=bbr
[*]重启 VPS、使内核更新和BBR设置都生效
sudo reboot
[*]完整流程演示如下:
啰嗦君因为我做展示的 VPS 支持云服务器专用内核,所以动图中我用了 linux-image-cloud-amd64 。如果你不确定你的 VPS 是否支持,那请务必按照第 3 步的命令,使用常规内核 linux-image-amd64。
https://xtls.github.io/assets/ch07-img06-bbr-proper-ac36RTK5.gif
[*]确认BBR开启
如果你想确认 BBR 是否正确开启,可以使用下面的命令:lsmod | grep bbr
此时应该返回这样的结果:tcp_bbr
如果你想确认 fq 算法是否正确开启,可以使用下面的命令:lsmod | grep fq
此时应该返回这样的结果:sch_fq
7.8 服务器优化之二:开启 HTTP 自动跳转 HTTPS
[*]之前我们已经搭建了 80 端口的 http 网页,并以此申请了 TLS 证书。
但如果你尝试过用浏览器访问我们的这个界面,就会发现 http 访问并不会像大多数网站一样自动升级为 https 访问。换言之,我们现在的设置下,http(80) 和 https(443) 之间完全是独立的。如果要解决这个问题,就需要做一些修改。
[*]编辑 Nginx 的配置文件
sudo nano /etc/nginx/nginx.conf
[*]在我们设置过的 80 端口 Server 中加入下面的语句,并保存退出(可同时删除root和index两行)
return 301 https://$http_host$request_uri;
[*]在与 80 端口同级的位置增加一个本地端口监听来提供网页展示。本文以 8080 端口做演示。(可以是任意端口)
server { listen 127.0.0.1:8080; root /home/vpsadmin/www/webpage; index index.html; add_header Strict-Transport-Security "max-age=63072000" always;}
[*]重启 Nginx 服务
sudo systemctl restart nginx
[*]修改 Xray 的回落设置,将回落从 80 端口改为 8080 端口。(找到 "dest": 80, 并改成 "dest": 8080)
sudo nano /usr/local/etc/xray/config.json
[*]重启 Xray 服务,即完成了设置
sudo systemctl restart xray
[*]完整流程演示如下:
https://xtls.github.io/assets/ch07-img07-http-to-https-EGCHHf4D.gif
[*]当你输入 http://a-name.yourdomain.com的时候,它应该已经会自动跳转 https 了
https://xtls.github.io/assets/ch07-img08-http-to-https-check-5driAI71.png7.9 服务器优化之三:更丰富的回落如果你需要更丰富的回落功能,可以参考 《回落 (fallbacks) 功能简析》7.10 你的进度恭喜!!到这一步,你已经拥有了可以正常科学上网的服务器、同时也有了可以防止主动探测攻击的伪装网站。接下来,只要给你的客户端装上合适的软件,就可以享受顺畅的网络了!⬛⬛⬛⬛⬛⬛⬛⬜ 87.5%7.11 重要勘误
[*]初版中Xray配置文件config.json文件夹位置错误。若你已经根据之前的位置进行了操作,Xray会无法正确启动。故勘误说明于此,请自查,造成不便十分抱歉!
[*]正确位置:/usr/local/etc/xray/config.json
[*]错误位置:/usr/local/etc/config.json
受影响章节:
[*]7.4 配置Xray - 3. 使用nano创建Xray的配置文件
[*]7.8 服务器优化之二 - 6. 修改Xray的回落设置
[*]初版中修改Nginx配置文件nginx.conf时内容错误(网页文件夹位置错误),若你已经根据之前的位置进行了操作,Nginx会无法找到正确的网站。请自查,造成不便十分抱歉!
[*]正确文件夹位置:root /home/vpsadmin/www/webpage;
[*]错误文件夹位置:root /var/www/website/html
受影响章节:
[*]7.8 服务器优化之二 - 4. 在与 80 端口同级的位置增加一个本地端口监听来提供网页展示
【第 8 章】Xray 客户端篇8.1 Xray 的工作原理简述
要正确的配置和使用Xray,就需要正确的理解其工作原理,对于新人,可以先看看下面简化的示意图(省略了许多复杂的设置):https://xtls.github.io/assets/ch08-img01-flow-Nus5m8Xg.png这其中的关键点是:
[*]APP 要主动或借助转发工具,将数据【流入(inbounds)】Xray 客户端
[*]流量进入客户端后,会被【客户端路由(routing)】按规则处理后,向不同方向【流出(outbounds)】Xray 客户端。比如:
[*]国内流量直连(direct)
[*]国外流量转发 VPS(proxy)
[*]广告流量屏蔽(block)
[*]向 VPS 转发的国外流量,会跨过防火墙,【流入(inbounds)】 Xray 服务器端
[*]流量进入服务器端后,与客户端一样,会被【服务器端路由(routing)】按规则处理后,向不同方向【流出(outbounds)】:
[*]因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(direct)
[*]如果需要在不同的 VPS 之间做链式转发,就可以继续配置转发规则(proxy)
[*]你可以在服务器端继续禁用各种你想禁用的流量,如广告、BT 下载等(block)
注意请务必记得,Xray 的路由配置非常灵活,上面的说明只是无限可能性中的一种。借助 geosite.dat 和 geoip.dat 这两个文件,可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 GFWList 强大很多很多,可以做到非常细致的微调:比如可以指定 Apple 域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。)现在,《路由 (routing) 功能简析》 已经上线,我建议对路由功能有兴趣的同学,先继续跟着本文完成客户端的基础配置,之后再去这里详细学习。
8.2 客户端与服务器端正确连接现在你已经理解了 Xray 的工作原理,那么接下来的配置,其实就是【告诉你的客户端如何连接 VPS 服务器】。这和你已经很熟悉的、告诉PuTTY如何远程连接服务器是一样的。只不过 Xray 连接时的要素不止是【IP 地址】+【端口】+【用户名】+【密码】这四要素了。实际上,Xray的连接要素是由不同的协议决定的。本文在第 7 章的配置文件 config.json 里,我们使用 Xray 下独特而强大的 VLESS 协议 + XTLS 流控。所以看看那个配置文件的内容就能知道,这个协议组合的连接要素有:
[*]服务器【地址】: a-name.yourdomain.com
[*]服务器【端口】: 443
[*]连接的【协议】: vless
[*]连接的【流控】: xtls-rprx-vision (vision 模式适合全平台)
[*]连接的【验证】: uuiduuid-uuid-uuid-uuiduuiduuid
[*]连接的【安全】: "allowInsecure": false
鉴于新人一般都会使用手机 APP 或者电脑的 GUI 客户端,我就把常用的客户端罗列在下面。每个客户端都有自己独特的配置界面,逐一截图展示并不现实,所以请你务必仔细阅读这些客户端的说明、然后把上述要素填入合适的地方即可。注意许多工具其实是同时支持 xray-core 和 v2fly-core 的,但默认内置的不一定是哪个,所以别忘记检查一下是否是你想要的那个在工作哦!
[*]v2rayN - 适用于 Windows 平台
[*]请从它的GitHub 仓库 Release 页面open in new tag获取最新版
[*]请根据该客户端的说明进行设置
[*]v2rayNG - 适用于 Android 平台
[*]请从它的GitHub 仓库 Release 页面open in new tag获取最新版
[*]请根据该客户端的说明进行设置
[*]Shadowrocket - 适用于 iOS, 基于苹果 M 芯片的 macOS
[*]你需要注册一个【非中国区】的 iCloud 账户
[*]你需要通过 App Store 搜索并购买
[*]请根据该客户端的说明进行设置
[*]Qv2ray - 跨平台图形界面,适用于 Linux, Windows, macOS
[*]请从它的GitHub 仓库 Release 页面open in new tag获取最新版(还可以从它的GitHub 自动构建仓库open in new tag寻找更新的版本)
[*]请从它的项目主页open in new tag学习文档
[*]请根据该客户端的说明进行设置
[*]V2RayXS - 基于 V2RayX 开发的一款使用 xray-core 的 macOS 客户端
[*]请从它的 GitHub 仓库 Release 页面open in new tag 获取最新版
[*]支持一键导入 VMessAEAD / VLESS 分享链接标准提案open in new tag 为标准的分享链接
[*]请根据该客户端的说明进行设置
到这一步,你的全套配置就已经可以正常使用啦!8.3 附加题 1:在 PC 端手工配置 xray-core虽然到上面一步已经可以结束了,但是如果你是个好奇心强、记忆力好的的同学,一定会想起来我在上一章说过,你把xray-core 的二进制文件“放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。” 那究竟要怎样直接使用 xray-core 做客户端呢?为了回答这个问题,我加入了附加题章节,有一点点超纲,有一点点麻烦,但费这个笔墨是因为这个方式有它的优势:
[*]第一时间获得最新版而无需等待 APP 升级适配
[*]灵活自由的路由配置能力(当然 GUI 客户端中 Qv2ray 的高级路由编辑器非常强大,也可以完整实现 xray-core 的路由配置功能)
[*]节约系统资源 (GUI 界面一定会有资源消耗,消耗的多少则取决于客户端的实现)
它的劣势应该就是【需要手写配置文件】有点麻烦了。但其实,你想想,服务器上你已经成功的写过一次了,现在又有什么区别呢?接下来,还是老样子,我们分解一下步骤:
[*]首先请从 Xray 官方的 GitHub 仓库 Release 页面open in new tag 获取对应平台的版本,并解压缩到合适的文件夹
[*]在合适的文件夹建立空白配置文件:config.json (自己常用平台下新建文件大家肯定都会,这就真不用啰嗦了)
[*]至于什么是“合适的文件夹”?这就取决于具体的平台了~
[*]填写客户端配置
[*]我就以 8.1 原理说明里展示的基本三类分流(国内流量直连、国际流量转发 VPS、广告流量屏蔽),结合 8.2 的连接要素,写成一个配置文件
[*]请将 uuid 替换成与你服务器一致的 uuid
[*]请将 address 替换成你的真实域名
[*]请将 serverName 替换成你的真实域名
[*]各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了
// REFERENCE:// https://github.com/XTLS/Xray-examples// https://xtls.github.io/config/// 常用的config文件,不论服务器端还是客户端,都有5个部分。外加小小白解读:// ┌─ 1_log 日志设置 - 日志写什么,写哪里(出错时有据可查)// ├─ 2_dns DNS-设置 - DNS怎么查(防DNS污染、防偷窥、避免国内外站匹配到国外服务器等)// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)// ├─ 4_inbounds 入站设置 - 什么流量可以流入Xray// └─ 5_outbounds 出站设置 - 流出Xray的流量往哪里去{// 1_日志设置// 注意,本例中我默认注释掉了日志文件,因为windows, macOS, Linux 需要写不同的路径,请自行配置"log": { // "access": "/home/local/xray_log/access.log", // 访问记录 // "error": "/home/local/xray_log/error.log", // 错误记录 "loglevel": "warning" // 内容从少到多: "none", "error", "warning", "info", "debug"},// 2_DNS设置"dns": { "servers": [ // 2.1 国外域名使用国外DNS查询 { "address": "1.1.1.1", "domains": ["geosite:geolocation-!cn" }, // 2.2 国内域名使用国内DNS查询,并期待返回国内的IP,若不是国内IP则舍弃,用下一个查询 { "address": "223.5.5.5", "domains": ["geosite:cn", "expectIPs": ["geoip:cn" }, // 2.3 作为2.2的备份,对国内网站进行二次查询 { "address": "114.114.114.114", "domains": ["geosite:cn" }, // 2.4 最后的备份,上面全部失败时,用本机DNS查询 "localhost" },// 3_分流设置// 所谓分流,就是将符合否个条件的流量,用指定`tag`的出站协议去处理(对应配置的5.x内容)"routing": { "domainStrategy": "IPIfNonMatch", "rules": [ // 3.1 广告域名屏蔽 { "type": "field", "domain": ["geosite:category-ads-all", "outboundTag": "block" }, // 3.2 国内域名直连 { "type": "field", "domain": ["geosite:cn", "outboundTag": "direct" }, // 3.3 国内IP直连 { "type": "field", "ip": ["geoip:cn", "geoip:private", "outboundTag": "direct" }, // 3.4 国外域名代理 { "type": "field", "domain": ["geosite:geolocation-!cn", "outboundTag": "proxy" }, // 3.5 默认规则 // 在Xray中,任何不符合上述路由规则的流量,都会默认使用【第一个outbound(5.1)】的设置,所以一定要把转发VPS的outbound放第一个 // 3.6 走国内"223.5.5.5"的DNS查询流量分流走direct出站 { "type": "field", "ip": ["223.5.5.5", "outboundTag": "direct" } },// 4_入站设置"inbounds": [ // 4.1 一般都默认使用socks5协议作本地转发 { "tag": "socks-in", "protocol": "socks", "listen": "127.0.0.1", // 这个是通过socks5协议做本地转发的地址 "port": 10800, // 这个是通过socks5协议做本地转发的端口 "settings": { "udp": true } }, // 4.2 有少数APP不兼容socks协议,需要用http协议做转发,则可以用下面的端口 { "tag": "http-in", "protocol": "http", "listen": "127.0.0.1", // 这个是通过http协议做本地转发的地址 "port": 10801 // 这个是通过http协议做本地转发的端口 },// 5_出站设置"outbounds": [ // 5.1 默认转发VPS // 一定放在第一个,在routing 3.5 里面已经说明了,这等于是默认规则,所有不符合任何规则的流量都走这个 { "tag": "proxy", "protocol": "vless", "settings": { "vnext": [ { "address": "a-name.yourdomain.com", // 替换成你的真实域名 "port": 443, "users": [ { "id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid", // 和服务器端的一致 "flow": "xtls-rprx-vision", "encryption": "none", "level": 0 } } }, "streamSettings": { "network": "tcp", "security": "tls", "tlsSettings": { "serverName": "a-name.yourdomain.com", // 替换成你的真实域名 "allowInsecure": false, // 禁止不安全证书 "fingerprint": "chrome" // 通过 uTLS 库 模拟 Chrome / Firefox / Safari 或随机生成的指纹 } } }, // 5.2 用`freedom`协议直连出站,即当routing中指定'direct'流出时,调用这个协议做处理 { "tag": "direct", "protocol": "freedom" }, // 5.3 用`blackhole`协议屏蔽流量,即当routing中指定'block'时,调用这个协议做处理 { "tag": "block", "protocol": "blackhole" }}
8.4 附加题 2:在 PC 端手工运行 xray-core写好了配置文件该,要怎么让 xray-core 运行起来呢?双击好像并没有反应啊?首先,你要找到电脑上的【命令行界面】。
[*]Linux 桌面、macOS 系统的同学肯定已经比较熟悉了,搜索 Console 或者 Terminal 就可以
[*]Windows 就可以搜索使用 Cmd 或者 Powershell 等程序(WSL 的同学你坐下,你的 Console 当然也可以)
其次,我们要做的事情是【让 xray 找到并读取配置文件 config.json,然后运行】,所以:
[*]在 Windows 下,假设你的 Xray 程序位置是 C:\Xray-windows-64\xray.exe,配置文件位置是C:\Xray-windows-64\config.json,那么正确的启动命令就是:C:\Xray-windows-64\xray.exe -c C:\Xray-windows-64\config.json
说明这里的 -c 就是指定配置文件路径的参数,告诉 xray 去后面的位置找配置文件
[*]相似的,在 Linux 和 macOS 下,假设你的 Xray 程序位置是 /usr/local/bin/xray,配置文件位置是/usr/local/etc/xray/config.json,那么正确的启动命令就是/usr/local/bin/xray -c /usr/local/etc/xray/config.json
说明每个系统都有系统路径变量,所以写 Xray 程序时不一定要写绝对路径。但是写了肯定没错,所以我就如此演示了。
8.5 附加题 3:在 PC 端开机自动运行 xray-core如果你真的尝试了手动运行 xray-core,你一定会发现这个方式还有点小问题:
[*]每次运行 Xray 都要出现一个黑乎乎的窗口,很丑
[*]不能开机自动运行,每次都要手工输入,十分不方便
我可以肯定的告诉你:完全可以解决。但是具体的解决方式,就当作课外作业留给大家吧!(友情提示,文档站的问答区有线索哦)8.6 圆满完成!我相信,有耐心看到这里的同学,都是兼具好奇心和行动力的学习派!我现在要郑重的恭喜你,因为到了这里,你已经完完整整的【从第一条命令开始,完成了 VPS 服务器部署,并成功的在客户端配置使用 Xray】了!这毫无疑问是一个巨大的胜利!我相信,你现在一定对Linux不再恐惧,对Xray不再陌生了吧!至此,小小白白话文圆满结束!⬛⬛⬛⬛⬛⬛⬛⬛ 100%8.7 TO INFINITY AND BEYOND!但现在你看到的,远远不是 Xray 的全貌。Xray是一个强大而丰富的网络工具集合,平台化的提供了众多模块,可以像瑞士军刀一样,通过灵活的配置组合解决各种不同的问题。而本文,仅仅蜻蜓点水的用了最简单、最直观的配置来做基础演示。如果你觉得现在已经完全够用了,那就好好的享受它给你带来的信息自由。但如果你的好奇心依然不能停歇,那就去继续挖掘它无限的可能性吧!需要更多信息,可以到这里寻找:
[*]xtls.github.ioopen in new tag - 官方文档站
[*]官方 Telegram 群组open in new tag - 活跃而友善的官方讨论社区
https://xtls.github.io/assets/ch08-img02-buzz-BMkpbZbZ.png不算后记的后记希望我陪你走过的这一段小小的旅程,可以成为你网络生活中的一份小小助力。这篇文章里的工具和信息难免会一点点的陈旧过时,但你一定会逐渐成长为大佬。未来的某个时间,若你能偶尔想起这篇教程、想起我写下本文的初衷,那我衷心希望你能够薪火相传、把最新的知识分享给后来人,让这一份小小的助力在社区里坚定的传递下去。这是个大雪封山乌云密布的世界,人们孤独的走在各自的路上试图寻找阳光,如果大家偶尔交汇时不能守望相助互相鼓励,那最终剩下的,恐怕只有【千山鸟飞绝 万径人踪灭】的凄凉了吧。
【第 9 章】附录1. 小小白白 Linux 基础命令索引
编号命令名称命令说明出现篇章
cmd-01apt update查询软件更新《远程登录篇》
cmd-02apt upgrade执行软件更新《远程登录篇》
cmd-03nano文本编辑器《安全防护篇》
cmd-04systemctl restart重启某个服务《安全防护篇》
cmd-05adduser给系统新增用户《安全防护篇》
cmd-06apt install安装某个软件《安全防护篇》
cmd-07visudo修改 sudo 权限设置专用编辑器《安全防护篇》
cmd-08sudo用root权限运行某个命令《安全防护篇》
cmd-09chmod修改目标文件/文件夹的权限《安全防护篇》
cmd-10mkdir新建文件夹《网站建设篇》
cmd-11systemctl reload重新加载某个服务《网站建设篇》
cmd-12wget访问(或下载)某个网页文件《证书管理篇》
cmd-13acme.shacme.sh 证书管理相关的命令《证书管理篇》
cmd-14rm删除命令《Xray 服务器篇》
cmd-15crontab -e编辑当前用户的定时任务《Xray 服务器篇》
cmd-16touch建立空白文件《Xray 服务器篇》
cmd-17systemctlsystemd基本服务管理命令《Xray 服务器篇》
cmd-18reboot重启 Linux 系统《Xray 服务器篇》
2. 小小白白 Linux 重要配置文件索引
编号配置文件位置文件说明出现篇章
conf-01/etc/ssh/sshd_configSSH 远程登录程序设置《远程登录篇》
conf-02/etc/nginx/nginx.confNginx 程序设置《网站建设篇》
conf-03/etc/apt/sources.listapt 软件源列表《Xray 服务器篇》
conf-04/etc/apt/sources.list.d/vpsadmin.list用户自定义软件源列表列表《Xray 服务器篇》
conf-05crontab -e当前用户的定时任务《Xray 服务器篇》
conf-06/etc/sysctl.conf手动设置 kernel 参数《Xray 服务器篇》
conf-07/etc/sysctl.d/vpsadmin.conf用户自定义 kernel 参数配置文件《Xray 服务器篇》
3. 小小白白 Xray 重要文件索引
编号配置文件位置文件说明出现篇章
xray-01/usr/local/etc/xray/config.jsonXray 程序设置《Xray 服务器篇》
xray-02/home/vpsadmin/xray_cert/xray.certTLS 证书《Xray 服务器篇》
xray-03/home/vpsadmin/xray_cert/xray.keyTLS 私钥《Xray 服务器篇》
xray-04/home/vpsadmin/xray_log/access.logXray 访问日志《Xray 服务器篇》
xray-05/home/vpsadmin/xray_log/error.logXray 错误日志《Xray 服务器篇》
页:
[1]