네트워크 네임스페이스/lxd-bridge가 서로 통신하는 것을 방지하지만 인터넷 액세스는 유지하시겠습니까?

네트워크 네임스페이스/lxd-bridge가 서로 통신하는 것을 방지하지만 인터넷 액세스는 유지하시겠습니까?

다음 목표:

  • lxd 컨테이너가 있습니다
  • 각 컨테이너 세트에는 자체적으로 격리된 전용 네트워크가 있어야 합니다.
  • 각각은 여전히 ​​인터넷에 연결할 수 있어야 하지만(예: 적절한 업데이트 또는 컬), 프록시를 사용하지 않는 한 포트(예: 웹 서버)를 인터넷에 유출해서는 안 됩니다.

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

감사해요!

관련 정보