在“路由”模式下設置的 LXC 容器中沒有網路連接
我在 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
有什麼我錯過的嗎(可能很多)?
這是讓 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=1
in/etc/sysctl.conf
並通過執行重新啟動 sysctlsystemctl 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)
現在來自容器的流量將流向正確的網關,我們就完成了!
要使您的計劃有效,需要做幾件事:
- 檢查主機介面上的轉發:
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
應為非零。- 如果你卡住了,就問這個問題。