我在 linux ( centos8 )宿主机上创建了一个名叫 switch 的网桥,这样宿主机和虚拟机都能通过这个网桥上网。
现在有个问题,我想限制外部访问虚拟机的流量,通过nmcli c show
命令查看虚拟机启动后多了一个名叫 vnet0 的tun
类型的设备,这个设备应该是虚拟机的虚拟网卡吧 ?
那么理论上可以使用 iptables 命令对 vnet0 设备进行流量过滤从而达到 限制外部访问虚拟机的目的。
所以我尝试使用 iptables -A INPUT -i vnet0 -m mac --mac-source fe:54:00:1a:71:a9 -j DROP
, 但规则没有生效,请问各位大佬有什么办法呢
1
NessajCN 2023-09-01 16:06:51 +08:00
你给虚拟机设置防火墙为什么不进虚拟机里设,而是在宿主机上设?
|
3
NessajCN 2023-09-01 16:27:52 +08:00
@bitllion 那你的正确做法应该是在虚拟机上开放接口供远程修改虚拟机的防火墙配置,而不是在宿主机上动手脚。
或者你的意思是类似云服务商那样网页上修改虚拟机的防火墙?那是通过修改网关的防火墙配置来实现的不是改宿主机。如果你的宿主机提供的只是桥接,那你要去路由那边改防火墙才对 |
4
bitllion OP @NessajCN 我这里只想做在宿主机下限制本地多个虚拟机的流量,因为我们的虚拟机没有对公网提供服务的设计,如果有那是做的网关上的端口映射,我的设计是 提供一个类似于 VPC 网络下的虚拟机防火墙
|
5
zbinlin 2023-09-01 16:40:23 +08:00
改用 FORWARD chain 试试
|
6
NessajCN 2023-09-01 16:44:07 +08:00
@bitllion 桥接的网卡不能通过宿主机限制虚拟机流量,你可以理解为 你现在的需求类似于在电脑 A 上限制同局域网下电脑 B 的流量。或者你改成 nat 就可以了,这样相当与你拿宿主机当虚拟机的网关
|
7
wangbin526 2023-09-01 16:46:55 +08:00
参考下通过宿主机的防火墙控制本机 Docker 容器网络的方案,可能会有帮助
https://github.com/chaifeng/ufw-docker |
8
bitllion OP @NessajCN 那 pve(promox) 是可以实现对同局域网下虚拟机的防火墙,我看我启用了 pve 的虚拟机的防火墙后,宿主机 iptables 会多出相应的安全规则
|
9
yanqiyu 2023-09-01 18:29:14 +08:00
这种情况下网络请求是从桥上走的,估计得开 bridge-nf-call-iptables 才能让这些请求被过滤
但是要注意这么开可能有别的副作用 |
10
tomychen 2023-09-06 14:25:23 +08:00
如果没记错,虚拟网卡应该走了 NAT 出去,优先级上而言 filter 在 nat 后面,所以包不会过 input/output 链,部分版本的 nat 有 INPUT/OUTPUT filter ,没试过,但楼上有提到了,FORWARD 应该是可以断下来的
|
11
7890qwaszx 2023-10-09 13:01:19 +08:00
网桥( br )得用 ebtables
iptables 管不到网桥上的一些流量 |
12
bitllion OP 回复大家下这里实现了 iptables 对虚拟机的流量控制
#ipv4d 转发不用开启 sysctl net.ipv4.ip_forward=0 # 需要开启桥的 iptables 转发 sysctl net.bridge.bridge-nf-call-iptables=1 # 创建和虚拟机 id 相同名字的规则链 iptables -t filter -N kvmtest # 开启转发 iptables -A FORWARD -j kvmtest # 添加默认规则 iptables -A kvmtest -m state --state INVALID -j DROP iptables -A kvmtest -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A kvmtest -j DROP # 添加自定义规则 iptables -I kvmtest -p tcp --dport 22 -j ACCEPT #和平常添加自定义规则一样 iptables -I kvmtest -p tcp --dport 80 -j ACCEPT iptables -I kvmtest -p icmp -j ACCEPT # 删除规则链 需要依次删除转发、清楚规则链中内容、再删除规则链 iptables -D FORWARD -j kvmtest iptables -F kvmtest iptables -X kvmtest |