次の目標:
- 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
ありがとうございます!