![네트워크 네임스페이스/lxd-bridge가 서로 통신하는 것을 방지하지만 인터넷 액세스는 유지하시겠습니까?](https://linux55.com/image/209057/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EB%84%A4%EC%9E%84%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4%2Flxd-bridge%EA%B0%80%20%EC%84%9C%EB%A1%9C%20%ED%86%B5%EC%8B%A0%ED%95%98%EB%8A%94%20%EA%B2%83%EC%9D%84%20%EB%B0%A9%EC%A7%80%ED%95%98%EC%A7%80%EB%A7%8C%20%EC%9D%B8%ED%84%B0%EB%84%B7%20%EC%95%A1%EC%84%B8%EC%8A%A4%EB%8A%94%20%EC%9C%A0%EC%A7%80%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
다음 목표:
- 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
감사해요!