Linux 虚拟机防火墙如何实现

2023-09-01 15:53:37 +08:00
 bitllion

我在 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 , 但规则没有生效,请问各位大佬有什么办法呢

1671 次点击
所在节点    Linux
12 条回复
NessajCN
2023-09-01 16:06:51 +08:00
你给虚拟机设置防火墙为什么不进虚拟机里设,而是在宿主机上设?
bitllion
2023-09-01 16:12:22 +08:00
@NessajCN 因为想做一个云的防火墙
NessajCN
2023-09-01 16:27:52 +08:00
@bitllion 那你的正确做法应该是在虚拟机上开放接口供远程修改虚拟机的防火墙配置,而不是在宿主机上动手脚。
或者你的意思是类似云服务商那样网页上修改虚拟机的防火墙?那是通过修改网关的防火墙配置来实现的不是改宿主机。如果你的宿主机提供的只是桥接,那你要去路由那边改防火墙才对
bitllion
2023-09-01 16:39:49 +08:00
@NessajCN 我这里只想做在宿主机下限制本地多个虚拟机的流量,因为我们的虚拟机没有对公网提供服务的设计,如果有那是做的网关上的端口映射,我的设计是 提供一个类似于 VPC 网络下的虚拟机防火墙
zbinlin
2023-09-01 16:40:23 +08:00
改用 FORWARD chain 试试
NessajCN
2023-09-01 16:44:07 +08:00
@bitllion 桥接的网卡不能通过宿主机限制虚拟机流量,你可以理解为 你现在的需求类似于在电脑 A 上限制同局域网下电脑 B 的流量。或者你改成 nat 就可以了,这样相当与你拿宿主机当虚拟机的网关
wangbin526
2023-09-01 16:46:55 +08:00
参考下通过宿主机的防火墙控制本机 Docker 容器网络的方案,可能会有帮助
https://github.com/chaifeng/ufw-docker
bitllion
2023-09-01 16:54:10 +08:00
@NessajCN 那 pve(promox) 是可以实现对同局域网下虚拟机的防火墙,我看我启用了 pve 的虚拟机的防火墙后,宿主机 iptables 会多出相应的安全规则
yanqiyu
2023-09-01 18:29:14 +08:00
这种情况下网络请求是从桥上走的,估计得开 bridge-nf-call-iptables 才能让这些请求被过滤
但是要注意这么开可能有别的副作用
tomychen
2023-09-06 14:25:23 +08:00
如果没记错,虚拟网卡应该走了 NAT 出去,优先级上而言 filter 在 nat 后面,所以包不会过 input/output 链,部分版本的 nat 有 INPUT/OUTPUT filter ,没试过,但楼上有提到了,FORWARD 应该是可以断下来的
7890qwaszx
2023-10-09 13:01:19 +08:00
网桥( br )得用 ebtables
iptables 管不到网桥上的一些流量
bitllion
2023-10-11 14:19:04 +08:00
回复大家下这里实现了 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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX