
我正在 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
在我的 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
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
在我的 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
ip r
在我的容器中:
default via 169.254.0.1 dev eth0
169.254.0.1 dev eth0 scope link
有什麼我錯過的嗎(可能很多)?
答案1
要使您的計劃發揮作用,需要滿足以下幾個條件:
檢查主機介面上的轉送:
ip -4 netconf show dev vetha8400046
和ip -4 netconf show dev eth0
。您應該在輸出中看到已啟用的轉送。否則使用命令啟用它sysctl -w net.ipv4.conf.<iface>.forwarding=1
。將相應的字串新增至/etc/sysctl.conf
文件中以使其持久化。檢查主機上的路由:
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
.從主機 ping 容器,反之亦然。
在主機上設定 NAT:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
。從容器 Ping 一些外部主機。此規則中的計數器iptables-save -c
應該是非零的。如果你卡住了就問這個問題。
答案2
這是讓 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,該 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
改變[儲存池目錄路徑]進入要儲存池的目錄的實際路徑。
請注意,我們沒有使用 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)
現在來自容器的流量將進入正確的網關,我們就完成了!