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
    • 最新
    • 标签
主页 / unix / 问题 / 735835
Accepted
schweik
schweik
Asked: 2023-02-18 00:00:23 +0800 CST2023-02-18 00:00:23 +0800 CST 2023-02-18 00:00:23 +0800 CST

如何使用 nftables 保护 tap 接口

  • 772

Qemu 虚拟机连接局域网主要有两种方式:type=user或type=tap. 该user模式将私有网络中的虚拟机完全隔离,通过 sNAT 托管主网络堆栈。使用tap比较复杂,需要一个virtualbridge成为master一个物理接口(eth0)和虚拟接口(tap0)。这tap0就像一个管道,用于从外部世界和主机流向 VM 的数据。我花了很多时间试图调节tap0主机端接口上的网络流量iptables/nftables例如将所有 http 请求重定向到某个内部 ip 地址,但没有成功。所有的建议、论坛和 wiki 都推荐了大量的解决方案,但这些解决方案都行不通,主要原因是:来自 VM guest 的数据包永远不会到达主机内核网络堆栈。如果 IP 主机地址不是他们的目标,他们会在网桥级别选择自己的方式,并且不满足任何数据包过滤器链调整的任何防火墙规则。您可以简单地通过将主机全局策略设置为 (with host XYtables) 来尝试DROP,您可以看到:主机网络完全失效,但来宾可以继续通过网络发送和接收数据包。

好吧,问题是:有没有其他方法,如何将 VM 来宾虚拟连接到主机虚拟网络接口?为了更好地理解图表如下:

     General virtual connections for host/VM guest
    +---------------------------------------------+
    |    +-----------------------------+          |
    |    |    iptables    host kernel  |          |
    |    |    nftables   network stack |          |
    |    +-------+---------------------+          |
    |            |                                |
    |    +-------+---------+      +-----------+   |
---eth0--+    virtual      |      |    VM     |   |
    |    |    bridge       +-tap-eth0 guest   |   |
---eth1--+      br0        |      |           |   |
    |    +-----------------+      +-----------+   |
    +---------------------------------------------+


       Host became a router for VM guest
    +-------------------------------------+
    |    +----------------+  +---------+  |
---eth0-->  host kernel   |  |    VM   |  |
    |    |                <-vppp guest |  |
---eth1-->  network stack |  |         |  |
    |    +----------------+  +---------+  |
    +-------------------------------------+

要解决我的问题,必须找到一种方法来控制(例如使用 nftables)虚拟网桥本身的流量,或者如何通过虚拟线路将 VM 来宾网络接口连接到主机的虚拟网络接口。类似于 PPPoE 网络。

但最终和最明确的方法是向 Qemu 用户模式网络添加更多参数,以便能够强制将某些端口(服务)重定向到选定的目标地址,包括主机环回。是的,我向 Qemu 团队表达了这样的愿望,并得到了答复:这不是最重要的功能。

virtual-machine
  • 1 1 个回答
  • 15 Views

1 个回答

  • Voted
  1. Best Answer
    Austin Hemmelgarn
    2023-02-18T09:40:44+08:002023-02-18T09:40:44+08:00

    有两种可能的解决方案:

    • 使用 nftablesbridge系列并在第 3 层以下进行过滤。
    • 将主机用作路由器。

    第一个解决方案是更有效的选择,但限制您过滤以太网帧的属性。您无法过滤 IP 地址或端口,或第 3 层或更高层的任何其他内容,因为网桥不处理任何此类数据。

    第二种解决方案更有可能让你在这里做你想做的事。这实际上很简单,具体有两个原因:

    • 您可以直接在网桥接口上分配 IP 地址,就像任何其他网络设备类型一样。
    • 您不需要将任何物理网络设备连接到网桥接口。

    给这个,你想做的“正常”设置是:

    1. 在主机系统上设置桥接接口。为其分配静态 IP,但不要将其连接到任何物理接口。
    2. 配置 nftables,以便系统处理步骤 1 中的桥接接口与任何外部接口之间的路由。
    3. 启动 VM 时,将其附加到步骤 1 中的桥接接口。

    然后,您只需过滤 nftables 中的内容,就像系统充当外围防火墙一样。您可以通过在主机系统上设置 DHCP 服务器和缓存 DNS 解析器来简化此操作,这样您就不需要为 VM 提供静态网络配置。

    • 1

相关问题

  • VirtualBox guest Win10 @ Linux 主机在启动时挂了很大的时间,如何排除故障?

  • Debian 9:如何在 QEMU-Host 和 QEMU-Guest (Windows) 之间设置 Samba-Exchange?

  • 如何手动触发来宾上的 virtio 气球驱动程序?

  • 如何在运行时从命令行更改 KVM VNC 端口?

  • LXC 容器内部从零开始的 Linux

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve