ネットワークネームスペース/lxd-bridgeが互いに通信するのを防ぎますが、インターネットアクセスを維持しますか?

ネットワークネームスペース/lxd-bridgeが互いに通信するのを防ぎますが、インターネットアクセスを維持しますか?

次の目標:

  • lxdコンテナがあります
  • 各コンテナセットには、独自に分離された専用ネットワークが必要です。
  • それぞれはまだインターネットに接続できる必要があります(たとえば、適切なアップデートやカールなど)、プロキシを使用しない限り、ポート(Webサーバーなど)をインターネットに漏らすべきではありません。

10.0.0.0/8などと同じサブネットへの通信を拒否しようとしましたが、LXD-dhcpまたはインターネットからIPを取得できませんでした。

現在LXDがインターネットにアクセスできるようにするには、次の手順を実行します。

sudo ufw allow in on <bridge>
sudo ufw route allow in on <bridge>

今、トラフィックを手動で制御するためにネットワークネームスペースを作成しようとしていますが、ネームスペースが各ブリッジに接続されるとクロストークが発生する可能性があり、それらを分離しようとしている始点になります。

私はbridge1からbridge2への拒否を提案する多くのソリューションに触れましたが、これはひどく拡張され、退屈なスクリプトと何百ものルールを含むスパムIPテーブルを使用して設定する必要があるネットワークが多いほど、より多くの双方向ルールを設定する必要があります。

クロストークを防ぐために何百ものルールを追加せずに上記の目標を達成する方法はありますか?一種の基本解除、選択通信はありますか?なぜなら、いくつかのネットワークが互いに通信できるようにしたいのですが、基本的にはすべて独自の名前空間/ブリッジに滞在したいからです。

次の図は、ネットワーク名前空間を使用しようとしている現在の試みを示しています。

(オレンジ色の線はオプションの通信を表示します。残りの部分に簡単な解決策があることを意味する場合は、それなしで購入できます[現在のlxdポートセキュリティを介して切り替えることができます]。)しかし、必要に応じてこれらの通信を許可するように選択すること好む。

ネットワーク図

次のコードでブートストラップされます。

#!/usr/bin/env bash

NS1="ns1"
VETH1="veth1"
VPEER1="vpeer1"

NS2="ns2"
VETH2="veth2"
VPEER2="vpeer2"

# clean up previous
ip netns del ${NS1} >/dev/null 2>&1
ip netns del ${NS2} >/dev/null 2>&1

ip link delete ${VETH1} >/dev/null 2>&1
ip link delete ${VETH2} >/dev/null 2>&1

ip link delete ${VETH1} >/dev/null 2>&1
ip link delete ${VETH2} >/dev/null 2>&1

# create namespace
ip netns add $NS1
ip netns add $NS2

# create veth link
ip link add ${VETH1} type veth peer name ${VPEER1}
ip link add ${VETH2} type veth peer name ${VPEER2}

# setup veth link
ip link set ${VETH1} up
ip link set ${VETH2} up

# add peers to ns
ip link set ${VPEER1} netns ${NS1}
ip link set ${VPEER2} netns ${NS2}

# setup loopback interface
ip netns exec ${NS1} ip link set lo up
ip netns exec ${NS2} ip link set lo up

# setup peer ns interface
ip netns exec ${NS1} ip link set ${VPEER1} up
ip netns exec ${NS2} ip link set ${VPEER2} up

# assign ip address to ns interfaces
VPEER_ADDR1="10.10.0.10"
VPEER_ADDR2="10.20.0.10"

ip netns exec ${NS1} ip addr add ${VPEER_ADDR1}/16 dev ${VPEER1}
ip netns exec ${NS2} ip addr add ${VPEER_ADDR2}/16 dev ${VPEER2}

setup_bridge() {
  BR_ADDR="$1"
  BR_DEV="$2"
  NAMESPACE="$3"
  VETH="$4"

  # delete old bridge
  ip link delete ${BR_DEV} type bridge >/dev/null 2>&1

  # setup bridge
  ip link add ${BR_DEV} type bridge
  ip link set ${BR_DEV} up

  # assign veth pairs to bridge
  ip link set ${VETH} master ${BR_DEV}

  # setup bridge ip
  ip addr add ${BR_ADDR}/16 dev ${BR_DEV}

  # add default routes for ns
  ip netns exec ${NAMESPACE} ip route add default via ${BR_ADDR}

  # enable ip forwarding
  bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

  # masquerade (internet => bridge)
  iptables -t nat -A POSTROUTING -s ${BR_ADDR}/16 ! -o ${BR_DEV} -j MASQUERADE
}

# clear out postrouting
iptables -t nat -F

BR_IP="10.10.0.1"
BR_DEV="br0"
setup_bridge $BR_IP $BR_DEV $NS1 $VETH1

BR_IP="10.20.0.1"
BR_DEV="br1"
setup_bridge $BR_IP $BR_DEV $NS2 $VETH2

ありがとうございます!

関連情報