AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1047365
Accepted
Łukasz Zaroda
Łukasz Zaroda
Asked: 2020-12-24 13:10:23 +0800 CST2020-12-24 13:10:23 +0800 CST 2020-12-24 13:10:23 +0800 CST

在“路由”模式下设置的 LXC 容器中没有网络连接

  • 772

我在 Vagrant 中尝试使用 lxc/lxd,但我对它很陌生。我设法创建了正在运行的容器,但我无法从其中 ping 任何东西(包括 8.8.8.8)。我可以从我的顶级非虚拟系统 ping 它的 IP,但它拒绝 SSH 连接。我只能使用直接从容器的主机(Vagrant)直接进入容器lxc exec my-container /bin/bash。

routed出于学习目的,我尝试在该模式下设置我的容器,但我仍然想要它。不过,LXD/LXC 文档似乎有些欠缺。

我尝试按照以下说明操作:https ://blog.simos.info/how-to-get-lxd-containers-get-ip-from-the-lan-with-routed-network/但它不起作用我到底。我可能会错过一些东西,因为我还不精通 linux 网络。

我的 Vagrant 主机正在运行Ubuntu 20.04。

我的 LXC 容器正在运行Debian 10。

我的 Vagrant 主机上的 LXC 配置:

config:
  core.https_address: '[::]:8443'
  core.trust_password: true
networks: []
storage_pools:
- config:
    source: /home/luken/lxd-storage-pools
  description: ""
  name: default
  driver: dir
profiles:
- name: default
  config: {}
  description: ""
  devices:
    root:
      path: /
      pool: default
      type: disk
- name: mail-server
  config:
    user.network-config: |
      version: 2
      ethernets:
        eth0:
          addresses:
          - 192.168.33.11/32
          nameservers:
            addresses:
            - 8.8.8.8
            search: []
          routes:
          -   to: 0.0.0.0/0
            via: 169.254.0.1
  description: Mail Server LXD profile
  devices:
    eth0:
      ipv4.address: 192.168.33.11
      nictype: routed
      parent: eth1
      type: nic
cluster: null

ip addr在我的流浪主机中:

luken@luken-tech-test:~$ ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:be:4a:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 76347sec preferred_lft 76347sec
    inet6 fe80::a00:27ff:febe:4ae8/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:65:e6:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.2/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe65:e628/64 scope link 
       valid_lft forever preferred_lft forever
6: vetha8400046@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:48:28:3e:e4:fa brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.0.1/32 scope global vetha8400046
       valid_lft forever preferred_lft forever
    inet6 fe80::fc48:28ff:fe3e:e4fa/64 scope link 
       valid_lft forever preferred_lft forever

ip addr在我的容器中:

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: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 9a:14:96:30:67:43 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.33.11/32 brd 255.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9814:96ff:fe30:6743/64 scope link 
       valid_lft forever preferred_lft forever

ip r在我的流浪主机中:

default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100 
192.168.33.0/24 dev eth1 proto kernel scope link src 192.168.33.2 
192.168.33.11 dev vetha8400046 scope link

ip r在我的容器中:

default via 169.254.0.1 dev eth0 
169.254.0.1 dev eth0 scope link

有什么我错过的吗(可能很多)?

networking linux-networking lxd lxc
  • 2 2 个回答
  • 3317 Views

2 个回答

  • Voted
  1. Anton Danilov
    2021-01-13T05:27:35+08:002021-01-13T05:27:35+08:00

    要使您的计划有效,需要做几件事:

    1. 检查主机接口上的转发:ip -4 netconf show dev vetha8400046和ip -4 netconf show dev eth0. 您应该在输出中看到启用的转发。否则使用sysctl -w net.ipv4.conf.<iface>.forwarding=1命令启用它。将对应的字符串添加到/etc/sysctl.conf文件中,使其持久化。

    2. 检查主机上的路由:ip -4 route get 8.8.8.8 from 192.168.33.11 iif vetha8400046. 您应该会看到通过您的默认网关的有效路由(... via 10.0.2.2 dev .... 也检查反向路由与ip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0.

    3. 从主机 ping 容器,反之亦然。

    4. 在主机上设置 NAT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE:. 从容器 ping 一些外部主机。此规则中的计数器iptables-save -c应为非零。

    5. 如果你卡住了,就问这个问题。

    • 1
  2. Best Answer
    Łukasz Zaroda
    2021-01-27T06:09:18+08:002021-01-27T06:09:18+08:00

    这是让 Debian 10 容器通过它们自己的静态 IP 在我们的本地网络中访问的正确设置,并且它们可以访问互联网。

    我们的Vagrantfile:

    Vagrant.configure("2") do |config|
    
      config.vm.define "main" do |main|
        main.vm.box = "bento/ubuntu-20.04"
        main.vm.box_version = "202010.24.0"
        main.vm.hostname = "lxc-host"
    
        main.vm.network "public_network", auto_config: false
    
        main.vm.provision "shell",
          run: "always",
          inline: "ip address add **192.168.1.200**/24 dev eth1"
        main.vm.provision "shell",
          run: "always",
          inline: "ip link set eth1 up"
    
        main.vm.provider :virtualbox do |vb|
            vb.memory = 1024
        end
      end
    
    end
    

    请注意,我们正在设置“公共”网络,这意味着在启动 Vagrant 时,您将被要求选择要使用的接口,选择您正在使用的接口连接到本地网络。

    另请注意,我们现在只设置一个 IP,这个 (192.168.1.200) 将是我们主机的 IP。我们这里没有设置容器的 IP。

    启动主机后,在其配置中启用 IP 转发,方法是取消注释:net.ipv4.ip_forward=1in/etc/sysctl.conf并通过执行重新启动 sysctl systemctl restart systemd-sysctl。

    现在,假设您LXD在主机上正确安装和设置,您可以lxd使用以下配置进行初始化:

    config:
      core.https_address: '[::]:8443'
      core.trust_password: true
    networks: []
    storage_pools:
    - config:
        source: [path-to-storage-pools-directory]
      description: ""
      name: default
      driver: dir
    profiles:
    - name: default
      config:
      description: ""
      devices:
        root:
          path: /
          pool: default
          type: disk
    - name: test-container
      config:
        user.user-data: |
          #cloud-config
          bootcmd:
            - echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/tail
            - systemctl restart resolvconf
      description: Mail Server LXD profile
      devices:
        eth0:
          ipv4.address: 192.168.1.201
          nictype: routed
          parent: eth1
          type: nic
    cluster: null
    

    将 [path-to-storage-pools-directory]​​更改为您要存储池的目录的实际路径。

    请注意,我们没有使用 cloud-init 来设置网络,因为它会与 Debian 的网络服务发生冲突,导致无法启动。

    另请注意,我们正在使用 cloud-init 来设置名称服务器以供我们的客人使用。

    192.168.1.201 将是我们客人的 IP。此设置假定本地网络为 192.168.1.0,如果您的网络不同,请相应更改 IP。还要确保此处使用的 IP 未被网络中的其他任何东西使用。

    我们在这里使用两个配置文件,但如何组织配置取决于您。

    现在让我们运行我们的容器:

    lxc launch images:debian/10/cloud our-actual-test-container --profile default --profile test-container
    

    它应该正在运行,并且可以在本地网络中使用,但它无法访问互联网,这是棘手的部分。这是由lxd基于默认网关是 vagrant/virtualbox 网络的假设设置的路由引起的。我们需要解决这个问题。

    在主机上执行ip r时,您应该会看到路由列表 - 类似于:

    default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
    10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
    10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100 
    192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.200 
    192.168.1.201 dev vethc5cebe03 scope link
    

    问题在于默认设置,它将流量路由到 vagrant/virtualbox 网络而不是我们的实际网关。让我们删除它:

    ip route del default via 10.0.2.2
    

    让我们添加将数据包转发到我们本地网络的实际网关的规则:

    ip route add default via 192.168.1.1
    

    (假设 192.168.1.1 是我们本地网关的 IP)

    现在来自容器的流量将流向正确的网关,我们就完成了!

    • 0

相关问题

  • 谁能指出我的 802.11n 范围扩展器?

  • 我怎样才能得到一个网站的IP地址?

  • 在一个 LAN 中使用两台 DHCP 服务器

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve