admin 发布的文章

使用与兼容性

在HPET出现之前设计的操作系统不能使用HPET,因此将使用其他计时器设备。较新的操作系统往往可以使用较新与较旧的计时器。一些硬件同时有较新与较旧的计时器。事实上,目前的南桥芯片大多数也都同时支持传统的PIT、PIC、高级可编程中断控制器(APIC)和RTC设备,无论操作系统是否使用,从而有助于非常现代的PC运行旧款操作系统。

已知下列操作系统无法使用HPET:Windows XP SP2、 Windows Server 2003及更早的Windows版本,Linux内核2.6以前。

已知下列操作系统可以使用HPET:Windows XP SP3、Windows Server 2008、Windows Server 2008 R2、Windows Vista、 Windows 7、基于x86的OS X、使用2.6或更高内核的Linux操作系统以及FreeBSD。

Linux内核也可以使用HPET作为其时钟源。Red Hat MRG第二版的文档指,TSC是首选时钟源——因为它的开销低很多,而HPET作为后备时钟源。一个千万次事件计数的基准测试显示,TSC花费约0.6秒,而HPET花费略微超过12秒,ACPI电源管理计时器花费约24秒。

稳定时间戳计数器(Constant Time Stamp Counter, TSC)

现代Intel和AMD处理器提供了一个稳定时间戳计数器(Constant Time Stamp Counter, TSC)。这个稳定的TSC的计数频率不会随着CPU核心更改频率而改变,例如,节电策略导致的cpu主频降低不会影响TSC计数。一个CPU具有稳定的TSC频率对于使用TSC作为系统的时钟源是非常重要的。

要查看CPU是否具有稳定的时间戳计数器(constant TSC)需要检查cpuinfo中是否有constant_tsc标志:

cat /proc/cpuinfo | grep constant_tsc

如果上述命令没有任何输出,则表明cpu缺少稳定的TSC特性,需要采用其他时钟源。

时钟硬件和计时准确性

时间戳计数器(TSC)时钟源是当前一代 CPU 上最精确的一种。当操作系统支持 TSC 并且 TSC 可靠时,它是跟踪系统时间更好的方式。有多种方式会使 TSC 无法提供准确的计时源,这会让它不可靠。旧的系统能有一种基于 CPU 温度变化的 TSC 时钟,这让它不能用于计时。尝试在一些就的多核 CPU 上使用 TSC 可能在多个核心之间给出不一致的时间报告。这可能导致时间倒退,这个程序会检查这种问题。并且即使最新的系统,在非常激进的节能配置下也可能无法提供准确的 TSC 计时。

更新的操作系统可能检查已知的 TSC 问题并且当它们被发现时切换到一种更慢、更稳定的时钟源。如果你的系统支持 TSC 时间但是并不默认使用它,很可能是由于某种充分的理由才禁用它。某些操作系统可能无法正确地检测所有可能的问题,或者即便在知道 TSC 不精确的情况下也允许使用 TSC。

如果系统上有高精度事件计时器(HPET)并且 TSC 不准确,该系统将会更喜欢 HPET 计时器。计时器芯片本身是可编程的,最高允许 100 纳米的解析度,但是在你的系统时钟中可能见不到那么高的准确度。

高级配置和电源接口(ACPI)提供了一种电源管理(PM)计时器,Linux 把它称之为 acpi_pm。得自于 acpi_pm 的时钟最好时将能提供 300 纳秒的解析度。

在旧的 PC 硬件上使用的计时器包括 8254 可编程区间计时器(PIT)、实时时钟(RTC)、高级可编程中断控制器(APIC)计时器以及 Cyclone 计时器。这些计时器是以毫秒解析度为目标的。

改变时间来源

在一些较新的 Linux 系统上,可以在任何时候更改用来收集计时数据的时钟来源。以下例子显示了在系统上切换到较慢的 acpi_pm 时钟源:

# cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
# echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource

FreeBSD 也允许即时更改时钟源,并且它会记录在启动期间有关计时器选择的信息:

# dmesg | grep "Timecounter"
Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounters tick every 10.000 msec
Timecounter "TSC" frequency 2531787134 Hz quality 800
# sysctl kern.timecounter.hardware=TSC
kern.timecounter.hardware: ACPI-fast -> TSC

总结

1、如果CPU支持(constant TSC)特性,那么优先选择TSC时钟源;
2、如果没有(constant TSC)特性,选择HPET;

constant TSC > HPET > ACPI_PM > TSC > i8254

如果以前使用时都正常,最近才出现问题的。那么一般有两点需要检查

1、如果使用的是自签名证书,那么检查一下证书是否到期;

2、如果是第三方签发的证书,那么需要把证书链中的所有CA都独立建立证书文件放在/etc/ipsec.d/cacerts目录中

3、Windows系统最好添加一项注册表项,如下:

添加一条注册表值

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters\DisableIKENameEkuCheck 

类型为 DWORD,值为1

WireGuard® 是一个非常简单,快速和现代的 VPN,它利用了 最先进的 密码学 。它旨在比 IPsec 更快 , 更简单,更精简,更有用,同时避免巨大的头痛。它比 OpenVPN 的性能要高得多。WireGuard 被设计为一个通用 VPN,用于在嵌入式接口和超级计算机上运行,适用于许多不同的情况。它最初是为 Linux 内核发布的,现在是跨平台(Windows,macOS,BSD,iOS,Android)并且可以广泛部署。它目前正在进行大量开发,但它已经被认为是业内最安全,最易于使用和最简单的 VPN 解决方案。

从 2020 年 1 月开始,它已经并入了 Linux 内核的 5.6 版本,这意味着大多数 Linux 发行版的用户将拥有一个开箱即用的 WireGuard。

WireGuard是跨平台的,几乎可以在任何操作系统运行,包括Linux,Windows,Android和macOS。

Wireguard是对等VPN,它不使用C/S客户端/服务器模型。根据配置,对等方可以充当传统的服务器或客户端。

它充当隧道,在每个对等设备上创建虚拟网络接口来工作。对等方通过交换和验证公钥,类似于使用SSH公钥模式来相互认证。

公钥与隧道中允许的IP地址列表进行映射。VPN流量封装在UDP中。

WireGuard 优点

简单易用
WireGuard 旨在像 SSH 一样易于配置和部署。VPN 连接只需通过交换非常简单的公钥即可实现 - 就像交换 SSH 密钥一样 - 其余所有内容都由 WireGuard 透明地处理。它甚至能够在 IP 地址之间漫游,就像 Mosh 一样。无需管理连接、关注状态、管理守护程序或担心后台的内容。WireGuard 提供了一个非常基本但功能强大的界面。

加密健全
WireGuard 使用最先进的密码学,如 噪声协议框架,Curve25519,ChaCha20,Poly1305,BLAKE2,SipHash24,HKDF 和安全可信结构。 它做出了保守合理的选择,并经过密码学家的审查。

最小攻击面
WireGuard 在设计时考虑了易于实现和简单性。它意味着在很少的代码行中轻松实现,并且易于审计安全漏洞。与 *Swan/IPsec 或 OpenVPN/OpenSSL 等庞然大物相比,即使对于大型安全专家团队来说,审计庞大的代码库也是一项艰巨的任务,WireGuard 意味着可以由单个人进行全面审查。

高性能
极高速的加密原语和 WireGuard 存在于 Linux 内核中的事实相结合,意味着安全网络可以非常高速。它适用于智能手机等小型嵌入式设备和满载骨干路由器。

WireGuard可从默认的Debian 11软件源中获得,Debian 10需要添加backports软件源。

要安装它,请运行apt命令 sudo apt update && sudo apt install wireguard。这将安装WireGuard模块和工具。WireGuard作为内核模块运行。

sudo apt update
sudo apt install wireguard

Debian 10 由于内核版本低于5.6,需要额外安装一个包wireguard-dkms。

配置WireGuard

wg和wg-quick命令行工具可帮助您配置和管理WireGuard接口,WireGuard接口是虚拟网卡。WireGuard VPN网络中的每个设备都需要具有私钥和公钥。

我们可以使用wiregurad的工具wg genkey和wg pubkey在/etc/wireguard/目录中生成私钥/etc/wireguard/privatekey和公钥/etc/wireguard/publickey。

以下命令将使用wg genkey和wg pubkey,tee命令以及管道同时生成私钥和公钥并存储在/etc/wireguard/目录。

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

您可以使用cat命令或less命令查看私钥和公钥文件的内容。请不要把私钥与任何人共享,并且应始终保证私钥的安全。

Wireguard还支持预共享密钥,这增加了对称密钥加密的附加层。预共享密钥是可选的,并且对于每个对等设备都必须是唯一的。

下一步是配置虚拟接口。可以使用ip命令和wg命令配置接口。

使用vim创建配置文件/etc/wireguard/wg0.conf。

粘贴以下内容到/etc/wireguard/wg0.conf文件中,然后保存并退出vim编辑器。

sudo vim /etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens0 -j MASQUERADE

接口的命名可以是任何你喜欢的名称,但是建议使用诸如wg0或wgvpn0之类的名称。可以让我们能快速分清是物理接口还是虚拟接口即可。

这里说明一下/etc/wireguard/wg0.conf配置文件定义接口的每个字段含义。

Address wg0接口的IP v4或IP v6的地址。请使用保留给私有网络范围内的IP地址,比如10.0.0.0/8、172.16.0.0/12或192.168.0.0/16。

ListenPort 是接口监听的端口。PrivateKey 由wg genkey命令生成的私钥。你可以使用sudo cat /etc/wireguard/privatekey命令要查看私钥文件的内容。

SaveConfig 设置为true时,当关闭接口时将当前配置将保存到配置文件中。PostUp 在启动接口之前执行的命令或脚本。

在此示例中,在PostUp钩子启用iptables伪装。这允许流量离开服务器,使VPN客户端可以访问互联网。

请记得使用您可访问网络的接口名称替换-A POSTROUTING后面的ens0。您可以通过以下ip命令方式轻松找到可访问网络的接口。

ip -o -4 route show to default | awk '{print $5}'

在PostDown钩子,我们在关闭接口之前删除iptables伪装。一旦接口关闭,iptables nat转发规则将被删除。

为了保证私钥的安全,请将wg0.conf和privatekey文件对普通用户不可读。运行chmod命令sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}。

sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}

启用Wireguard接口

完成以上步骤后,我们可以通过wg-quick启动wireguard服务器。这在wireguard中就是将接口状态设置为开启,运行wg-quick up命令将启用wg0接口。

sudo wg-quick up wg0

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens0 -j MASQUERADE

要检查接口状态和配置,请运行wg show命令。因为wg0是一个虚拟网卡,因此您也可以运行ip a show wg0来验证wg0接口状态。

sudo wg show wg0


interface: wg0
  public key: XYiS2En9095jL0IzsOuc6P9NVjYi6nNIoQoaIKi6uQw=
  private key: (hidden)
  listening port: 51820

wireguard作为内核模块运行,默认情况wireguard会自动启动,但接口wg0虚拟网卡不会自动启动。

你可以通过systemctl命令将wg0设置为自动启动。要在启动时启用WireGuard的wg0接口。请运行sudo systemctl enable wg-quick@wg0命令。

sudo systemctl enable wg-quick@wg0

配置防火墙

在之前的步骤中我们在启动wg0接口postup前配置了一条iptables的NAT路由。为使NAT路由可正常工作,必须启用IP转发。

使用vim打开文件/etc/sysctl.conf。然后添加或取消注释行net.ipv4.ip_forward。

退出vim并保存文件。修改完成后,运行sudo sysctl -p命令启用新的内核属性配置。

如果您正在使用UFW管理防火墙,则需要允许端口51820的UDP连接。至此,你已部署并配置wireguard Debian服务器的对等方。

sudo vim /etc/sysctl.conf

sudo sysctl -p

sudo ufw allow 51820/udp

/etc/sysctl.conf

net.ipv4.ip_forward=1

将客户端添加到服务器

最后一步是将客户端的公钥和IP地址添加到对等方,也就是服务器端口。要将客户端添加到服务器,非常简单。

你只需要在Debian 11服务器运行命令sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2。

请使用在客户端计算机生成的公钥替换CLIENT_PUBLIC_KEY,可以通过sudo cat /etc/wireguard/publickey命令查看客户端的公钥,Windows用户可以从WireGuard应用程序复制公钥。

sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2

至此,WireGuard的配置完成,可以愉快的使用了。

  1. 前往 homebrew-core/Formula · Homebrew 官方仓库 找到要下载的软件,可以点击 Find 按钮输入名字查找。
  2. 点击找到的文件后再点击 History 按钮来查找历史版本。
  3. 选中想要的版本,然后点击 ... | View file 查看文件。
  4. 右键点 Raw 按钮,复制链接地址。
  5. 打开 RAW文件, 将这个rb原文件下载下来。
  6. 替换/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ 下的文件。
  7. 再次执行brew install

官方仓库地址:https://github.com/Homebrew/homebrew-core/tree/master/Formula

网上经常说的直接 brew install 某个 rb的网址是不行的,会报错,类似下面这样:

Installation of tmux from a GitHub commit URL is unsupported! `brew extract tmux` to a stable tap on GitHub instead.