You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置仅可访问互联网的隔离式LXD容器

如何配置仅可访问互联网的隔离式LXD容器

嘿,你的这个需求在多客户容器部署场景里太常见了——既要让容器能正常上网装软件,又要把它们和其他容器、主机隔离开,避免互相干扰或者安全问题。我给你梳理两个核心问题的解决方案,最后整合起来实现你要的“仅能访问互联网的隔离容器”效果:

一、解决容器之间互相访问的问题

你提到的“给每个容器单独配网桥”是可行的,但管理起来有点繁琐。这里有两个方案,你可以根据需求选:

方案1:单网桥+防火墙规则(推荐,高效易管理)

如果你的容器都用同一个网桥(比如默认的lxdbr0),直接在网桥上加防火墙规则就能阻止容器间通信,不用折腾多个网桥:

  1. 先确认网桥的子网:运行ip addr show lxdbr0,比如输出里的子网是10.150.0.0/24
  2. 添加iptables规则,拒绝同一子网内的容器互相通信:
    iptables -I FORWARD -i lxdbr0 -o lxdbr0 -s 10.150.0.0/24 -d 10.150.0.0/24 -j DROP
    
  3. 为了让规则重启后不丢失,把规则保存到系统配置:
    iptables-save > /etc/iptables/rules.v4
    
    如果你用的是Ubuntu新版本(20.04+),默认用nftables的话,规则可以这么加:
    nft add rule inet filter forward iifname lxdbr0 oifname lxdbr0 ip saddr 10.150.0.0/24 ip daddr 10.150.0.0/24 drop
    nft list ruleset > /etc/nftables.conf
    

方案2:每个容器配独立网桥(适合极端隔离需求)

如果对隔离等级要求极高,比如完全物理层面的隔离,那就给每个容器单独建网桥:

  1. 为容器创建专属网桥:
    lxc network create client1_bridge ipv4.address=10.151.0.1/24 ipv4.nat=true
    
  2. 把容器挂载到这个网桥上:
    lxc config device add client1_container eth0 nic network=client1_bridge name=eth0
    
    这个方法的缺点是每个网桥会占用一个子网,管理成本高,一般只用于特别敏感的场景。

二、阻止容器访问LXD主机端口,但保留互联网访问

这里关键是要拒绝容器访问主机的所有IP,但得留好必要的出口(比如DNS,不然容器没法解析域名上网):

  1. 先获取主机的所有本地IP:比如物理网卡IP192.168.1.100,网桥IP10.150.0.1
  2. 添加iptables规则,拒绝容器访问主机IP,但放行DNS:
    # 拒绝容器访问主机的物理网卡IP
    iptables -I FORWARD -i lxdbr0 -d 192.168.1.100/32 -j DROP
    # 拒绝容器访问网桥IP(主机侧),但放行DNS端口(53)保证域名解析
    iptables -I FORWARD -i lxdbr0 -d 10.150.0.1/32 -j DROP
    iptables -I FORWARD -i lxdbr0 -d 10.150.0.1/32 -p udp --dport 53 -j ACCEPT
    iptables -I FORWARD -i lxdbr0 -d 10.150.0.1/32 -p tcp --dport 53 -j ACCEPT
    
    如果你的容器用的是外部DNS(比如8.8.8.8),那可以跳过最后两条DNS放行规则。
  3. 同样把规则保存到系统配置,确保重启后生效。

三、用LXD Profile批量管理隔离容器

为了方便后续创建容器,建议把这些配置做成一个专属Profile,以后创建容器直接套用:

  1. 创建新Profile:
    lxc profile create isolated-internet
    
  2. 编辑Profile配置(运行lxc profile edit isolated-internet),把内容改成:
    config:
      security.devlxd: "false"  # 禁用容器访问主机的LXD socket,进一步隔离
      security.privileged: "false"
    devices:
      eth0:
        name: eth0
        network: lxdbr0
        type: nic
    
  3. 以后创建隔离容器时,直接用这个Profile:
    lxc launch ubuntu:22.04 my-isolated-container --profile isolated-internet
    

验证配置

创建测试容器后,进入容器验证:

  • 尝试ping其他容器的IP:应该ping不通
  • 尝试ping主机的IP:应该ping不通(但nslookup google.com能正常解析)
  • 尝试访问google.com或者安装软件:应该能正常操作

这样就完全实现了你要的“仅可访问互联网的隔离式LXD容器”效果。

备注:内容来源于stack exchange,提问作者Rijul Sudhir

火山引擎 最新活动