Łuk*_*oda 6 networking linux-networking lxc lxd
我正在 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
Run Code Online (Sandbox Code Playgroud)
ip addr
在我的 Vagrant 主机中:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
ip r
在我的 Vagrant 主机中:
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
Run Code Online (Sandbox Code Playgroud)
ip r
在我的容器中:
default via 169.254.0.1 dev eth0
169.254.0.1 dev eth0 scope link
Run Code Online (Sandbox Code Playgroud)
有什么我错过的吗(可能很多)?
这是让 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
Run Code Online (Sandbox Code Playgroud)
请注意,我们正在设置“公共”网络,这意味着在启动 Vagrant 时,您将被要求选择要使用的接口,选择您用来连接到本地网络的接口。
另请注意,我们现在仅设置一个 IP,该 IP (192.168.1.200) 将是我们主机的 IP。我们这里不设置容器的IP。
启动我们的主机后,通过取消注释:在其配置中启用 IP 转发net.ipv4.ip_forward=1
并/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
Run Code Online (Sandbox Code Playgroud)
将[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
Run Code Online (Sandbox Code Playgroud)
它应该正在运行,并且可以在本地网络中使用,但它无法访问互联网,这是棘手的部分。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
Run Code Online (Sandbox Code Playgroud)
问题出在默认网络上,它将流量路由到 vagrant/virtualbox 网络而不是我们的实际网关。让我们删除它:
ip route del default via 10.0.2.2
Run Code Online (Sandbox Code Playgroud)
让我们添加将数据包转发到本地网络的实际网关的规则:
ip route add default via 192.168.1.1
Run Code Online (Sandbox Code Playgroud)
(假设192.168.1.1是我们本地网关的IP)
现在来自容器的流量将进入正确的网关,我们就完成了!
归档时间: |
|
查看次数: |
8667 次 |
最近记录: |