
私は、Ubuntu 18.04.2 でデフォルトのブリッジ インターフェイス lxdbr0 を使用して、かなり標準的な LXD セットアップ (バージョン 3.0.3) を実行しています。
一方、私のホスト マシンのネットワークは、あまり規則的ではありません。2 つのブリッジ (br0 と br1) があり、2 つのボンドを介して 4 つのインターフェイス (ボンドあたり 2 つのインターフェイス、ブリッジあたり 1 つのボンド) に接続されています。
通常のルーティングを適切に動作させるのが困難だったため、ブリッジごとに別々のルーティング テーブルを使用しています。リクエストと応答が入力と同じ出力パスを使用するようにする必要がありました。
問題は、br0 および br1 と同じサブネットにあるホストを除いて、すべてに、どこでも ping できる (ホストは IP マスカレードを実行) ことです。フォワード プロキシは br1 と同じサブネットにあるため、問題が発生します。ホストのデフォルト ルートも br1 にあります。
ホスト マシンのルールとルートは次のとおりです。
user@host:~$ ip route show
default via 10.10.50.254 dev br1 proto static
10.146.233.0/24 dev lxdbr0 proto kernel scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto kernel scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto kernel scope link src 10.10.50.1
user@host:~$ ip route show table 99
default via 10.10.99.254 dev br0 proto static
user@host:~$ ip rule show table 99
0: from 10.10.99.0/24 lookup 99
user@host:~$ ip route show table 50
default via 10.10.50.254 dev br1 proto static
user@host:~$ ip rule show table 50
0: from 10.10.50.0/24 lookup 50
関連するネットプラン構成は次のとおりです。
...
bridges:
br0:
addresses: [10.10.99.1/24]
interfaces: [bond1]
routes:
- to: 0.0.0.0/0
via: 10.10.99.254
table: 99
routing-policy:
- from: 10.10.99.0/24
table: 99
parameters:
stp: true
forward-delay: 0
br1:
addresses: [10.10.50.1/24]
gateway4: 10.10.50.254
interfaces: [bond0]
routes:
- to: 0.0.0.0/0
via: 10.10.50.254
table: 50
routing-policy:
- from: 10.10.50.0/24
table: 50
parameters:
stp: true
forward-delay: 0
IPTABLESルールはLXDによってのみ生成される
user@host:~$ sudo iptables -L -nv
Chain INPUT (policy ACCEPT 828 packets, 62176 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- lxdbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 /* generated for LXD network lxdbr0 */
16 1064 ACCEPT udp -- lxdbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 /* generated for LXD network lxdbr0 */
2 658 ACCEPT udp -- lxdbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 /* generated for LXD network lxdbr0 */
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
7 588 ACCEPT all -- * lxdbr0 0.0.0.0/0 0.0.0.0/0 /* generated for LXD network lxdbr0 */
7 588 ACCEPT all -- lxdbr0 * 0.0.0.0/0 0.0.0.0/0 /* generated for LXD network lxdbr0 */
Chain OUTPUT (policy ACCEPT 540 packets, 69728 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * lxdbr0 0.0.0.0/0 0.0.0.0/0 tcp spt:53 /* generated for LXD network lxdbr0 */
16 1020 ACCEPT udp -- * lxdbr0 0.0.0.0/0 0.0.0.0/0 udp spt:53 /* generated for LXD network lxdbr0 */
2 680 ACCEPT udp -- * lxdbr0 0.0.0.0/0 0.0.0.0/0 udp spt:67 /* generated for LXD network lxdbr0 */
NATルールは
user@host:~$ sudo iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 1649 packets, 66895 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 9 packets, 899 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 10 packets, 927 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 10 packets, 927 bytes)
pkts bytes target prot opt in out source destination
3 252 MASQUERADE all -- * * 10.146.233.0/24 !10.146.233.0/24 /* generated for LXD network lxdbr0 */
br0 または br1 以外のサブネット アドレスに ping すると、br1、lxdbr0、veth インターフェイスの要求と応答を確認できます。br0 または br1 アドレスに ping すると、lxdbr0 および veth インターフェイスの要求のみが表示されます。br1 にはトラフィックがなく、前述のインターフェイスのいずれにも応答はありません。
最後に、eth、lo、bond インターフェイスを省略したインターフェイス構成を示します。
user@host:~$ ip a
7: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ee:f1:6a:84:6f:df brd ff:ff:ff:ff:ff:ff
inet 10.10.50.1/24 brd 10.10.50.255 scope global br1
valid_lft forever preferred_lft forever
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ce:13:19:08:56:ad brd ff:ff:ff:ff:ff:ff
inet 10.10.99.1/24 brd 10.10.99.255 scope global br0
valid_lft forever preferred_lft forever
22: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether fe:cb:12:0f:9f:d7 brd ff:ff:ff:ff:ff:ff
inet 10.146.233.1/24 scope global lxdbr0
valid_lft forever preferred_lft forever
inet6 fe80::70f5:3eff:feac:2ae6/64 scope link
valid_lft forever preferred_lft forever
26: vethANRBKX@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
link/ether fe:cb:12:0f:9f:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::fccb:12ff:fe0f:9fd7/64 scope link
valid_lft forever preferred_lft forever
私が望む結果は、10.10.50.254 と 10.10.99.254 で NAT を制限し、br1 サブネットワークのプロキシを介してコンテナからインターネットにアクセスすることです。ルーティング/ポリシー ルールまたは iptables で何かを行うか、lxdbr0 を別の方法で構成する必要があると思われますが、現時点では行き詰まっているようです。
答え1
直接接続されたルートを追加のルーティング テーブルに追加する必要があります。現在の構成では、ブリッジ インターフェイスのアドレスを ping すると、応答はゲートウェイ (10.10.50.254
および10.10.99.254
) を経由して外部にルーティングされます。
次のコマンドでルーティングを確認できます。
ip route get 10.146.233.2 from 10.10.50.1
ip route get 10.146.233.2 from 10.10.99.1
実際のルートを見ると、少し混乱するかもしれません。
したがって、ルーティング テーブルは次のようになります。
user@host:~$ ip route show table 50
default via 10.10.50.254 dev br1 proto static
10.146.233.0/24 dev lxdbr0 proto static scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto static scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto static scope link src 10.10.50.1
user@host:~$ ip route show table 99
default via 10.10.99.254 dev br0 proto static
10.146.233.0/24 dev lxdbr0 proto static scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto static scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto static scope link src 10.10.50.1