「ルーティング」モードで設定された LXC コンテナにネットワーク接続がありません

「ルーティング」モードで設定された LXC コンテナにネットワーク接続がありません

私は Vagrant で lxc/lxd を試していますが、まだ初心者です。実行中のコンテナを作成することはできましたが、コンテナ内部からは何も ping できません (8.8.8.8 を含む)。トップレベルの非仮想システムから IP を ping することはできますが、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

計画を機能させるには、いくつかのことが必要です。

  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. ホストからコンテナに ping を実行し、その逆も実行します。

  4. ホストに NAT を設定します: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE。コンテナから外部ホストに ping を実行します。 内のこのルールのカウンターはiptables-save -cゼロ以外である必要があります。

  5. 行き詰まったら質問してください。

答え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 を起動するときに、使用するインターフェースを選択するように求められ、ローカル ネットワークに接続するために使用しているインターフェースを選択することを意味します。

また、現時点では 1 つの IP のみを設定していることにも注意してください。この IP (192.168.1.200) がホストの IP になります。ここではコンテナの IP を設定しません。

ホストを起動した後、 のコメントを外して を実行し、 sysctl を再起動して、設定で IP 転送を有効にnet.ipv4.ip_forward=1/etc/sysctl.confます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 がネットワーク内の他のもので既に使用されていないことを確認してください。

ここでは 2 つのプロファイルを使用していますが、構成をどのように整理するかはユーザー次第です。

それではコンテナを実行してみましょう:

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 であると仮定)

これで、コンテナからのトラフィックが正しいゲートウェイに送信されるようになり、完了です。

関連情報