ฉันกำลังทดลองกับ lxc/lxd ใน Vagrant แต่ฉันค่อนข้างใหม่กับมัน ฉันจัดการเพื่อสร้างคอนเทนเนอร์ที่กำลังทำงานอยู่ แต่ฉันไม่สามารถ 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.

การกำหนดค่า LXC บนโฮสต์ Vagrant ของฉัน:

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 ของฉัน:

[email protected]:~$ 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: [email protected]: <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: [email protected]: <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

มีอะไรที่ฉันพลาดไปหรือเปล่า (อาจจะมาก)

answer

มีหลายสิ่งที่จำเป็นเพื่อให้โครงการของคุณทำงาน:

  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. ปิงคอนเทนเนอร์จากโฮสต์และในทางกลับกัน

  4. ตั้งค่า NAT บนโฮสต์: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE. ปิงโฮสต์ภายนอกบางส่วนจากคอนเทนเนอร์ ตัวนับของกฎนี้ในiptables-save -cไม่ควรเป็นศูนย์

  5. ถามคำถามถ้าคุณติดอยู่

นี่คือการตั้งค่าที่ถูกต้องเพื่อให้คอนเทนเนอร์ 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ใน/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 ของเกตเวย์ในพื้นที่ของเรา)

ตอนนี้ทราฟฟิกจากคอนเทนเนอร์จะไปที่เกตเวย์ที่ถูกต้อง และเราเสร็จแล้ว!