"라우팅" 모드로 설정된 LXC 컨테이너에 네트워크 연결이 없습니다.

"라우팅" 모드로 설정된 LXC 컨테이너에 네트워크 연결이 없습니다.

나는 Vagrant에서 lxc/lxd를 실험하고 있지만, 나는 그것에 대해 아주 새로운 것입니다. 실행 중인 컨테이너를 생성했지만 컨테이너 내부에서 아무것도(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/하지만 결국 나에게는 효과가 없었습니다. 저는 아직 리눅스 네트워킹에 대해 잘 알지 못하기 때문에 뭔가를 놓칠 수도 있습니다.

내 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

계획이 작동하려면 몇 가지 사항이 필요합니다.

  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하거나 그 반대로 ping합니다.

  4. 호스트에서 NAT를 설정합니다 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE. 컨테이너에서 일부 외부 호스트를 ping합니다. 이 규칙의 카운터는 iptables-save -c0이 아니어야 합니다.

  5. 막히면 질문하세요.

답변2

이는 자체 고정 IP를 통해 로컬 네트워크에서 Debian 10 컨테이너에 액세스하고 인터넷에 액세스할 수 있도록 하는 올바른 설정입니다.

우리의 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를 설정하지 않습니다.

호스트를 시작한 후 다음을 실행하여 sysctl의 주석 처리를 제거하고 net.ipv4.ip_forward=1구성 에서 IP 전달을 활성화합니다 ./etc/sysctl.confsystemctl 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를 사용하지 않는다는 점에 유의하십시오. 왜냐하면 데비안 네트워킹 서비스와 충돌하여 시작하지 못하게 되기 때문입니다.

또한 우리는 게스트가 사용할 네임서버를 설정하기 위해 cloud-init를 사용하고 있습니다.

192.168.1.201이 게스트의 IP가 됩니다. 이 설정에서는 로컬 네트워크가 192.168.1.0이라고 가정합니다. 네트워크가 다른 경우 그에 따라 IP를 변경하세요. 또한 여기에 사용된 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라고 가정)

이제 컨테이너의 트래픽이 올바른 게이트웨이로 이동하고 완료되었습니다!

관련 정보