Homelab Proxmox VM中的虚拟路由器:如何将请求从主/家庭网络发送到虚拟路由器后面的VM?

Homelab Proxmox VM中的虚拟路由器:如何将请求从主/家庭网络发送到虚拟路由器后面的VM?

我有一个像这样的家庭实验室设置(图表也可用这里):

网络

这里需要注意的一件事是,我的 Proxmox 主机只有 1 个用于以太网电缆的 NIC。它也有 WiFi,但我决定不使用它,因为它不能很好地满足我想做的事情(这是我在阅读了数十篇相关文章/论坛后的理解)。

所以我从 WiFi 中继器上插入了以太网线。这台 Proxmox 主机位于我家的不同位置 - 这就是为什么我没有将以太网直接插入家庭路由器。从我的笔记本电脑上,我可以通过无线 SSH 连接到 Proxmox 主机 ( 192.168.1.5)。我还可以很好地无线访问 Proxmox 的 Web UI https://192.168.1.5:8006

我想要在这里做的是我的家庭网络和虚拟机网络之间的网络分段。我知道有免费的路由器软件,如 pfSense、OpenWrt 等。但我想借此机会从头开始构建它,以便我可以更好地了解事物是如何协同工作的。

我计划在此 Proxmox 主机中运行一些虚拟机。它们都应该在我在这里创建的虚拟机网络中运行。有些虚拟机可能在动态 IP/DHCP 模式下运行,有些虚拟机可能在静态 IP 模式下运行。其中 99% 将是 Linux 虚拟机。目前,该虚拟机网络中没有 IPv6 支持,我也能正常工作。另外,使用 VLAN 也不是一种选择,因为我的路由器不支持 VLAN。

说完我就跟着本指南在 Ubuntu VM 中创建虚拟路由器。我所做的与该指南唯一不同的是我创建了一个网桥 ( br0) 并为其分配了一个静态 IP ( 192.168.2.1/24),因此它可以成为我的虚拟机网络的路由器/虚拟交换机。

我没有遵循从 Internet 到 LAN 的端口转发那么,关于那个测试...步骤,因为我不需要它们。换句话说,我遵循了所有步骤,直到并包括允许流量传至 Internet步。

我目前看到的:

  • [OK]虚拟机之间可以互相ping通
  • [确定] 虚拟机可以 ping 通互联网
  • [不正常] VM 1 和 VM 2 可以 ping 通家庭网络中的设备,例如笔记本电脑和路由器
  • [确定] 笔记本电脑可以 ping 通路由器虚拟机
  • [异常] 笔记本电脑无法 ping 通虚拟机 1 或虚拟机 2*

* 我已经通过以下方式在我的笔记本电脑中添加了静态路由本指南。我还尝试在家庭路由器/网关中添加静态路由。

FWIW,下面是我的配置...

ip a来自 Proxmox 主机:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP group default qlen 1000
    link/ether fc:4d:d4:f3:fe:d3 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 28:c2:dd:a5:46:53 brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fc:4d:d4:f3:fe:d3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 scope global vmbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::fe4d:d4ff:fef3:fed3/64 scope link
       valid_lft forever preferred_lft forever
5: vmbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 8e:7e:21:7e:f9:e1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8c7e:21ff:fe7e:f9e1/64 scope link
       valid_lft forever preferred_lft forever
11: tap104i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UNKNOWN group default qlen 1000
    link/ether b6:5c:75:be:38:d5 brd ff:ff:ff:ff:ff:ff
12: vmbr2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 3e:6b:04:2c:d9:e0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::3c6b:4ff:fe2c:d9e0/64 scope link
       valid_lft forever preferred_lft forever
13: tap104i1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr2 state UNKNOWN group default qlen 1000
    link/ether 46:d9:8f:dd:ab:77 brd ff:ff:ff:ff:ff:ff
23: tap102i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr2 state UNKNOWN group default qlen 1000
    link/ether 46:9c:a4:fd:81:27 brd ff:ff:ff:ff:ff:ff
24: tap103i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr2 state UNKNOWN group default qlen 1000
    link/ether 12:90:ee:36:27:7a brd ff:ff:ff:ff:ff:ff

/etc/network/interfacesProxmox主机中的内容:

auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.5/24
    gateway 192.168.1.1
    bridge-ports eno1
    bridge-stp off
    bridge-fd 0

iface wlp2s0 inet manual

auto vmbr1
iface vmbr1 inet manual
    bridge-ports none
    bridge-stp off
    bridge-fd 0

auto vmbr2
iface vmbr2 inet manual
    bridge-ports none
    bridge-stp off
    bridge-fd 0

post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE

笔记:

  • vmbr1来自我之前的实验,与这里无关/相关;我的虚拟机均未使用vmbr1网络
  • post-uppost-down复制自本指南- 我的尝试和错误努力的一部分

ip a来自路由器虚拟机:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 2a:06:12:a9:18:98 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.1.175/24 metric 100 brd 192.168.1.255 scope global dynamic ens18
       valid_lft 4270sec preferred_lft 4270sec
    inet6 fe80::2806:12ff:fea9:1898/64 scope link
       valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether ca:bc:10:17:e0:2f brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    inet6 fe80::c8bc:10ff:fe17:e02f/64 scope link
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether da:56:23:09:09:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::d856:23ff:fe09:972/64 scope link
       valid_lft forever preferred_lft forever

/etc/network/interfaces路由器VM中的内容:

auto lo
iface lo inet loopback

auto ens18
iface ens18 inet dhcp

#auto ens19
#iface ens19 inet static
#   address 192.168.99.1
#   netmask 255.255.255.0

路由器虚拟机中的 IP 转发配置:

$ cat /etc/sysctl.conf | grep net.ipv4.ip_forward
net.ipv4.ip_forward=1

/etc/network/if-pre-up.d/iptables路由器VM中的内容:

#!/bin/sh
/sbin/iptables-restore < /etc/network/iptables

/etc/network/iptables路由器VM中的内容:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# ens18 is WAN interface
# br0 is LAN interface
-A POSTROUTING -o ens18 -j MASQUERADE

COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Service rules
# basic global accept rules - ICMP, loopback, traceroute, established all accepted
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT

# enable traceroute rejections to get sent out
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable

# DNS - accept from LAN
-A INPUT -i br0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i br0 -p udp --dport 53 -j ACCEPT

# DHCP client requests - accept from LAN
-A INPUT -i br0 -p udp --dport 67:68 -j ACCEPT

# SSH - accept from WAN
-A INPUT -i ens18 -p tcp --dport 22 -j ACCEPT

# drop all other inbound traffic
-A INPUT -j DROP

# Forwarding rules
# forward packets along established/related connections
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# forward ICMP
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -p icmp -s 0.0.0.0/0 -d 192.168.2.0/24 -j ACCEPT

# forward from LAN (br0) to WAN (ens18)
-A FORWARD -i br0 -o ens18 -j ACCEPT

# drop all other forwarded traffic
-A FORWARD -j DROP

COMMIT

路由器虚拟机中的命令结果sudo iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i br0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i br0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i br0 -p udp -m udp --dport 67:68 -j ACCEPT
-A INPUT -i ens18 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -d 192.168.2.0/24 -p icmp -j ACCEPT
-A FORWARD -i br0 -o ens18 -j ACCEPT
-A FORWARD -j DROP

路由器虚拟机中的 DHCP 配置/etc/dhcp/dhcpd.conf

subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.100 192.168.2.199;
    option routers 192.168.2.1;
    option domain-name-servers 192.168.2.1;
    option broadcast-address 192.168.2.255;
        host ubuntu-desktop {
          hardware ethernet 5A:5B:74:01:69:34;
          fixed-address 192.168.2.2;
        }
}

注:ubuntu-desktop是VM 1

问题:

  1. 如何阻止虚拟机 1 和虚拟机 2 访问家庭网络中的设备? TCP/UDP/ICMP 等等。

  2. 当我使用笔记本电脑或台式机时,如何访问 VM 1 和 VM 2,例如发送 ping/ICMP 请求(ping 192.168.2.2/ ping 192.168.2.101),访问在两个 VM 上的端口 80 ( curl 192.168.2.2/ ) 上运行的 Nginx 进程和在端口 22 ( / )curl 192.168.2.101上运行的 SSH 服务器进程?ssh [email protected]ssh [email protected]

我对此进行了一些研究,并进入了 DNAT/SNAT/Masquerade 主题,但我不确定这是否是我需要的。如果是,规则应该是什么样的?我对这个 iptables 主题还不熟悉。我尝试了下面的规则,但我仍然无法从我的笔记本电脑 ping 到 VM 1 和 VM 2。

iptables -I FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j SNAT --to 192.168.2.1

答案1

桥接接口允许 VM1 和 VM2 ping 笔记本电脑和 PC,因为它们属于同一广播域 (192.168.2.0/24)。您将需要摆脱桥接口并替换为仅主机适配器/网络。

假设您的虚拟机隔离网络是 192.168.10.0/24。然后,您必须在路由器虚拟机上启用伪装

$ sudo iptables -A POSTROUTING -o ens18 -j MASQUERADE

对于笔记本电脑/PC ping VM1 或 VM2,您需要通过 promox (192.168.1.5) 在物理 GW/路由器上添加静态路由。

$ sudo ip route add 192.168.10.0/24 via 192.168.1.5

如果您的物理路由器/网关不支持静态路由,则您可能会遇到路由问题。上面的命令是 Linux 专用的,但我用它来说明要求。

参考:https://dannyda.com/2020/06/01/how-to-create-an-internal-only-isolated-network-for-guest-os-virtual-machines-vm-on-proxmox-ve-pve-就像在 vmware-workstation-host-only-network-but- different/

相关内容