V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
bitllion
V2EX  ›  Linux

Linux 虚拟机防火墙如何实现

  •  
  •   bitllion · 2023-09-01 15:53:37 +08:00 · 1686 次点击
    这是一个创建于 456 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    12 条回复    2023-10-11 14:19:04 +08:00
    NessajCN
        1
    NessajCN  
       2023-09-01 16:06:51 +08:00
    你给虚拟机设置防火墙为什么不进虚拟机里设,而是在宿主机上设?
    bitllion
        2
    bitllion  
    OP
       2023-09-01 16:12:22 +08:00
    @NessajCN 因为想做一个云的防火墙
    NessajCN
        3
    NessajCN  
       2023-09-01 16:27:52 +08:00
    @bitllion 那你的正确做法应该是在虚拟机上开放接口供远程修改虚拟机的防火墙配置,而不是在宿主机上动手脚。
    或者你的意思是类似云服务商那样网页上修改虚拟机的防火墙?那是通过修改网关的防火墙配置来实现的不是改宿主机。如果你的宿主机提供的只是桥接,那你要去路由那边改防火墙才对
    bitllion
        4
    bitllion  
    OP
       2023-09-01 16:39:49 +08:00
    @NessajCN 我这里只想做在宿主机下限制本地多个虚拟机的流量,因为我们的虚拟机没有对公网提供服务的设计,如果有那是做的网关上的端口映射,我的设计是 提供一个类似于 VPC 网络下的虚拟机防火墙
    zbinlin
        5
    zbinlin  
       2023-09-01 16:40:23 +08:00
    改用 FORWARD chain 试试
    NessajCN
        6
    NessajCN  
       2023-09-01 16:44:07 +08:00
    @bitllion 桥接的网卡不能通过宿主机限制虚拟机流量,你可以理解为 你现在的需求类似于在电脑 A 上限制同局域网下电脑 B 的流量。或者你改成 nat 就可以了,这样相当与你拿宿主机当虚拟机的网关
    wangbin526
        7
    wangbin526  
       2023-09-01 16:46:55 +08:00
    参考下通过宿主机的防火墙控制本机 Docker 容器网络的方案,可能会有帮助
    https://github.com/chaifeng/ufw-docker
    bitllion
        8
    bitllion  
    OP
       2023-09-01 16:54:10 +08:00
    @NessajCN 那 pve(promox) 是可以实现对同局域网下虚拟机的防火墙,我看我启用了 pve 的虚拟机的防火墙后,宿主机 iptables 会多出相应的安全规则
    yanqiyu
        9
    yanqiyu  
       2023-09-01 18:29:14 +08:00
    这种情况下网络请求是从桥上走的,估计得开 bridge-nf-call-iptables 才能让这些请求被过滤
    但是要注意这么开可能有别的副作用
    tomychen
        10
    tomychen  
       2023-09-06 14:25:23 +08:00
    如果没记错,虚拟网卡应该走了 NAT 出去,优先级上而言 filter 在 nat 后面,所以包不会过 input/output 链,部分版本的 nat 有 INPUT/OUTPUT filter ,没试过,但楼上有提到了,FORWARD 应该是可以断下来的
    7890qwaszx
        11
    7890qwaszx  
       2023-10-09 13:01:19 +08:00
    网桥( br )得用 ebtables
    iptables 管不到网桥上的一些流量
    bitllion
        12
    bitllion  
    OP
       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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2610 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:44 · PVG 14:44 · LAX 22:44 · JFK 01:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.