分类 默认分类 下的文章

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.

这是因为Windows 10 连接IKEv2后,默认启用了 splittunneling 选项。我们只要把 splittunneling 关闭即可。
操作如下:

1、使用管理员身份运行PowerShell;

2、输入命令:

get-vpnconnection

Name                  : test_IKEv2
ServerAddress         : vpn.xxx.net
AllUserConnection     : False
Guid                  : {A0E89525-9E64-43DE-8ECC-5E2DFC067C0D}
TunnelType            : Ikev2
AuthenticationMethod  : {MachineCertificate}
EncryptionLevel       : Required
L2tpIPsecAuth         :
UseWinlogonCredential : False
EapConfigXmlStream    :
ConnectionStatus      : Connected
RememberCredential    : True
SplitTunneling        : True
DnsSuffix             :
IdleDisconnectSeconds : 0

然后找到对应那个vpn连接名,比如我这里是"test_IKEv2";

3、然后输入命令:

set-vpnconnection "test_IKEv2" -splittunneling $false

记得把双引号里面的内容自行替换掉,不要照抄。

4、最后再输入:

get-vpnconnection

Name                  : test_IKEv2
ServerAddress         : vpn.xxx.net
AllUserConnection     : False
Guid                  : {A0E89525-9E64-43DE-8ECC-5E2DFC067C0D}
TunnelType            : Ikev2
AuthenticationMethod  : {MachineCertificate}
EncryptionLevel       : Required
L2tpIPsecAuth         :
UseWinlogonCredential : False
EapConfigXmlStream    :
ConnectionStatus      : Connected
RememberCredential    : True
SplitTunneling        : False
DnsSuffix             :
IdleDisconnectSeconds : 0

检查看split tunneling那一项是不是False,不是的话再试一次。像这样就成功了。

上一文讲到 IKEv2的配置,当时使用的是Windows 7作为客户端。然而使用Windows 10作客户端时,拨号时会产生“策略匹配错误”,在事件管理器里面查询,会得到一个13868的错误号。

这是因为Windows客户端提出了一个弱Diffie-Hellman(DH)组(1024位MODP)。除非用户明确配置,否则strongSwan不再使用该组。

解决方法:

在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters 底下新增:

名称:"NegotiateDH2048_AES256"
类型:"REG_DWORD"
值:"1"

保存退出即可。

一、软件安装

ipsec 与 l2tp,一般常见的操作系统都直接支持,不需要额外安装软件。所以在选择上优先考虑。

在Debian 10下面安装非常容易,执行以下命令:

apt-get install strongswan xl2tpd strongswan-pki

二、软件配置

StrongSwan 的配置主要为 ipsec.conf、strongswan.conf;
xl2tpd 的配置主要为 xl2tpd.conf、options.xl2tpd;

以下为四个配置文件样例:

1、ipsec.conf

config setup
    uniqueids=no
    charondebug="cfg 2, dmn 2, ike 2, net 0"

conn %default
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%defaultroute
    leftfirewall=yes
    right=%any
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    auto=add

#######################################
# L2TP Connections
#######################################

conn L2TP-IKEv1-PSK
    type=transport
    keyexchange=ikev1
    authby=secret
    leftprotoport=udp/l2tp
    left=%any
    right=%any
    rekey=no
    forceencaps=yes

#######################################
# PSK Connections
#######################################

# Cisco IPSec
conn IKEv1-PSK-XAuth
    keyexchange=ikev1
    leftid=@lostend.com
    leftauth=psk
    rightauth=psk
    rightauth2=xauth
    leftsubnet=0.0.0.0/0
    rightsubnet=10.0.0.0/24
    rightsourceip=10.0.0.0/24

#######################################
# Certificate Connections
#######################################

conn windows7
    keyexchange=ikev2
    rekey=no
    leftauth=pubkey
    leftid=@lostend.com
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=rsa
    rightsourceip=10.0.0.0/24
    rightsendcert=never
    eap_identity=%any

include /var/lib/strongswan/ipsec.conf.inc

2、strongswan.conf

charon {
    load_modular = yes
    send_vendor_id = yes
    plugins {
        include strongswan.d/charon/*.conf
        attr {
            dns = 1.2.4.8, 119.29.29.29
        }
    }
}

include strongswan.d/*.conf

3、xl2tpd.conf

[global]
port = 1701
auth file = /etc/xl2tpd/l2tp-secrets
debug avp = yes
debug network = yes
debug state = yes
debug tunnel = yes
[lns default]
ip range = 10.1.0.2-10.1.0.254
local ip = 10.1.0.1
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tpd
;ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

如上配置中,因为开启了chap的验证,拒绝了pap验证。所以验证文件是 /etc/ppp/chap-secrets ,在使用l2tp连接时,需要用到这个文件进行用户校验。上面的 /etc/xl2tpd/l2tp-secrets 文件是没什么用的。

以下是 /etc/ppp/chap-secrets 用户验证文件的示例:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses

"test" "*" "testpassword" "*"

"test"是用户名,"testpassword"是密码。多个的话,每个一行分开填写。

4、options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
ms-dns 1.2.4.8
ms-dns 119.29.29.29
noccp
auth
idle 1800
mtu 1460
mru 1460
lcp-echo-failure 10
lcp-echo-interval 60
connect-delay 5000

其中mtu,mru 需要根据实际情况填写,不确定的话,填写1280是比较保险的值。

创建好四个配置文件后将其复制到指定位置即可:

# Strongswan Configuration
sudo cp ipsec.conf /etc/ipsec.conf
sudo cp strongswan.conf /etc/strongswan.conf

# XL2TPD Configuration
sudo cp xl2tpd.conf /etc/xl2tpd/xl2tpd.conf
sudo cp options.xl2tpd /etc/ppp/options.xl2tpd

三、证书创建

对于 Windows、Android 等设备可能不支持某些登录方式,比如 IKEv2 PSK,这时需要创建证书,以支持使用 IKEv2 证书登录:

1、生成一个私钥,并基于这个私钥自己签一个 CA 证书:

# create CA certificate
ipsec pki --gen --outform pem > ca.key.pem
ipsec pki --self --in ca.key.pem --dn "C=CN, O=StrongSwan, CN=StrongSwan CA" --ca --outform pem > ca.cert.pem

2、创建服务器证书,并用我们刚才自签的 CA 证书给自己发一个服务器证书:

# create server certificate
ipsec pki --gen --outform pem > server.key.pem 
ipsec pki --pub --in server.key.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=StrongSwan, CN=lostend.com" --san="lostend.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem 

其中 --san 可以指定多个,但一般一个是域名,一个是外网 IP,如果经过了路由,那么只需要写本机的对外暴露网卡的 IP 即可。

--dn, --san,--flag 是一些客户端方面的特殊要求:

iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),--flag serverAuth;
非 iOS 的 Mac OS X 要求了「IP 安全网络密钥互换居间(IP Security IKE Intermediate)」这种增强型密钥用法(EKU),--flag ikdeIntermediate;
Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。

3、创建客户端证书,然后用刚才自签的 CA 证书来签客户端证书:

ipsec pki --gen --outform pem > client.key.pem 
ipsec pki --pub --in client.key.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=StrongSwan, CN=Test" --outform pem > test.cert.pem 

看懂了服务器的,客户端的也就不难理解了。除了没有那一堆特殊要求别的都一样。

客户端证书可以每个客户端签一个,也可以让它们共用一个。是否多签看用途,一般用于区分设备。

4、生成 pkcs12 证书(可选)

安卓等设备是不支持直接导入客户端证书的,需要转换成 p12 格式,转换过程中需要输入两次密码,该密码为证书使用密码,导入时需要输入:

openssl pkcs12 -export -inkey client.key.pem -in test.cert.pem -name "Test" -certfile ca.cert.pem -caname "StrongSwan CA" -out test.cert.p12 

5、安装证书

创建完成后将证书复制到指定目录即可

sudo cp -r ca.cert.pem /etc/ipsec.d/cacerts/
sudo cp -r server.cert.pem /etc/ipsec.d/certs/
sudo cp -r server.key.pem /etc/ipsec.d/private/
sudo cp -r test.cert.pem /etc/ipsec.d/certs/
sudo cp -r client.key.pem /etc/ipsec.d/private/

CA 证书、客户端证书和 .p12 证书复制出来给客户端用。有几种 Android 配置还需要服务器证书(server.cert.pem)。

四、用户验证文件

ipsec.secrets 文件示例:

ipsec.secrets文件是需要复制到/etc/ipsec.secrets 位置的,很多网上的教程都是错的。这点需要划重点注意。

: PSK "testpassword"                                                                                                                                                                                                  
: RSA server.key.pem                                                                                                                                                                                              
test : EAP "testpassword"                                                                                                                                                                                            
test : XAUTH "testpassword"

在上面的例子中,创建了认证用户test和test的密码。在添加用户的时候,请注意在冒号(:)左右两边都需要一个空格。
上面定义的是四种认证方法。它们之间是遵循「各找各妈」的原则的,可以任意混搭。
每种认证方式找各自的认证内容,具体可以参考官方说明:

https://wiki.strongswan.org/projects/strongswan/wiki/Ipsecsecrets

五、linux转发配置

使用iptables 来进行转发:

sudo iptables -A INPUT -p udp --dport 1701 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -m policy --dir out --pol none -j MASQUERADE
sudo iptables -A FORWARD -s 10.1.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT

sudo vi /etc/sysctl.conf 
net.ipv4.ip_forward=1 
sudo sysctl -p

其中 10.1.0.0/24 和 10.0.0.0/24 就是ipsec.conf 和xl2tpd.conf 里面配置的子网网段。自己根据情况进行修改。
eth0 的网卡名也要根据自己的机器情况作修改。

至此,所以配置就完成了。重启ipsec和xl2tpd 生效

sudo /etc/init.d/ipsec restart
sudo /etc/init.d/xl2tpd restart

六、Windows 7 ikev2 认证配置

使用自带客户端(Agile):

导入证书:

  1. 开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
  2. 「文件」-「添加/删除管理单元」,添加「证书」单元
  3. 证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
  4. 在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
  5. 选择刚才生成的 test.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
  6. 导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
  7. 打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
  8. 然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。

至此,证书导入完成。

注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。

建立连接:

  1. 「控制面板」-「网络和共享中心」-「设置新的连接或网络」-「连接到工作区」-「使用我的 Internet 连接」
  2. Internet 地址写服务器地址,使用 IP 或都是 URL。
  3. 描述随便写。
  4. 点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到「安全」选项卡。
  5. VPN 类型选 IKEv2
  6. 数据加密是「需要加密」
  7. 身份认证这里使用私人证书认证的话就选择「使用计算机证书」。

配置完成。