JavaScriptを有効にしてください

network-vethなSystemd-nspawnでNAT

 ·   ·  ☕ 2 分で読めます

手動での設定が多いものの、そこまで難しくはない。

構築する前に

ipv4 forwardingのカーネル設定をしていない方

/etc/sysctl.d/30-ipforward.conf

net.ipv4.ip_forward=1

sudo reboot

ファイアウォールを利用している方

コンテナから外への通信を許可しましょう。

iptables -A FORWARD -i ve-+ -o 物理NIC -j ACCEPT

必要に応じて永続化してください。

テンプレート

テンプレートがあるので、適宜コピーして利用すると良いかもしれません:

Host: /lib/systemd/network/80-container-ve.network
Container: /lib/systemd/network/80-container-host0.network

systemd-networkd

ホスト・コンテナ共にsystemd-networkdの使用が前提です。

systemctl enable systemd-networkd && reboot

構築

ホスト

テンプレートを利用すれば編集が必要なのはアドレスのみです。

/etc/systemd/network/80-container-ve.network

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Match]
Name=ve-*
Driver=veth

[Network]
Address=10.1.0.1/30
LinkLocalAddressing=yes
DHCPServer=yes
IPMasquerade=yes
LLDP=yes
EmitLLDP=customer-bridge

[DHCPServer]
PoolOffset=2
PoolSize=1

コンテナ

外部ネットワークへの接続が必要ない場合

DHCPに任せて設定不要で動きます。

外部ネットワークに接続する場合

手動設定が必要です。
ホストでDNSを動かしていない場合等、必要に応じて設定を変更してください。

/etc/systemd/network/80-container-host0.network

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Match]
Virtualization=container
Name=host0

[Network]
DNS=10.1.0.1
Address=10.1.0.2/30
Gateway=10.1.0.1
LinkLocalAddressing=yes
LLDP=yes
EmitLLDP=customer-bridge

sudo systemctl restart systemd-networkd

テスト

コンテナー内からping等を打って確認。

=> ホスト

ping 10.1.0.1

=> インターネット

ping 1.1.1.1

おまけ

ブリッジ

NATを構築する他に、既存のブリッジに接続させることもできます。
systemd-nspawn --network-bridge br0 ...

ポートマッピング

--network-vethが有効の場合--private-networkのオプションが利用可能です。
巷で流行りのDockerのように-p tcp:80:80のようにしてNATポートマッピングでポート開放が出来ます。

共有

hayabusa2yk
著者
hayabusa2yk
Dev/Admin of servers