配置FCOS以使用WireGuard

引言

WireGuard 是一种运行在Linux内核中并使用最先进的加密技术的新型VPN。它的目标是比IPSec更快、更简单、更精简、更有用,同时避免巨大的头痛。它打算比OpenVPN的性能好得多。WireGuard是为运行在嵌入式接口和超级计算机上的通用VPN而设计的,适用于多种不同的环境。它运行在UDP之上。

FCOS开箱即用完全支持WireGuard。本指南将演示如何在FCOS服务器和一台客户端计算机之间设置单个连接。它介绍了基本的客户端配置,但不包括在您的客户端上安装WireGuard。

生成密钥

您需要生成一些密钥来配置WireGuard。对于本指南,应在您的工作站上预先生成密钥。首先,让我们创建FCOS WireGuard密钥:

生成FCOS WireGuard密钥
$ umask 077
$ wg genkey | tee privatekey | wg pubkey > publickey

这些密钥将被引用为 fcos_public_keyfcos_private_key 从现在开始,在这本指南中。

现在,让我们生成客户端密钥:

生成客户端One WireGuard密钥
$ umask 077
$ wg genkey | tee privatekey | wg pubkey > publickey

这些密钥将被引用为 client_one_public_keyclient_one_private_key 从现在开始,在这本指南中。

现在创建PresharedKey:

为每个对等对生成预共享密钥
$ wg genpsk > fcos_client_one_psk

PresharedKey将被引用为 fcos_client_one_psk 从现在开始,在这本指南中。

这个 wg genpsk 命令生成每个对等对只能使用一次的PresharedKey。您添加到FCOS服务器的每个对等点都需要生成唯一的PresharedKey。

在FCOS上配置有线保护

现在您可以配置您的Ignition配置以创建 wg0 配置文件:

FCOS WireGuard配置示例
variant: fcos
version: 1.4.0
storage:
  files:
    - path: /etc/wireguard/wg0.conf
      mode: 0600
      contents:
        inline: |
          [Interface]
          Address = 192.168.71.1/24,fdc9:3c6b:21c7:e6bd::1/64
          PrivateKey = <fcos_private_key>
          ListenPort = 51820

          [Peer]
          PublicKey = <client_one_public_key>
          PresharedKey = <fcos_client_one_psk>
          AllowedIPs = 192.168.71.0/24,fdc9:3c6b:21c7:e6bd::/64
systemd:
  units:
    - name: wg-quick@wg0.service
      enabled: true

启动FCOS并登录。当你跑步的时候 sudo wg show 您应该看到这一点:

检查FCOS上的WireGuard配置
[core@wireguard-demo ~]$ sudo wg show
interface: wg0
  public key: <fcos_public_key>
  private key: (hidden)
  listening port: 51820

peer: <client_one_public_key>
  preshared key: (hidden)
  endpoint: <Client IP Address>:51821
  allowed ips: 192.168.71.0/24, fdc9:3c6b:21c7:e6bd::/64

[root@wireguard-demo ~]# ip a s wg0
12: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.71.1/24 scope global wg0
       valid_lft forever preferred_lft forever
    inet6 fdc9:3c6b:21c7:e6bd::1/64 scope global
       valid_lft forever preferred_lft forever
<客户端IP地址>上面是客户端计算机的IP或FQDN。

在客户端上配置WireGuard

现在,您需要使用以下配置在客户端计算机上配置WireGuard:

客户端WireGuard配置
[Interface]
Address = 192.168.71.2/24,fdc9:3c6b:21c7:e6bd::2/64
PrivateKey = <client_one_private_key>
ListenPort = 51821

[Peer]
PublicKey = <fcos_public_key>
PresharedKey = <fcos_client_one_psk>
Endpoint = <FCOS IP address>:51820
AllowedIPs = 192.168.71.0/24,fdc9:3c6b:21c7:e6bd::/64
<FCOS IP地址>是FCOS服务器的IP或FQDN。

将上述配置写入 /etc/wireguard/wg0.confchmod 0600 /etc/wireguard/wg0.conf 在你的客户身上。跑 sudo systemctl start wg-quick@wg0.service 然后检查您的配置:

检查客户端上的WireGuard配置
[root@wireguard-client ~]# wg show
interface: wg0
  public key: <client_one_public_key>
  private key: (hidden)
  listening port: 51821

peer: <fcos_public_key>
  preshared key: (hidden)
  endpoint: <FCOS IP address>:51820
  allowed ips: 192.168.71.0/24, fdc9:3c6b:21c7:e6bd::/64
[root@wireguard-client ~]# ip a s wg0
21: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.71.2/24 scope global wg0
       valid_lft forever preferred_lft forever
    inet6 fdc9:3c6b:21c7:e6bd::2/64 scope global
       valid_lft forever preferred_lft forever

测试WireGuard连接

您现在可以ping通FCOS服务器的WireGuard IP地址:

从客户端通过WireGuard ping FCOS服务器
[root@wireguard-client ~]# ping 192.168.71.1
PING 192.168.71.1 (192.168.71.1) 56(84) bytes of data.
64 bytes from 192.168.71.1: icmp_seq=1 ttl=64 time=0.439 ms
64 bytes from 192.168.71.1: icmp_seq=2 ttl=64 time=0.422 ms
64 bytes from 192.168.71.1: icmp_seq=3 ttl=64 time=0.383 ms
^C
--- 192.168.71.1 ping statistics ---
发送3个信息包,接收3个信息包,丢包率为0%,时间为2027毫秒
RTT最小/平均/最大/最大值=0.383/0.414/0.439/0.023毫秒

[根@wireguard-客户端~]#ping6 fdc9:3c6b:21c7:e6bd::1
Ping fdc9:3c6b:21c7:e6bd::1(fdc9:3c6b:21c7:e6bd::1)56数据字节
64字节,从fdc9:3c6b:21c7:e6bd::1:icmp_seq=1 ttl=64时间=1.55毫秒开始
来自fdc9:3c6b:21c7:e6bd::1:icmp_seq=2 ttl=64时间=0.454毫秒的64字节
来自fdc9:3c6b:21c7:e6bd::1:icmp_seq=3 ttl=64时间=0.424毫秒的64字节
来自fdc9:3c6b:21c7:e6bd::1:icmp_seq=4 ttl=64时间=0.424毫秒的64字节
^C
-fdc9:3c6b:21c7:e6bd::1 ping统计
发送4个信息包,接收4个信息包,丢包率为0%,时间为3054毫秒
RTT最小/平均/最大/最大值=0.424/0.712/1.546/0.481毫秒


当你跑步的时候 `sudo wg show` 在您的客户端上,您应该会看到最近的握手和转接部分,其中包含发送和接收:

.验证握手和传输指标
[source,bash]

[root@wireguard-client ~]# wg show interface: wg0 public key: <client_one_public_key> private key: (hidden) listening port: 51821

peer: <fcos_public_key> preshared key: (hidden) endpoint: <Client IP address>:51820 allowed ips: 192.168.71.0/24, fdc9:3c6b:21c7:e6bd::/64 latest handshake: 9 seconds ago transfer: 22.02 KiB received, 22.28 KiB sent

== 通过WireGuard路由所有流量

如果您计划通过FCOS实例转发客户端的所有流量,则需要启用IP转发,并且需要设置一些PostUp和PostDown指令:

.使用IP转发的FCOS WireGuard配置示例
[source,yaml]

variant: fcos version: 1.4.0 storage: files: - path: /etc/sysctl.d/90-ipv4-ip-forward.conf mode: 0644 contents: inline: | net.ipv4.ip_forward = 1

  • path: /etc/sysctl.d/90-ipv6-ip-forwarding.conf mode: 0644 contents: inline: | net.ipv6.conf.all.forwarding = 1

  • path: /etc/wireguard/wg0.conf mode: 0600 contents: inline: | [Interface] Address = 192.168.71.1/24,fdc9:3c6b:21c7:e6bd::1/64 PrivateKey = <fcos_private_key> ListenPort = 51820

    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE
              [Peer]
              PublicKey = <client_one_public_key>
              PresharedKey = <fcos_client_one_psk>
              AllowedIPs = 192.168.71.0/24,fdc9:3c6b:21c7:e6bd::/64
    systemd:
      units:
        - name: wg-quick@wg0.service
          enabled: true
    
    
FCOS使用 可预测的接口名称 通过 默认设置 。请注意在上述PostUp和PostDown命令中为您的硬件使用正确的接口名称!

并设置 AllowedIPs = 0.0.0.0/0,::/0 在……里面 /etc/wireguard/wg0.conf 在客户端配置上,通过WireGuard接口来路由客户端计算机上的所有IPv4和IPv6流量:

通过WireGuard来路由客户端上的所有流量的配置:

地址=192.168.71.1/24,fdc9:3c6b:21c7:e6bd::2/64 PrivateKey=<CLIENT_ONE_PRIVE_KEY> 侦听端口=51821

PublicKey=<fcos_public_key> PresharedKey=<fcos_CLIENT_ONE_PSK> 终结点=<FCOS IP地址>:51820 允许的IP数=0.0.0.0/0,::/0