蚊章汇 - Carla Schroder
type: channel
link: https://linuxcn.bwsl.wang/author/39/
description: Carla Schroder
items: 在 Linux 上用 DNS 实现简单的负载均衡
items: 使用 Quagga 实现 Linux 动态路由
items: 四个 Linux 上的网络信息嗅探工具
items: Linux 局域网路由新手指南：第 2 部分
items: Linux 局域网路由新手指南：第 1 部分
items: 在 KVM 中测试 IPv6 网络：第 2 部分
items: 在 KVM 中测试 IPv6 网络（第 1 部分）
items: 使用 Let's Encrypt 保护你的网站
items: 如何在 Linux 上运行你自己的公共时间服务器
items: 在 Linux 上使用 NTP 保持精确的时间

在 Linux 上用 DNS 实现简单的负载均衡
type: item
date: 2018-06-25T07:06:28+08:00
description: DNS 轮询将多个服务器映射到同一个主机名，并没有为这里展示的魔法做更多的工作。如果你的后端服务器是由多台服务器构成的，比如集群化或者镜像的 Web 或者文件服务器，通过负载均衡器提供了单一的入口点。业务繁忙的大型电商在高端负载均衡器上花费了大量的资金，用它来执行各种各样的任务：代理、缓存、状况检查、SSL 处理、可配置的优先级、流量整形等很多任务。但是你并不需要做那么多工作的负载均衡器。你需要的是一个跨服务器分发负载的简单方法，它能够提供故障切换，并且不太在意它是否高效和完美。DNS 轮询和使用轮询的子域委派是实现这个目标的两种简单方法。DNS 轮询是将多台服务器映射到同一个主机名上，当用户访问 foo.example.com 时多台服务器都可用于处理它们的请求，使用的就是这种方式。当你有多个子域或者你的服务器在地理上比较分散时，使用轮询的子域委派就比较有用。你有一个主域名服务器，而子域有它们自己的域名服务器。你的主域名服务器将所有的到子域的请求指向到它们自己的域名服务器上。这将提升响应时间，因为 DNS 协议会自动查找最快的链路。DNS 轮询轮询和 旅鸫鸟 robins 没有任何关系，据我相熟的图书管理员说，它最初是一个法语短语，ruban rond、或者 round ribbon。很久以前，法国政府官员以不分级的圆形、波浪线、或者直线形状来在请愿书上签字，以盖住原来的发起人。DNS 轮询也是不分级的，简单配置一个服务器列表，然后将请求转到每个服务器上。它并不做真正的负载均衡，因为它根本就不测量负载，也没有状况检查，因此如果一个服务器宕机，请求仍然会发送到那个宕机的服务器上。它的优点就是简单。如果你有一个小的文件或者 Web 服务器集群，想通过一个简单的方法在它们之间分散负载，那么 DNS 轮询很适合你。你所做的全部配置就是创建多条 A 或者 AAAA 记录，映射多台服务器到单个的主机名。这个 BIND 示例同时使用了 IPv4 和 IPv6 私有地址类：fileserv.example.com. IN A 172.16.10.10 fileserv.example.com. IN A 172.16.10.11 fileserv.example.com. IN A 172.16.10.12 fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::10 fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::11 fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::12 Dnsmasq 在 /etc/hosts 文件中保存 A 和 AAAA 记录：172.16.1.10 fileserv fileserv.example.com 172.16.1.11 fileserv fileserv.example.com 172.16.1.12 fileserv fileserv.example.com fd02:faea:f561:8fa0:1::10 fileserv fileserv.example.com fd02:faea:f561:8fa0:1::11 fileserv fileserv.example.com fd02:faea:f561:8fa0:1::12 fileserv fileserv.example.com 请注意这些示例都是很简化的，解析完全合格域名有多种方法，因此，关于如何配置 DNS 请自行学习。使用 dig 命令去检查你的配置能否按预期工作。将 ns.example.com 替换为你的域名服务器：$ dig @ns.example.com fileserv A fileserv AAA 它将同时显示出 IPv4 和 IPv6 的轮询记录。子域委派和轮询子域委派结合轮询要做的配置会更多，但是这样有一些好处。当你有多个子域或者地理位置比较分散的服务器时，就应该去使用它。它的响应时间更快，并且宕机的服务器不会去响应，因此客户端不会因为等待回复而被挂住。一个短的 TTL，比如 60 秒，就能帮你做到。这种方法需要多台域名服务器。在最简化的场景中，你需要一台主域名服务器和两个子域，每个子域都有它们自己的域名服务器。在子域服务器上配置你的轮询记录，然后在你的主域名服务器上配置委派。在主域名服务器上的 BIND 中，你至少需要两个额外的配置，一个区声明以及在区数据文件中的 A/AAAA 记录。主域名服务器中的委派应该像如下的内容：ns1.sub.example.com. IN A 172.16.1.20 ns1.sub.example.com. IN AAAA f…

使用 Quagga 实现 Linux 动态路由
type: item
date: 2018-06-03T18:56:00+08:00
description: 学习如何使用 Quagga 套件的路由协议去管理动态路由。迄今为止，本系列文章中，我们已经在 Linux 局域网路由新手指南：第 1 部分 中学习了复杂的 IPv4 地址，在 Linux 局域网路由新手指南：第 2 部分 中学习了如何去手工创建静态路由。今天，我们继续使用 Quagga 去管理动态路由，这是一个安装完后就不用理它的的软件。Quagga 是一个支持 OSPFv2、OSPFv3、RIP v1 和 v2、RIPng、以及 BGP-4 的路由协议套件，并全部由 zebra 守护程序管理。OSPF 的意思是 最短路径优先 Open Shortest Path First 。OSPF 是一个内部网关协议（IGP）;它可以用在局域网和跨因特网的局域网互联中。在你的网络中的每个 OSPF 路由器都包含整个网络的拓扑，并计算通过网络的最短路径。OSPF 会通过多播的方式自动对外传播它检测到的网络变化。你可以将你的网络分割为区域，以保持路由表的可管理性；每个区域的路由器只需要知道离开它的区域的下一跳接口地址，而不用记录你的网络的整个路由表。RIP，即路由信息协议，是一个很老的协议，RIP 路由器向网络中周期性多播它的整个路由表，而不是像 OSPF 那样只多播网络的变化。RIP 通过跳数来测量路由，任何超过 15 跳的路由它均视为不可到达。RIP 设置很简单，但是 OSPF 在速度、效率以及弹性方面更佳。BGP-4 是边界网关协议版本 4。这是用于因特网流量路由的外部网关协议（EGP）。你不会用到 BGP 协议的，除非你是因特网服务提供商。准备使用 OSPF在我们的小型 KVM 测试实验室中，用两台虚拟机表示两个不同的网络，然后将另一台虚拟机配置为路由器。创建两个网络：net1 是 192.168.110.0/24 ，而 net2 是 192.168.120.0/24。启用 DHCP 是明智的，否则你要分别进入这三个虚拟机，去为它们设置静态地址。Host 1 在 net1 中，Host 2 在 net2 中，而路由器同时与这两个网络连接。设置 Host 1 的网关地址为 192.168.110.126，Host 2 的网关地址为 192.168.120.136。Host 1： 192.168.110.125Host 2：192.168.120.135Router：192.168.110.126 和 192.168.120.136在路由器上安装 Quagga。在大多数 Linux 中它是 quagga 软件包。在 Debian 上还有一个单独的文档包 quagga-doc。取消 /etc/sysctl.conf 配置文件中如下这一行的注释去启用包转发功能：net.ipv4.ip_forward=1 然后，运行 sysctl -p 命令让变化生效。配置 Quagga查看你的 Quagga 包中的示例配置文件，比如，/usr/share/doc/quagga/examples/ospfd.conf.sample。除非你的 Linux 版本按你的喜好做了创新，否则，一般情况下配置文件应该在 /etc/quagga 目录中。大多数 Linux 版本在这个目录下有两个文件，vtysh.conf 和 zebra.conf。它们提供了守护程序运行所需要的最小配置。除非你的发行版做了一些特殊的配置，否则，zebra 总是首先运行，当你启动 ospfd 的时候，它将自动启动。Debian/Ubuntu 是一个特例，稍后我们将会说到它。每个路由器守护程序将读取它自己的配置文件，因此，我们必须创建 /etc/quagga/ospfd.conf，并输入如下内容：!/etc/quagga/ospfd.conf hostname router1 log file /var/log/quagga/ospfd.log router ospf ospf router-id 192.168.110.15 network 192.168.110.0/0 area 0.0.0.0 network 192.168.120.0/0 area 0.0.0.0 access-list localhost permit 127.0.0.1/32 access-list localhost deny any line vty access-class localhost 你可以使用感叹号（!）或者井号（#）去注释掉这些行。我们来快速浏览一下这些选项。hostname 可以是你希望的任何内容。这里不是一般意义上的 Linux 主机名，但是，当你使用 vtysh 或者 telnet 登入时，你将看到它们。log file 是你希望用于保存日志的任意文件。router 指定路由协议。ospf…

四个 Linux 上的网络信息嗅探工具
type: item
date: 2018-05-30T13:19:00+08:00
description: 在计算机网络中，数据是暴露的，因为数据包传输是无法隐藏的，所以让我们来使用 whois、dig、nmcli 和 nmap 这四个工具来嗅探网络吧。请注意，不要在不属于自己的网络上运行 nmap ，因为这有可能会被其他人认为恶意攻击。精简和详细域名信息查询您可能已经注意到，之前我们用常用的老式 whois 命令查询域名信息，但现如今似乎没有提供同过去一样的详细程度。我们使用该命令查询 linux.com 的域名描述信息：$ whois linux.com Domain Name: LINUX.COM Registry Domain ID: 4245540_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.namecheap.com Registrar URL: http://www.namecheap.com Updated Date: 2018-01-10T12:26:50Z Creation Date: 1994-06-02T04:00:00Z Registry Expiry Date: 2018-06-01T04:00:00Z Registrar: NameCheap Inc. Registrar IANA ID: 1068 Registrar Abuse Contact Email: abuse@namecheap.com Registrar Abuse Contact Phone: +1.6613102107 Domain Status: ok https://icann.org/epp#ok Name Server: NS5.DNSMADEEASY.COM Name Server: NS6.DNSMADEEASY.COM Name Server: NS7.DNSMADEEASY.COM DNSSEC: unsigned [...] 有很多令人讨厌的法律声明。但在哪有联系信息呢？该网站位于 whois.namecheap.com 站点上（见上面输出的第三行）：$ whois -h whois.namecheap.com linux.com 我就不复制出来了，因为这实在太长了，包含了注册人，管理员和技术人员的联系信息。怎么回事啊，露西尔？（LCTT 译注：《行尸走肉》中尼根的棒子）有一些注册库，比如 .com 和 .net 是精简注册库，保存了一部分有限的域名信息。为了获取完整信息请使用 -h 或 --host 参数，该参数便会从域名的 注册服务机构 中获取。大部分顶级域名是有详细的注册信息，如 .info。试着使用 whois blockchain.info 命令来查看。想要摆脱这些烦人的法律声明？使用 -H 参数。DNS 解析使用 dig 命令比较从不同的域名服务器返回的查询结果，去除陈旧的信息。域名服务器记录缓存各地的解析信息，并且不同的域名服务器有不同的刷新间隔。以下是一个简单的用法：$ dig linux.com <<>> DiG 9.10.3-P4-Ubuntu <<>> linux.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<<- opcode: QUERY, status: NOERROR, id: 13694 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1440 ;; QUESTION SECTION: ;linux.com. IN A ;; ANSWER SECTION: linux.com. 10800 IN A 151.101.129.5 linux.com. 10800 IN A 151.101.65.5 linux.com. 10800 IN A 151.101.1.5 linux.com. 10800 IN A 151.101.193.5 ;; Query time: 92 msec ;; SERVER: 127.0.1.1#53(127.0.1.1) ;; WHEN: Tue Jan 16 15:17:04 PST 2018 ;; MSG SIZE rcvd: 102 注意下靠近末尾的这行信息：SERVER: 127.0.1.1#53(127.0.1.1)，这是您默认的缓存解析器。当地址是本地时，就表明您的电脑上安装了 DNS 服务。在我看来这就是一个 Dnsmasq 工具（LCTT 译注：是一个小巧且方便地用于配置 DNS 和 DHCP 的工具），该工具被用作网络管理：$ ps…

Linux 局域网路由新手指南：第 2 部分
type: item
date: 2018-05-24T17:09:00+08:00
description: 上周 我们学习了 IPv4 地址 和如何使用管理员不可或缺的工具 —— ipcalc，今天我们继续学习更精彩的内容：局域网路由器。VirtualBox 和 KVM 是测试路由的好工具，在本文中的所有示例都是在 KVM 中执行的。如果你喜欢使用物理硬件去做测试，那么你需要三台计算机：一台用作路由器，另外两台用于表示两个不同的网络。你也需要两台以太网交换机和相应的线缆。我们假设这个示例是一个有线以太局域网，为了更符合真实使用场景，我们将假设有一些桥接的无线接入点，当然我并不会使用这些无线接入点做任何事情。（我也不会去尝试所有的无线路由器，以及使用一个移动宽带设备连接到以太网的局域网口进行混合组网，因为它们需要进一步的安装和设置）网段最简单的网段是两台计算机连接在同一个交换机上的相同地址空间中。这样两台计算机不需要路由器就可以相互通讯。这就是我们常说的术语 —— “广播域”，它表示所有在相同的网络中的一组主机。它们可能连接到一台单个的以太网交换机上，也可能是连接到多台交换机上。一个广播域可以包括通过以太网桥连接的两个不同的网络，通过网桥可以让两个网络像一个单个网络一样运转。无线访问点一般是桥接到有线以太网上。一个广播域仅当在它们通过一台网络路由器连接的情况下，才可以与不同的广播域进行通讯。简单的网络以下示例的命令并不是永久生效的，重启之后你所做的改变将会消失。一个广播域需要一台路由器才可以与其它广播域通讯。我们使用两台计算机和 ip 命令来解释这些。我们的两台计算机是 192.168.110.125 和 192.168.110.126，它们都插入到同一台以太网交换机上。在 VirtualBox 或 KVM 中，当你配置一个新网络的时候会自动创建一个虚拟交换机，因此，当你分配一个网络到虚拟虚拟机上时，就像是插入一个交换机一样。使用 ip addr show 去查看你的地址和网络接口名字。现在，这两台主机可以互 ping 成功。现在，给其中一台主机添加一个不同网络的地址：# ip addr add 192.168.120.125/24 dev ens3 你可以指定一个网络接口名字，在示例中它的名字是 ens3。这不需要去添加一个网络前缀，在本案例中，它是 /24，但是显式地添加它并没有什么坏处。你可以使用 ip 命令去检查你的配置。下面的示例输出为了清晰其见进行了删减：$ ip addr show ens3: inet 192.168.110.125/24 brd 192.168.110.255 scope global dynamic ens3 valid_lft 875sec preferred_lft 875sec inet 192.168.120.125/24 scope global ens3 valid_lft forever preferred_lft forever 主机在 192.168.120.125 上可以 ping 它自己（ping 192.168.120.125），这是对你的配置是否正确的一个基本校验，这个时候第二台计算机就已经不能 ping 通那个地址了。现在我们需要做一些网络变更。添加第三台主机作为路由器。它需要两个虚拟网络接口并添加第二个虚拟网络。在现实中，你的路由器必须使用一个静态 IP 地址，但是现在，我们可以让 KVM 的 DHCP 服务器去为它分配地址，所以，你仅需要两个虚拟网络：第一个网络：192.168.110.0/24第二个网络：192.168.120.0/24接下来你的路由器必须配置去转发数据包。数据包转发默认是禁用的，你可以使用 sysctl 命令去检查它的配置：$ sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 0 意味着禁用，使用如下的命令去启用它：# echo 1 > /proc/sys/net/ipv4/ip_forward 接下来配置你的另一台主机做为第二个网络的一部分，你可以通过将原来在 192.168.110.0/24 的网络中的一台主机分配到 192.168.120.0/24 虚拟网络中，然后重新启动两个 “连网的” 主机，注意不是路由器。（或者重启动主机上的网络服务；我年龄大了还有点懒，我记不住那些重启服务的奇怪命令，还不如重启主机来得干脆。）重启后各台机器的地址应该如下所示：主机 1： 192.168.110.125主机 2： 192.168.120.135路由器： 192.168.110.126 和 192.168.120.136现在可以去随意 ping 它们，可以从任何一台计算机上 ping 到任何一台其它计算机上。使用虚拟机和各种 Linux 发行版做这些事时，可能会产生一些意想不到的问题，因此，有时候 pi…

Linux 局域网路由新手指南：第 1 部分
type: item
date: 2018-05-19T18:44:37+08:00
description: 前面我们学习了 IPv6 路由。现在我们继续深入学习 Linux 中的 IPv4 路由的基础知识。我们从硬件概述、操作系统和 IPv4 地址的基础知识开始，下周我们将继续学习它们如何配置，以及测试路由。局域网路由器硬件Linux 实际上是一个网络操作系统，一直都是，从一开始它就有内置的网络功能。要将你的局域网连入因特网，构建一个局域网路由器比起构建网关路由器要简单的多。你不要太过于执念安全或者防火墙规则，对于处理网络地址转换（NAT）它还是比较复杂的，NAT是 IPv4 的一个痛点。我们为什么不放弃 IPv4 去转到 IPv6 呢？这样将使网络管理员的工作更加简单。有点跑题了。从理论上讲，你的 Linux 路由器是一个至少有两个网络接口的小型机器。Linux Gizmos 有一个很大的单板机名单：98 个开放规格、适于黑客的 SBC 的目录。你能够使用一个很老的笔记本电脑或者台式计算机。你也可以使用一个紧凑型计算机，像 ZaReason Zini 或者 System76 Meerkat 一样，虽然这些有点贵，差不多要 $600。但是它们又结实又可靠，并且你不用在 Windows 许可证上浪费钱。如果对路由器的要求不高，使用树莓派 3 Model B 作为路由器是一个非常好的选择。它有一个 10/100 以太网端口，板载 2.4GHz 的 802.11n 无线网卡，并且它还有四个 USB 端口，因此你可以插入多个 USB 网卡。USB 2.0 和低速板载网卡可能会让树莓派变成你的网络上的瓶颈，但是，你不能对它期望太高（毕竟它只有 $35，既没有存储也没有电源）。它支持很多种风格的 Linux，因此你可以选择使用你喜欢的版本。基于 Debian 的树莓派是我的最爱。操作系统你可以在你选择的硬件上安装将你喜欢的 Linux 的简化版，因为定制的路由器操作系统，比如 OpenWRT、 Tomato、DD-WRT、Smoothwall、Pfsense 等等，都有它们自己的非标准界面。我的观点是，没有必要这么麻烦，它们对你并没有什么帮助。尽量使用标准的 Linux 工具，因为你只需要学习它们一次就够了。Debian 的网络安装镜像大约有 300MB 大小，并且支持多种架构，包括 ARM、i386、amd64 和 armhf。Ubuntu 的服务器网络安装镜像也小于 50MB，这样你就可以控制你要安装哪些包。Fedora、Mageia、和 openSUSE 都提供精简的网络安装镜像。如果你需要创意，你可以浏览 Distrowatch。路由器能做什么我们需要网络路由器做什么？一个路由器连接不同的网络。如果没有路由，那么每个网络都是相互隔离的，所有的悲伤和孤独都没有人与你分享，所有节点只能孤独终老。假设你有一个 192.168.1.0/24 和一个 192.168.2.0/24 网络。如果没有路由器，你的两个网络之间不能相互沟通。这些都是 C 类的私有地址，它们每个都有 254 个可用网络地址。使用 ipcalc 可以非常容易地得到它们的这些信息：$ ipcalc 192.168.1.0/24 Address: 192.168.1.0 11000000.10101000.00000001. 00000000 Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000 Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111 => Network: 192.168.1.0/24 11000000.10101000.00000001. 00000000 HostMin: 192.168.1.1 11000000.10101000.00000001. 00000001 HostMax: 192.168.1.254 11000000.10101000.00000001. 11111110 Broadcast: 192.168.1.255 11000000.10101000.00000001. 11111111 Hosts/Net: 254 Class C, Private Internet 我喜欢 ipcalc 的二进制输出信息，它更加可视地表示了掩码是如何工作的。前三个八位组表示了网络地址，第四个八位组是主机地址，因此，当你分配主机地址时，你将 “掩盖” 掉网络地址部分，只使用剩余的主机部分。你的两个网络有不同的网络地址，而这就是如果两个网络之间没有路由器它们就不能互相通讯的原因。每个八位组一共有 256 字节，但是它们并不能提供 256 个主机地址，因为第一个和最后一个值 ，也就是 0 和 255，是被保留的。0 是网络标识…

在 KVM 中测试 IPv6 网络：第 2 部分
type: item
date: 2018-05-18T05:52:57+08:00
description: 我们又见面了，在上一篇 在 KVM 中测试 IPv6 网络：第 1 部分 中，我们学习了有关 IPv6 私有地址的内容。今天，我们将使用 KVM 创建一个网络，去测试上一星期学习的 IPv6 的内容。如果你想重新温习如何使用 KVM，可以查看 在 KVM 中创建虚拟机：第 1 部分 和 在 KVM 中创建虚拟机：第 2 部分— 网络。在 KVM 中创建网络在 KVM 中你至少需要两个虚拟机。当然了，如果你愿意，也可以创建更多的虚拟机。在我的系统中有 Fedora、Ubuntu、以及 openSUSE。去创建一个新的 IPv6 网络，在主虚拟机管理窗口中打开 “Edit > Connection Details > Virtual Networks”。点击左下角的绿色十字按钮去创建一个新的网络（图 1）。图 1：创建一个网络给新网络输入一个名字，然后，点击 “Forward” 按钮。如果你愿意，也可以不创建 IPv4 网络。当你创建一个新的 IPv4 网络时，虚拟机管理器将不让你创建重复网络，或者是使用了一个无效地址。在我的宿主机 Ubuntu 系统上，有效的地址是以绿色高亮显示的，而无效地址是使用高亮的玫瑰红色调。在我的 openSUSE 机器上没有高亮颜色。启用或不启用 DHCP，以及创建或不创建一个静态路由，然后进入下一个窗口。选中 “Enable IPv6 network address space definition”，然后输入你的私有地址范围。你可以使用任何你希望的 IPv6 地址类，但是要注意，不能将你的实验网络泄漏到公网上去。我们将使用非常好用的 IPv6 唯一本地地址（ULA），并且使用在 Simple DNS Plus 上的在线地址生成器，去创建我们的网络地址。拷贝 “Combined/CID” 地址到网络框中（图 2）。图 2：拷贝 "Combined/CID" 地址到网络框中虚拟机认为我的地址是无效的，因为，它显示了高亮的玫瑰红色。它做的对吗？我们使用 ipv6calc 去验证一下：$ ipv6calc -qi fd7d:844d:3e17:f3ae::/64 Address type: unicast, unique-local-unicast, iid, iid-local Registry for address: reserved(RFC4193#3.1) Address type has SLA: f3ae Interface identifier: 0000:0000:0000:0000 Interface identifier is probably manual set ipv6calc 认为没有问题。如果感兴趣，你可以改变其中一个数字为无效的东西，比如字母 g，然后再试一次。（问 “如果…？”，试验和错误是最好的学习方法）。我们继续进行，启用 DHCPv6（图 3）。你可以接受缺省值，或者输入一个你自己的设置值。图 3： 启用 DHCPv6我们将跳过缺省路由定义这一步，继续进入下一屏，在那里我们将启用 “Isolated Virtual Network” 和 “Enable IPv6 internal routing/networking”。虚拟机网络选择现在，你可以配置你的虚拟机去使用新的网络。打开你的虚拟机，然后点击顶部左侧的 “i” 按钮去打开 “Show virtual hardware details” 屏幕。在 “Add Hardware” 列点击 “NIC” 按钮去打开网络选择器，然后选择你喜欢的新的 IPv6 网络。点击 “Apply”，然后重新启动。（或者使用你喜欢的方法去重新启动网络，或者更新你的 DHCP 租期。）测试ifconfig 告诉我们它做了什么？$ ifconfig ens3: flags=4163 UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 192.168.30.207 netmask 255.255.255.0 broadcast 192.168.30.255 inet6 fd7d:844d:3e17:f3ae::6314 prefixlen 128 scopeid 0x0 inet6 fe80::4821:5ecb:e4b4:d5fc prefixlen 64 scopeid 0x20 这是我们新的 ULA，fd7d:844d:3e17:f3ae::6314，它是自动生成的本地链路地址。如果你有兴趣，可以 ping 一下，ping 网络上的其它虚拟机：vm1 ~$ ping6 -c2 fd7d:844d:3e17:f3ae::2c9f PING fd7d:844d:3e17:f3ae::2c9f(fd7…

在 KVM 中测试 IPv6 网络（第 1 部分）
type: item
date: 2018-05-01T04:07:30+08:00
description: 在这个两篇的系列当中，我们将学习关于 IPv6 私有地址的知识，以及如何在 KVM 中配置测试网络。要理解 IPv6 地址是如何工作的，没有比亲自动手去实践更好的方法了，在 KVM 中配置一个小的测试实验室非常容易 —— 也很有趣。这个系列的文章共有两个部分，我们将学习关于 IPv6 私有地址的知识，以及如何在 KVM 中配置测试网络。QEMU/KVM/虚拟机管理器我们先来了解什么是 KVM。在这里，我将使用 KVM 来表示 QEMU、KVM、以及虚拟机管理器的一个组合，虚拟机管理器在 Linux 发行版中一般都内置了。简单解释就是，QEMU 模拟硬件，而 KVM 是一个内核模块，它在你的 CPU 上创建一个 “访客领地”，并去管理它们对内存和 CPU 的访问。虚拟机管理器是一个涵盖虚拟化和管理程序的图形工具。但是你不能被图形界面下 “点击” 操作的方式 “缠住” ，因为，它们也有命令行工具可以使用 —— 比如 virsh 和 virt-install。如果你在使用 KVM 方面没有什么经验，你可以从 在 KVM 中创建虚拟机：第 1 部分 和 在 KVM 中创建虚拟机：第 2 部分 - 网络 开始学起。IPv6 唯一本地地址在 KVM 中配置 IPv6 网络与配置 IPv4 网络很类似。它们的主要不同在于这些怪异的长地址。上一次，我们讨论了 IPv6 地址的不同类型。其中有一个 IPv6 单播地址类，fc00::/7（详细情况请查阅 RFC 4193），它类似于 IPv4 中的私有地址 —— 10.0.0.0/8、172.16.0.0/12、和 192.168.0.0/16。下图解释了这个唯一本地地址空间的结构。前 48 位定义了前缀和全局 ID，随后的 16 位是子网，剩余的 64 位是接口 ID：| 7 bits |1| 40 bits | 16 bits | 64 bits | +--------+-+------------+-----------+----------------------------+ | Prefix |L| Global ID | Subnet ID | Interface ID | +--------+-+------------+-----------+----------------------------+ 下面是另外一种表示方法，它可能更有助于你理解这些地址是如何管理的：| Prefix | Global ID | Subnet ID | Interface ID | +--------+--------------+-------------+----------------------+ | fd | 00:0000:0000 | 0000 | 0000:0000:0000:0000 | +--------+--------------+-------------+----------------------+ fc00::/7 共分成两个 /8 地址块，fc00::/8 和 fd00::/8。fc00::/8 是为以后使用保留的。因此，唯一本地地址通常都是以 fd 开头的，而剩余部分是由你使用的。L 位，也就是第八位，它总是设置为 1，这样它可以表示为 fd00::/8。设置为 0 时，它就表示为 fc00::/8。你可以使用 subnetcalc 来看到这些东西：$ subnetcalc fd00::/8 -n Address = fd00:: fd00 = 11111101 00000000 $ subnetcalc fc00::/8 -n Address = fc00:: fc00 = 11111100 00000000 RFC 4193 要求地址必须随机产生。你可以用你选择的任何方法来造出个地址，只要它们以 fd 打头就可以，因为 IPv6 范围非常大，它不会因为地址耗尽而无法使用。当然，最佳实践还是按 RFC 的要求来做。地址不能按顺序分配或者使用众所周知的数字。RFC 4193 包含一个构建伪随机地址生成器的算法，或者你可以找到各种在线生成器。唯一本地地址不像全局单播地址（它由你的因特网服务提供商分配）那样进行中心化管理，即使如此，发生地址冲突的可能性也是非常低的。当你需要去合并一些本地网络或者想去在不相关的私有网络之间路由时，这是一个非常好的优势。在同一个子网中，你可以混用唯一本地地址和全局单播地址。唯一本地地址是可路由的，并且它并不会因此要求对路由器做任何调整。但是，你应该在你的边界路由器和防火墙上配置为不允许它们离开你的网络，除非是在不同位置的两个私有网络之间。RFC4193 建议，不要混用全局单播地址的 AAAA 和 PTR 记录，因为虽然它们重复的机率非…

使用 Let's Encrypt 保护你的网站
type: item
date: 2018-04-24T05:15:00+08:00
description: 未加密的 HTTP 会话暴露于滥用之中，用 Let's Encrypt 把它们保护起来。曾几何时，通过证书授权机构搭建基本的 HTTPS 网站需要每年花费数百美元，而且搭建的过程复杂且容易出错。现在我们免费使用 Let's Encrypt，而且搭建过程也只需要几分钟。为何进行加密？为什么要加密网站呢？这是因为未经加密的 HTTP 会话可以被多种方式滥用：窃听用户数据包捕捉用户登录注入广告和“重要”消息注入木马注入 SEO 垃圾邮件和链接注入挖矿脚本网络服务提供商就是最大的代码注入者。那么如何挫败它们的非法行径呢？你最好的防御手段就是 HTTPS。让我们回顾一下 HTTPS 的工作原理。信任链你可以在你的网站和每个授权访问用户之间建立非对称加密。这是一种非常强的保护：GPG（GNU Privacy Guard， 参考如何在 Linux 中加密邮件)和 OpenSSH 就是非对称加密的通用工具。它们依赖于公钥-私钥对，其中公钥可以任意分享，但私钥必须受到保护且不能分享。公钥用于加密，私钥用于解密。但上述方法无法适用于随机的网页浏览，因为建立会话之前需要交换公钥，你需要生成并管理密钥对。HTTPS 会话可以自动完成公钥分发，而且购物或银行之类的敏感网站还会使用第三方证书颁发机构（CA）验证证书，例如 Comodo、 Verisign 和 Thawte。当你访问一个 HTTPS 网站时，网站给你的网页浏览器返回了一个数字证书。这个证书说明你的会话被强加密，而且提供了该网站信息，包括组织名称、颁发证书的组织和证书颁发机构名称等。你可以点击网页浏览器地址栏的小锁头来查看这些信息（图 1），也包括了证书本身。图1: 点击网页浏览器地址栏上的锁头标记查看信息包括 Opera、 Chromium 和 Chrome 在内的主流浏览器，验证网站数字证书的合法性都依赖于证书颁发机构。小锁头标记可以让你一眼看出证书状态；绿色意味着使用强 SSL 加密且运营实体经过验证。网页浏览器还会对恶意网站、SSL 证书配置有误的网站和不被信任的自签名证书网站给出警告。那么网页浏览器如何判断网站是否可信呢？浏览器自带根证书库，包含了一系列根证书，存储在 /usr/share/ca-certificates/mozilla/ 之类的地方。网站证书是否可信可以通过根证书库进行检查。就像你 Linux 系统上其它软件那样，根证书库也由包管理器维护。对于 Ubuntu，对应的包是 ca-certificates，这个 Linux 根证书库本身是由 Mozilla 维护的。可见，整个工作流程需要复杂的基础设施才能完成。在你进行购物或金融等敏感在线操作时，你信任了无数陌生人对你的保护。无处不加密Let's Encrypt 是一家全球证书颁发机构，类似于其它商业根证书颁发机构。Let's Encrpt 由非营利性组织 因特网安全研究小组 Internet Security Research Group （ISRG）创立，目标是简化网站的安全加密。在我看来，出于后面我会提到的原因，该证书不足以胜任购物及银行网站的安全加密，但很适合加密博客、新闻和信息门户这类不涉及金融操作的网站。使用 Let's Encrypt 有三种方式。推荐使用 电子前沿基金会 Electronic Frontier Foundation （EFF）开发的 Cerbot 客户端。使用该客户端需要在网站服务器上执行 shell 操作。如果你使用的是共享托管主机，你很可能无法执行 shell 操作。这种情况下，最简单的方法是使用支持 Let's Encrpt 的托管主机。如果你的托管主机不支持 Let's Encrypt，但支持自定义证书，那么你可以使用 Certbot 手动创建并上传你的证书。这是一个复杂的过程，你需要彻底地研究文档。安装证书后，使用 SSL 服务器测试来测试你的服务器。Let's Encrypt 的电子证书有效期为 90 天。Certbot 安装过程中添加了一个证书自动续期的计划任务，也提供了测试证书自动续期是否成功的命令。允许使用已有的私钥或 证书签名请求 certificate signing request （CSR），允许创建通配符证书。限制Let's Encrypt 有如下限制：它只执行域名验证，即只要有域名控制权就可以获得证书。这是比较基础的 SSL。它不支持 组织验证 Organization Validation （OV）或 扩展验证 Extended Validation （EV），因为运营实体验证无法自动完成。我不会信任使用 Let's Encrypt 证书的购物或银行网站，它们应该购买支持运营实体验证的完整版本。作为非营利性组织提供的免费服务，不提供商业支持，只提供不错的文…

如何在 Linux 上运行你自己的公共时间服务器
type: item
date: 2018-03-24T19:40:26+08:00
description: 最重要的公共服务之一就是 报时 timekeeping ，但是很多人并没有意识到这一点。大多数公共时间服务器都是由志愿者管理，以满足不断增长的需求。这里学习一下如何运行你自己的时间服务器，为基础公共利益做贡献。（查看 在 Linux 上使用 NTP 保持精确时间 去学习如何设置一台局域网时间服务器）著名的时间服务器滥用事件就像现实生活中任何一件事情一样，即便是像时间服务器这样的公益项目，也会遭受不称职的或者恶意的滥用。消费类网络设备的供应商因制造了大混乱而臭名昭著。我回想起的第一件事发生在 2003 年，那时，NetGear 在它们的路由器中硬编码了威斯康星大学的 NTP 时间服务器地址。使得时间服务器的查询请求突然增加，随着 NetGear 卖出越来越多的路由器，这种情况越发严重。更有意思的是，路由器的程序设置是每秒钟发送一次请求，这将使服务器难堪重负。后来 Netgear 发布了升级固件，但是，升级他们的设备的用户很少，并且他们的其中一些用户的设备，到今天为止，还在不停地每秒钟查询一次威斯康星大学的 NTP 服务器。Netgear 给威斯康星大学捐献了一些钱，以帮助弥补他们带来的成本增加，直到这些路由器全部淘汰。类似的事件还有 D-Link、Snapchat、TP-Link 等等。对 NTP 协议进行反射和放大，已经成为发起 DDoS 攻击的一个选择。当攻击者使用一个伪造的目标受害者的源地址向时间服务器发送请求，称为反射攻击；攻击者发送请求到多个服务器，这些服务器将回复请求，这样就使伪造的源地址受到轰炸。放大攻击是指一个很小的请求收到大量的回复信息。例如，在 Linux 上，ntpq 命令是一个查询你的 NTP 服务器并验证它们的系统时间是否正确的很有用的工具。一些回复，比如，对端列表，是非常大的。组合使用反射和放大，攻击者可以将 10 倍甚至更多带宽的数据量发送到被攻击者。那么，如何保护提供公益服务的公共 NTP 服务器呢？从使用 NTP 4.2.7p26 或者更新的版本开始，它们可以帮助你的 Linux 发行版不会发生前面所说的这种问题，因为它们都是在 2010 年以后发布的。这个发行版都默认禁用了最常见的滥用攻击。目前，最新版本是 4.2.8p10，它发布于 2017 年。你可以采用的另一个措施是，在你的网络上启用入站和出站过滤器。阻塞宣称来自你的网络的数据包进入你的网络，以及拦截发送到伪造返回地址的出站数据包。入站过滤器可以帮助你，而出站过滤器则帮助你和其他人。阅读 BCP38.info 了解更多信息。层级为 0、1、2 的时间服务器NTP 有超过 30 年的历史了，它是至今还在使用的最老的因特网协议之一。它的用途是保持计算机与世界标准时间（UTC）的同步。NTP 网络是分层组织的，并且同层的设备是对等的。 层次 Stratum 0 包含主报时设备，比如，原子钟。层级 1 的时间服务器与层级 0 的设备同步。层级 2 的设备与层级 1 的设备同步，层级 3 的设备与层级 2 的设备同步。NTP 协议支持 16 个层级，现实中并没有使用那么多的层级。同一个层级的服务器是相互对等的。过去很长一段时间内，我们都为客户端选择配置单一的 NTP 服务器，而现在更好的做法是使用 NTP 服务器地址池，它使用轮询的 DNS 信息去共享负载。池地址只是为客户端服务的，比如单一的 PC 和你的本地局域网 NTP 服务器。当你运行一台自己的公共服务器时，你不用使用这些池地址。公共 NTP 服务器配置运行一台公共 NTP 服务器只有两步：设置你的服务器，然后申请加入到 NTP 服务器池。运行一台公共的 NTP 服务器是一种很高尚的行为，但是你得先知道这意味着什么。加入 NTP 服务器池是一种长期责任，因为即使你加入服务器池后，运行了很短的时间马上退出，然后接下来的很多年你仍然会接收到请求。你需要一个静态的公共 IP 地址，一个至少 512Kb/s 带宽的、可靠的、持久的因特网连接。NTP 使用的是 UDP 的 123 端口。它对机器本身要求并不高，很多管理员在其它的面向公共的服务器（比如，Web 服务器）上顺带架设了 NTP 服务。配置一台公共的 NTP 服务器与配置一台用于局域网的 NTP 服务器是一样的，只需要几个配置。我们从阅读 协议规则 开始。遵守规则并注意你的行为；几乎每个时间服务器的维护者都是像你这样的志愿者。然后，从 StratumTwoTimeServers 中选择 4 到 7 个层级 2 的上游服务器。选择的时候，选取地理位置上靠近（小于 300 英里的）你的因特网服务提供商的上游服务器，阅读他们的访问规则，然后，使用 ping 和 mtr 去找到延迟和跳数最小的服务器。以下的 /etc/ntp.conf 配置示例文件…

在 Linux 上使用 NTP 保持精确的时间
type: item
date: 2018-03-19T21:38:25+08:00
description: 如何保持正确的时间，如何使用 NTP 和 systemd 让你的计算机在不滥用时间服务器的前提下保持同步。它的时间是多少？让 Linux 来告诉你时间的时候，它是很奇怪的。你可能认为是使用 time 命令来告诉你时间，其实并不是，因为 time 只是一个测量一个进程运行了多少时间的计时器。为得到时间，你需要运行的是 date 命令，你想查看更多的日期，你可以运行 cal 命令。文件上的时间戳也是一个容易混淆的地方，因为根据你的发行版默认情况不同，它一般有两种不同的显示方法。下面是来自 Ubuntu 16.04 LTS 的示例：$ ls -l drwxrwxr-x 5 carla carla 4096 Mar 27 2017 stuff drwxrwxr-x 2 carla carla 4096 Dec 8 11:32 things -rw-rw-r-- 1 carla carla 626052 Nov 21 12:07 fatpdf.pdf -rw-rw-r-- 1 carla carla 2781 Apr 18 2017 oddlots.txt 有些显示年，有些显示时间，这样的方式让你的文件更混乱。GNU 默认的情况是，如果你的文件在六个月以内，则显示时间而不是年。我想这样做可能是有原因的。如果你的 Linux 是这样的，尝试用 ls -l --time-style=long-iso 命令，让时间戳用同一种方式去显示，按字母顺序排序。请查阅 如何更改 Linux 的日期和时间：简单的命令 去学习 Linux 上管理时间的各种方法。检查当前设置NTP —— 网络时间协议，它是保持计算机正确时间的老式方法。ntpd 是 NTP 守护程序，它通过周期性地查询公共时间服务器来按需调整你的计算机时间。它是一个简单的、轻量级的协议，使用它的基本功能时设置非常容易。systemd 通过使用 systemd-timesyncd.service 已经越俎代庖地 “干了 NTP 的活”，它可以用作 ntpd 的客户端。在我们开始与 NTP “打交道” 之前，先花一些时间来了检查一下当前的时间设置是否正确。你的系统上（至少）有两个时钟：系统时间 —— 它由 Linux 内核管理，第二个是你的主板上的硬件时钟，它也称为实时时钟（RTC）。当你进入系统的 BIOS 时，你可以看到你的硬件时钟的时间，你也可以去改变它的设置。当你安装一个新的 Linux 时，在一些图形化的时间管理器中，你会被询问是否设置你的 RTC 为 UTC（ 世界标准时间 Coordinated Universal Time ）时区，因为所有的时区和夏令时都是基于 UTC 的。你可以使用 hwclock 命令去检查：$ sudo hwclock --debug hwclock from util-linux 2.27.1 Using the /dev interface to the clock. Hardware clock is on UTC time Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2018/01/22 22:14:31 Hw clock time : 2018/01/22 22:14:31 = 1516659271 seconds since 1969 Time since last adjustment is 1516659271 seconds Calculated Hardware Clock drift is 0.000000 seconds Mon 22 Jan 2018 02:14:30 PM PST .202760 seconds Hardware clock is on UTC time 表明了你的计算机的 RTC 是使用 UTC 时间的，虽然它把该时间转换为你的本地时间。如果它被设置为本地时间，它将显示 Hardware clock is on local time。你应该有一个 /etc/adjtime 文件。如果没有的话，使用如下命令同步你的 RTC 为系统时间，$ sudo hwclock -w 这个命令将生成该文件，内容看起来类似如下：$ cat /etc/adjtime 0.000000 1516661953 0.000000 1516661953 UTC 新发明的 systemd 方式是去运行 timedatectl 命令，运行它不需要 root 权限：$ timedatectl Local time: Mon 2018-01-22 14:…