Networking

在“路由”模式下設置的 LXC 容器中沒有網路連接

  • January 26, 2021

我在 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=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)

現在來自容器的流量將流向正確的網關,我們就完成了!

要使您的計劃有效,需要做幾件事:

  1. 檢查主機介面上的轉發:ip -4 netconf show dev vetha8400046ip -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. 如果你卡住了,就問這個問題。

引用自:https://serverfault.com/questions/1047365