我有一个像这样的家庭实验室设置(图表也可用这里):
这里需要注意的一件事是,我的 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/interfaces
Proxmox主机中的内容:
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-up
行post-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 和虚拟机 2 访问家庭网络中的设备? TCP/UDP/ICMP 等等。
当我使用笔记本电脑或台式机时,如何访问 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 专用的,但我用它来说明要求。