AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 982403
Accepted
Alex
Alex
Asked: 2019-09-09 00:42:22 +0800 CST2019-09-09 00:42:22 +0800 CST 2019-09-09 00:42:22 +0800 CST

Wireguard 作为虚拟机桥接,在 VPN 上不可见虚拟机管理程序

  • 772

我正在尝试通过互联网将两个管理程序连接在一起。两个管理程序都运行 KVM 进行虚拟化,我手动为 VM 网络创建了网桥,目前可以使用。

我想使用 Wireguard 连接这两个虚拟机管理程序上的虚拟机桥接器,以便虚拟机可以从一个虚拟机管理程序迁移到另一个虚拟机管理程序,而虚拟机本身没有任何路由/网络更改。

不过在开始之前,我意识到我不知道如何设置 Wireguard,以使两个管理程序上的网桥对另一个管理程序可见,但管理程序本身不会出现在 VPN 上,因此虚拟机无法直接连接/攻击管理程序。

Wireguard 能够做到这一点吗?或者由于 Wireguard 在 OSI 堆栈而不是以太网帧级别上的工作方式,这是不可能的?

谁能说出是否可以使用 Wireguard 来“盲目地”桥接两个网络?还是主机也总是出现在网络上?其他一些 VPN 解决方案会允许这样做吗?或者我最好使用防火墙来锁定我不想被访问的主机?

提前致谢!

linux
  • 1 1 个回答
  • 2398 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2019-09-15T04:37:47+08:002019-09-15T04:37:47+08:00

    Wireguard 在第 3 层(路由 IP 数据包)工作,而网桥在第 2 层(交换以太网帧)工作。所以wireguard不能这样做。这个问题已经被问过,并且wireguard的作者在wireguard的邮件列表中做出了回答:Bridging wg and normal interfaces?.

    所以在通过wireguard之前需要一个额外的封装层。我确信有多种选择(其中VXLAN在Linux上也可用)。

    我使用GRETAP和命名空间(而不是实际的管理程序和虚拟机)做了一个示例。我发现,为了避免强制本地 VM 流量具有比可能的更有限的数据包大小,需要进行分段处理,但GRETAP有一些限制,如下所述:GRE 桥接、IPsec 和 NFQUEUE。我选择使用nftables 的有效负载修饰而不是 NFQUEUE 和用户空间来解决它。

    另请注意,RFC 6864解释说,由于 IP ID 字段的限制,分段数据包大部分时间应限制在 6.4Mbp/s,现在速度很慢,但通过具有强完整性检查的隧道,可以放松它。

    在这里,(假)虚拟机通过网桥链接,没有其他连接。除了他们自己,他们看不到其他任何东西:他们看不到使用 gretap+wireguard 链接两个网桥的(假)管理程序。只需运行这个创建和配置多个命名空间的 bash 脚本。使用 nftables 0.9.2 和内核 5.2.x 进行测试。

    #!/bin/bash
    
    if ip netns id | grep -qv '^ *$' ; then
        printf 'ERROR: leave netns "%s" first\n' $(ip netns id) >&2
        exit 1
    fi
    
    hosts='vm11 vm12 hyp1 router hyp2 vm21 vm22'
    
    for ns in $hosts; do
        ip netns del $ns 2>/dev/null || :
        ip netns add $ns
        ip netns exec $ns sysctl -q -w net.ipv6.conf.default.disable_ipv6=1
        ip netns exec $ns sysctl -q -w net.ipv4.icmp_echo_ignore_broadcasts=0
    done
    
    for ns in $hosts; do
        ip -n $ns link set lo up
    done
    
    link_ns () {
        ip -n $1 link add name "$3" type veth peer netns $2 name "$4"
        ip -n $1 link set dev "$3" up
        ip -n $2 link set dev "$4" up
    }
    
    for h in 1 2; do
        ip -n hyp$h link add bridge0 address 02:00:00:00:00:0$h type bridge
        ip -n hyp$h link set bridge0 up
        for n in 1 2; do
            link_ns vm$h$n hyp$h eth0 port$n
            ip -n hyp$h link set dev port$n master bridge0
            ip -n vm$h$n address add 10.0.$h.$n/16 dev eth0
        done
        link_ns hyp$h router eth0 site$h
    done
    
    ip -n router address add 192.0.2.1/24 dev site1
    ip -n router address add 198.51.100.1/24 dev site2
    
    ip -n hyp1 address add 192.0.2.100/24 dev eth0
    ip -n hyp1 route add default via 192.0.2.1
    
    ip -n hyp2 address add 198.51.100.200/24 dev eth0
    ip -n hyp2 route add default via 198.51.100.1
    
    privkey1=$(wg genkey)
    privkey2=$(wg genkey)
    
    pubkey1=$(printf '%s' "$privkey1" | wg pubkey)
    pubkey2=$(printf '%s' "$privkey2" | wg pubkey)
    
    for h in 1 2; do
        ip -n hyp$h link add name wg0 type wireguard
        ip -n hyp$h address add 10.100.0.$h/24 dev wg0
        ip -n hyp$h link set dev wg0 up
    done
    
    ip netns exec hyp1 wg set wg0 private-key <(printf '%s' "$privkey1") listen-port 11111 peer "$pubkey2" endpoint 198.51.100.200:22222 allowed-ips 10.100.0.2
    ip netns exec hyp2 wg set wg0 private-key <(printf '%s' "$privkey2") listen-port 22222 peer "$pubkey1" endpoint 192.0.2.100:11111 allowed-ips 10.100.0.1
    
    for h in 1 2; do
        ip -n hyp$h link add name gt0 mtu 1500 type gretap remote 10.100.0.$((3-$h)) local 10.100.0.$h nopmtud
        ip -n hyp$h link set gt0 master bridge0
        ip -n hyp$h link set gt0 up
        ip netns exec hyp$h nft -f /dev/stdin << EOF
    table ip filter {
        chain output {
            type filter hook output priority 0; policy accept;
            ip protocol gre ip saddr 10.100.0.$h ip daddr 10.100.0.$((3-$h)) ip frag-off set ip frag-off & 0xbfff counter
        }
    }
    EOF
    done
    

    示例(来自远程端的延迟更大):

    # ip netns exec vm11 ping -b 10.0.255.255
    WARNING: pinging broadcast address
    PING 10.0.255.255 (10.0.255.255) 56(84) bytes of data.
    64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=0.048 ms
    64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.194 ms (DUP!)
    64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.646 ms (DUP!)
    64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=0.685 ms (DUP!)
    64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=0.059 ms
    64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.154 ms (DUP!)
    64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=0.476 ms (DUP!)
    64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=0.490 ms (DUP!)
    ^C
    --- 10.0.255.255 ping statistics ---
    2 packets transmitted, 2 received, +6 duplicates, 0% packet loss, time 1050ms
    rtt min/avg/max/mdev = 0.048/0.344/0.685/0.243 ms
    
    • 2

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve