web-dev-qa-db-ja.com

lxdコンテナーをLANにアクセスできるようにする方法

Virtualboxを使用してVMを起動する場合、ネットワークアダプターの種類として「ブリッジ」を選択できます。これにより、ゲスト/仮想NICが物理LANに接続され、LANが取得されます。ルーターからのIP(DHCP経由)。

これと同じ機能を実現したいのですが、Virtualboxを使用する代わりに、lxc/lxdコンテナーを使用したいと思います。

どうすればこれを達成できますか?

編集1

私はUbuntuを実行していますが、次のガイドに従ってみました。

https://insights.ubuntu.com/2015/11/10/converting-eth0-to-br0-and-getting-all-your-lxc-or-lxd-onto-your-lan/ =

...しかし、それは役に立ちません。元のホストインターフェイスには後でIPが必要ですか?手動ブリッジングを試してみるとそうはならないからです。

編集2

それが役立つ場合、私のlxd/lxcホストは、Ubuntuを実行するVirtualbox仮想マシンであり、物理イーサネットNICへのブリッジネットワークでセットアップされています。

編集3

Tcpdumpを使用して、ブリッジインターフェース、物理/ホストインターフェース、コンテナー/仮想インターフェースのicmpトラフィックを監視する場合、コンテナー/仮想インターフェースのみがトラフィックを取得しません。他の2つは行います。

編集4

このガイドによると:

http://www.microhowto.info/troubleshooting/troubleshooting_ethernet_bridging_on_linux.html

ブリッジのセットアップに問題はありません。

「編集3」で述べたように、コンテナーインターフェイスはトラフィックを取得していません。理由を理解する必要がありますが、方法がわかりません...

ルートと関係があるような気がします。

コンテナにはルートがありませんが、ホストにはあります。

編集5

Tcpdumpを使用してarpトラフィックを監視すると、arpトラフィックが実際にコンテナー/仮想インターフェイスに到達していることが示されます。

したがって、そうではないのは、icmpトラフィックだけです。

編集6

(/ etc/network/intefaces *を介して)コンテナーに静的IPを設定すると、ホスト(Virtualboxマシン)からコンテナーにpingできるようになります。

その後、Virtualboxのネットワーク構成を変更して無差別トラフィックを許可すると、物理マシン(Virtualboxマシンのホスト)からコンテナーにpingを実行できます。しかし、ここからはまだ、コンテナ内から物理LANを超えてpingすることができません。

最後のステップで、コンテナに「デフォルト」ルートを手動で追加した場合:

route add default gw 192.168.0.1 eth0

これにより、コンテナーの内部から物理LANの外部にpingできます。

そのため、他の誰かが説明を提供できない限り(回答を投稿する前に待機します)、lxc/lxdがDHCPを処理するためにlxc/lxdがnetmasqを使用しているという事実に(ブリッジングによる)コンテナDHCPサポートの欠如が関係していると思います(およびDNS)。

3
pleasedesktop
  1. LXDホストが実際に仮想マシンである場合は、仮想マシンのネットワークアダプターが無差別モードに構成されていることを確認してください。これにより、LXDコンテナーのトラフィックが物理ネットワークから仮想ネットワークに渡されます。
  2. Lxdコンテナーに静的IPアドレスを設定します。これは、(物理ゲートウェイからの)DHCPが機能していないように見えるためです。

6回目の編集で、コンテナーにデフォルトルートを手動で追加する必要があると述べましたが、これは正しくありません。 /etc/network/interfacesファイルでゲートウェイのLAN IPアドレスを指定するのを忘れたため、これを行う必要がありました。したがって、それはLXDの問題ではありません。指定することを忘れないでください。

2
pleasedesktop

ホストOSインターフェイスが1つのレッグとなるブリッジインターフェイスを作成し、lxcコンテナーをこのブリッジに接続する必要があります。これにより、適切なブリッジ接続が得られます。

コンテナ構成の一部は次のようになります。

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0

OSブリッジ構成は実際にはディストリビューション固有ですが。

1
drookie

基本的に必要なのは、トラフィックをネットワークの残りの部分に転送できるデフォルトゲートウェイを使用するコンテナと、そのシステムに転送できるルーターの静的ルートです。これはlxdホスト(Linuxでは ip転送 を使用)、またはルーティングを処理するための専用コンテナ(ファイアウォールを実行して、アクセスできるコンテナのIP /ポートを制限する)を使用できます。

デフォルトのlxdbr0ブリッジを使用していて、コンテナのゲートウェイを変更する場合は、 raw.dnsmasq 設定を使用できます。これは通常、ブリッジの構成時にlxdホストに使用したIPに設定されますが、dhcp-option=3を使用して変更できます。

lxc network show lxdbr0
config:
  ipv4.address: 192.168.4.1/24
  ipv6.address: none
  raw.dnsmasq: dhcp-option=3,192.168.4.2
description: ""
name: lxdbr0
type: bridge
used_by:
- /1.0/containers/ubuntu-test
managed: true

次にコンテナを再起動すると、ip route showを使用して新しいゲートウェイを確認できます。

コンテナが目的のデフォルトゲートウェイを使用するように設定されたら、IPパケットを転送するようにシステムが設定されていることを確認してください。この時点で、コンテナーはそのホスト上の他のIPにpingできるはずですが、ネットワーク上の他のIPには到達できません。これは、ネットワークの残りの部分には、コンテナサブネットに送信されるパケットを返す方法に関するルーティング情報がないためです。

これがルーターの背後にあるホームネットワークである場合は、ホームルーターに静的ルートを追加して、これらのパケットの送信先を指定できます。 lxdホストが192.168.0.2の静的IPを使用していて、コンテナーが192.168.4.0/24のサブネットを使用している場合、そのサブネットを静的ルートとして追加し、ホスト.2ホストIPをゲートウェイとして使用します。これにより、lxdホストを2つのネットワーク間のゲートウェイとして使用して、コンテナとローカルネットワークの間でパケットをルーティングできるようになります。

0
Greg Bray