利用K3在2020年内管理我的个人服务器

2020-11-06 07:14:10

PermalLink GitHub是5000万多名开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

本文档将介绍我在2020年如何管理我的个人服务器。它将谈论关于。

<;iframe宽度=";560";高度=";315";src=";https://www.youtube.com/embed/P5ZJui3aPoQ";帧边界=";0";允许=#34;加速度计;自动播放;剪贴板写入;加密媒体;陀螺仪;画中画&34;允许屏幕&>;/iframe&>;我管理自己的专用服务器已经15年多了,我已经30多岁了,这一切都要归功于本杰明·巴亚特(Benjamin Bayart)互联网图书馆的一次演讲,或者是为了非法语的免费互联网或Minitel 2.0。对于那些不知道什么是Minitel的人,让我为你引述一下维基百科(Wikipedia)。

Minitel是一种可通过电话线访问的可视图文在线服务,在万维网出现之前是世界上最成功的在线服务。它是在法国布列塔尼雷恩附近的塞松-塞维涅发明的。

本质上,这场讨论是关于在2007年让人们意识到,由于我们依赖集中化的大公司来处理网络上的一切,互联网正开始失去其分散性,看起来更像是Minitel 2.0。如今,随着云的出现,这种警告的声音变得更加响亮,我们的计算机现在只是一个用于远程访问数据/计算的奇特屏幕。

我从一个铁杆极端分子,在我父母家的电话线后面托管了一个由废弃材料制成的服务器,使用Gentoo重新编译所有东西,控制每一个使用标志,并享受着在编译命令行中添加-mtune=ative的令人满意的乐趣。几年后,因为错过了试用这款新软件所必需的使用标志,我受够了不得不在旧的英特尔奔腾3上花上几个晚上重新编译所有的东西,于是我转而使用Debian。

在这一点上,我认为我有一个完美的设置,只需做一个apt-get安装,你就可以在几分钟内安装好你的软件,还有什么比这更多的吗?

也是在那个时候,我从母家托管我的服务器转到了托管公司。我去上大学了,打电话给我的父母,让他们重新启动机器,因为它因为组件老化而死机,花费了太多的时间。我一直生活在丢失电子邮件的恐惧中,IRC上的朋友抱怨说,我的服务器提供的频道的档案/历史再也无法访问了。因此,尽管这个决定很艰难,特别是因为所有的东西都是手工安装的,没有配置管理,但我去见了我的父母,告诉他们我将把服务器从他们手中移除,转而托管在Online e.net上,而且从现在开始,他们应该会更少地接到我的电话。

这个新的可用带宽非常丰富,在将我的手动部署移植到Ansible之后,我真的认为这一次我有了完美的设置。易于安装和配置管理!还有什么比这更重要的吗?

我找到了我的游艇,平静地乘着它航行,直到那些依附的怪物把我赶下了船。当你试图填满所有东西(邮件、网络服务器、GitLab、POP3、IMAP、Torrent、ownCloud、Munin等等)。在Debian上的一台机器上,你最终会激活不稳定的存储库来获取最新版本的包,最终导致软件之间的版本冲突,以至于进行apt-get更新&;&;apt-get升级现在成了你的死对头。

在避免系统升级的同时,我花了一些时间玩KVM/Xen、FreeBSD jages、Illumos、微内核(我认为它将是未来的X)和Docker镇的新玩家!由于太忙/太懒,我最终使用了Docker,没有时间在新的东西上重新安装所有东西,而Docker让我逐渐隔离/修补令我恼火的软件。你好,Python项目!

这种混合设置曾经奏效过一段时间,但它让人感觉管理起来很笨拙,特别是在Ansible的参与下。我最后把所有东西都搬到了容器里,并不是没有麻烦,现在Ansible对ODD感到奇怪,System d和Docker之间的集成也很奇怪,我只是把时间花在粘合琐碎的东西上。

因此,这个月我花了一些时间来创建并与大家分享我在2020年管理个人服务器的完美新设置!

所以,让我们开始吧。第一步是创建一个GPG密钥。这个密钥将用于加密我们拥有的每一个秘密,以便能够在git存储库中提交它们。有了git内部的秘密,我们的存储库将能够独立运行,并且可以跨机器移植。我们将能够进行git克隆并开始工作!

这个GPG密钥将是你的基础设施的守护者,如果它泄露了,任何人都可以访问你的基础设施。所以把它放在安全的地方

现在我们有了PGP密钥,我们将使用这个非常棒的工具SOPS来加密我们的秘密。

SOPS不是很出名,但非常实用和易于使用,这对于一个安全工具来说是一个很好的加分。

在那之后,只需调用SOPS来用您的GPG密钥创建一个新的秘密即可。SOPS强制使用YAML,因此您的文件需要是有效的YAML。

ECCmkdir Secret_Deccrypted❯SOPS Secret/foobar.yml*编辑器使用默认值*❯猫机密/foorbar.yml#文件内容不加密:enc[AES256_GCM,ECC[AES256_GCM,ENTC[AES256_GCM,ENTC[AES256_GCM,FORBAR.YML==,...。

还有其他命令允许您避免将解密的机密转储到文件系统。如果您对此功能感兴趣,请查看。

现在我们可以在存储库中安全地存储秘密,是时候生成一个新的ssh密钥,以便能够登录到我们未来的下一台服务器。

我们将为ssh密钥设置密码短语,并使用ssh代理/密钥链,以避免每次都输入密码。

#不要忘记设置一个强密码,并将密钥的默认名称从id_rsa更改为其他名称,稍后在ssh-keygen#将ssh ke添加到密钥环eval$(keychain--val--Agents ssh~/.ssh/you_Private_key)会很有用。(=

SOPS secrets/ssh.yml#编辑YAML文件以获得私钥和公钥的2个部分#将密钥的内容粘贴到此部分中它添加秘密/ssh.ymlgit Commit-m';添加ssh密钥';

现在,我们希望这个存储库是自包含的,并且可以方便地跨机器移植。一种有效的方法是使用Ansible来自动化我们的部署。但是在这个设置中,我们不会充分利用配置管理的全部功能,所以我选择使用一个简单的Makefile来自动化部署。

❯mkdir配置❯猫生成文件。PHONY:安装:SOPS-d--提取#39;[";公钥#34;]';--输出~/.ssh/erebe_rsa.pub secrets/ssh.yml sops-d--提取';[";私有密钥";]';--输出~/.ssh/erebe_rsa.key secre.s。*grep-q erebe.eu~/.ssh/config>;/dev/null 2>;&;1||cat config/ssh_client_config>;>;~/.ssh/config mkdir~/.kube||退出0。

安装部分正在解密ssh密钥,安装它们,然后查看我的~/.ssh/config,看看我的服务器是否已经有一个部分,以便在丢失时添加它。这样,我就能够执行ssh my-server,并正确设置所有内容。

我们有一个git存储库和我们的ssh密钥,所以现在是时候使用这些密钥并得到一个真正的服务器来支持它了。

就我个人而言,我使用的是Online.net的一级包厢,现在更名为scaleway,每月8欧元。他们的机器坚如磐石,价格便宜,15年多来从未出过问题。你可以自由选择你想要的任何供应商,但我在这里推荐给你看的东西。

磁盘空间:使用容器会消耗大量磁盘空间。因此,就拿一台至少有60G空间的机器来说吧。

公共带宽限制:所有托管公司都会限制公共带宽,以避免Torrent种子盒出现问题。同样的价格越高越好(比如:Sceway提供250Mbit/s,而OVH只提供200Mbit/s)

免费备份存储:在某一时刻,我们将有数据要备份,因此请查看他们是否为备份提供了一些外部存储。

域名/免费邮件帐户:如果您计划使用它们作为您的域名的注册商,请查看它们是否可以为您提供电子邮件帐户存储,以便将它们配置为后备,以不丢失邮件。

一旦您有了服务器提供商,请进行安装并选择Debian作为操作系统。在某个时刻,我们会要求您提供ssh密钥,因此请提供您之前创建的密钥。如果可以选择文件系统,请使用XFS而不是ext4,因为它提供了很好的支持。

机器已经就位,外界可以接触到。首先要做的是保护好它!我们希望:

Host=${my-server}.PHONY:安装程序包#...程序包:SSH${host}';apt-get update&;&;apt-get install-y curl HTOP MTR Tcpump ncdu vim dnsutils strace linux-perf iftop;#启用自动安全更新ssh${host。

这样,计算机将自行安装安全更新,而不需要我们手动键入apt-get update&;&;apt-get upgrade。

下一步是提高ssh服务器的安全性。我们将禁用密码身份验证,只允许公钥身份验证。因为我们的ssh密钥在我们的存储库中是加密的,所以只要我们拥有GPG密钥,如果需要,它们将始终可用。

因为我不使用任何配置管理(即:Ansible),所以使用普通用户并利用权限提升(Sudo)在根目录下执行操作有点单调乏味。因此,我允许以超级用户身份登录SSH服务器,以便于管理。如果您计划使用配置管理系统,请禁用超级用户登录身份验证。

警告:在执行此操作之前,请确保您能够正确地使用ssh密钥登录,否则您将需要重新安装您的机器/使用主机提供商的救援控制台来修复问题。

❯生成文件。PHONY:安装程序包ssh#...#检查该文件是否与我们的GIT存储库不同,如果是,请重新上传并重新启动ssh服务器:ssh${HOST}";cat/etc/ssh/sshd_config";|diff-config/sshd_config\||(scp config/sshd_config${host}:/etc/ssh/sshd_config&;&。

该计划的最后一部分是通过制定防火墙规则来保护网络安全。

我想要接近真实情况,所以我直接使用iptable来创建我的防火墙规则。这是以不得不复制IPv4和IPv6的规则为代价的。

我们希望iptable规则的部署是幂等的,因此我们将创建自定义链以避免干扰默认规则。此外,我将直接使用iptable命令而不是iptable-Restore,因为iptable-Restore文件需要是整体的,并且当程序只管理防火墙规则的一个子部分时不能很好地组合。由于我们稍后将安装Kubernetes,它将允许我们避免扰乱代理规则。

#!/bin/sh#仅当它用于我们的主NIC[";$iFace";!=";enp1s0";]|退出0#以便从Online获取IPv6租约。netsysctl-w net.ipv6.conf.enp1s0.ept_ra=2#重置我们的自定义链表-P输入ACCEPTipables-D INPUT-j user_。N user_Custom#Allow Loopback Interfaceipables-A user_Custom-i lo-j Accept#Allow Wireguard Interfaceipables-A user_Custom-i wg0-j Accept#Allow Kubernetes InterfaceSipables-A user_Custom-I cni0-j ACCEPTipables-A user_Custom-I flannel.1-j Accept#Allow Allow Alternated ConnectionSapeipables-A user_Custom-p tcp-m Connail-ctc-ctcstate established,Related-j ACCEPTipables-A user_Custom-p UDP-m ConnTrack--ctstate established,Related-j ACCEPTipables-A user_Custom-p ICMP-m ConnTrack--ctstate established,Related-j Accept#Accept传入ICMP-服务器提供程序使用ping来监视机器识别表-A user_Custom-p ICMP-j Accept#Allow sShipables-A user_Custom-p tcp--dport 22-j Accept#Allow http/Http-p TCP--dport 80-j ACCEPTipables-A user_Custom-p TCP--dport 443-j Accept#Allow SMTP and IMAPiptable-A user_Custom-p TCP--dport 443-j Accept#Allow SMTP and IMAPiptable-A user_Custom-p TCP--dport 443-j Accept#Allow SMTP and IMAPiptable。#Allow wireguardiptable-A user_CUSTOM-p UDP--dport 995-j Accept#Allow Kubernetes k3S API serverables-A user_Custom-p tcp--dport 6443-j Accept#添加自定义链接表-i输入1-j user_Custom#如果没有匹配表-P输入丢弃,默认情况下丢弃传入流量#IPv6#对ip6table而不是iptabtable执行相同的操作。如果您的提供商支持itip6table--A user_Custom-p UDP--dport 546-j ACCEPTip6ables--icmpv6-type路由器-advertisement-j ACCEPTip6table--icmpv6--A user_Custom-p icmpv6--icmpv6-type Router-Solication-j ACCEPTip6ables--A user_Custom-p icmpv6--icmpv6--icmpv6-type路由器-请求-j ACCEPTip6ables--dport 546--j ACCEPTip6ables--icmpv6--icmpv6。A user_Custom-p icmpv6--icmpv6-type ECHO-REPLY-j Accept。

我不会限制ssh连接的速率,因为大多数时候是我受到了这个限制。如今,大多数僵尸扫描ssh服务器都足够聪明,能够计时以避免速率受限。即使我们只允许公钥身份验证,一些僵尸也会没完没了地尝试连接到我们的SSH服务器,希望有一天会出现漏洞。就像海浪不知疲倦地拍打着海岸。

--A user_Custom-p tcp-m ConnTrack--ctstate new--dport 22-m recent--set--name SSH-A user_Custom-p tcp-m ConnTrack--ctstate new--dport 22-m recent--update--秒60--HitCount 4--rtl--name SSH-j drop--A user_Custom-p tcp-m ConnTrack--ctstate new--dport 22-j Accept

我们将在if-pre-up中部署这些规则,以便在机器重新启动时自动恢复它们。因为这些规则是幂等的,所以我们在调用它们时强制执行它们,以确保它们到位。

现在我们已经配置了服务器,并且安全性更高了,我们想为它分配一个可爱的DNS名称,而不仅仅是它的IP地址。如果您不知道什么是DNS,请参阅:

我个人使用Gandi.net,因为他们提供带有域名的免费邮箱。当我在服务器上运行Postfix/邮件服务器来接收和存储电子邮件时,为了避免设置和管理繁琐的DKIM,我使用Gandi SMTP邮件服务器来发送电子邮件,并且被信任/不会成为垃圾邮件。在后面的设置邮件服务器中将详细介绍这一点。

传播速度应该足够快(如果您计划对通配符使用LET的加密DNS质询)。

这个很简单,只需要获取如何使用注册商的API的信息。对于甘迪,我们将使用他们的cli gandi,并以纯文本文件的形式管理我们的区域。

@10800在SOA ns1.gandi.net中。Hostmaster.gandi.net。1579092697 10800 3600 604800 10800@10800 in A 195.154.119.61@10800 in AAA2001:bc8:3d8f::cae@10800 in MX 1 mail.erebe.eu.@10800 in MX 10 spool.mail.gandi.net@10800 in MX 50 fb.mail.gandi.net.api 10800 in A 195.154.119.61api 10800 in A 195.154.119.61api 10800 in AAA2001:bc8:3d8f::cae。

根据您的注册商、FAI和您在您的记录上设置的TTL,新记录可能需要相当长的时间才能传播/更新到任何地方,所以请耐心等待!

我们现在有一个安全的服务器,附加了域名,我们可以轻松地重新部署。

下一步是在上面安装Kubernetes。选择Kubernetes可能会引起一些争议,因为它只在一台机器上使用。Kubernetes是一个容器协调器,所以您只能在管理一组服务器时充分利用它的能力。此外,运行vanilla Kubernetes需要安装etcd和其他重量级组件,以及配置每个模块的一些困难,以便它们能够正常工作。

来看看K3S,它是一个经过修剪和打包的库伯内斯集群(Kubernetes Cluster),包含在一个二进制文件中。这个奇迹是集装箱运营商世界上最大的参与者之一牧场主实验室买给我们的。他们为您做出了决定(将etcd替换为SQLite、网络覆盖、负载均衡器等)。为了使k3尽可能更小、更易于设置,同时又是100%兼容的Kubernetes集群。

在我的服务器上安装Kubernetes的主要好处是,它允许我为所有部署提供一个标准界面,将所有内容存储在Git中,并允许我在开发项目时利用其他工具,如skaffold。

警告:安装完毕后,仅运行Kubernetes服务器组件就会在我的英特尔(R)Atom(TM)CPU [email protected] GHz上增加10%的CPU。因此,如果您已经受CPU限制,请不要使用它或扩展您的服务器。

KUBNETES_INSTALL:ssh${HOST}';EXPORT INSTALL_K3S_EXEC=";--不部署服务b--不部署traefik--不-部署本地存储";;\curl-sfl https://get.k3s.io|sh-';

Servicelb所有东西都将位于同一台计算机上,因此不需要进行负载平衡,大多数情况下,我们还将通过尽可能直接使用主机网络来避免网络覆盖。

Traefik我有更多使用nginx/HAProxy进行反向代理的经验,所以我打算使用nginx入口控制器来代替Traefik。

本地存储此应用程序用于自动为您的主机创建本地卷(PV),因为我们只有一台计算机,我们将绕过这一复杂性,只使用HostPath卷

并检查您的服务器是否处于就绪状态(可能需要一些时间)。如果是这样的话,恭喜你!你有一架库伯内斯控制机在工作!

现在已经完成了这项工作,我们需要自动设置kubeconfig安装。

在您的服务器上,复制Kube配置文件/etc/rancher/k3s/k3s.yaml的内容,并使用secrets/Kubernetes-config.yml下的sop对其进行加密。请确保将配置中的127.0.0.1替换为服务器的IP/域名。

如果您正确地进行了操作,并且在本地计算机上安装了kubectl,则应该能够执行以下操作。

我有许多喜欢的小项目,它们公开了一个我想要向Internet其余部分公开的HTTP端点,因为我已经阻止了端口80和443以外的所有传入流量,因此我需要多路传输这两个端口下的每个应用程序。为此,我需要安装一个反向代理,也将做TLS终止。

由于我在k3s安装期间禁用了默认的反向代理Traefik,所以我需要安装我自己的。我选择了恩吉克斯。我非常了解HaProxy,知道它是可靠的,也是Kubernetes上两者中最成熟的。

要将其安装到您的K3S集群上,可以使用Helm图表,也可以直接使用Kube应用。请参阅裸机安装指南。

警告:请勿直接从文档ngix-inress批注复制粘贴,该批注不是真正的批注,您的批注将无法识别🤦。

我还将编辑部署,以便Nginx反向代理使用HostNetwork并避免通过网络覆盖。在上面的YAML文件中,将DNS策略值替换为ClusterFirstWithHostNet,并添加一个新条目hostNetwork:true,以便容器直接使用您的网卡而不是虚拟接口。

如果您使用的是舵图,则会有一个变量/标志来切换主机网络的使用情况。将YAML文件保存在您的资源库中。

.