실제 라우터에 적용하기 전에 nftables 방화벽 규칙을 테스트하기 위해 놀이터를 설정하고 싶습니다. Docker 컨테이너는 훌륭한 경량 도구인 것 같습니다. 이 테스트의 전제 조건은 컨테이너 중 하나가 다른 컨테이너의 라우터 역할을 해야 한다는 것입니다. Linux 상자가 베어메탈(또는 완전히 가상화된) 경우 라우터로 사용하는 데 문제가 없습니다. 하지만 도커 컨테이너인 경우에는 작동하지 않습니다.
그래서 저는 2개의 네트워크를 만들었 tmp_21
습니다 tmp_22
.
docker network create --driver=bridge --subnet=172.21.0.0/16 --gateway=172.21.0.1 tmp_21
docker network create --driver=bridge --subnet=172.22.0.0/16 --gateway=172.22.0.1 tmp_22
위에서 언급한 두 네트워크에 연결되도록 라우터 상자를 만듭니다.
docker run \
--name tmp_router -h tmp_router \
--cap-add=NET_ADMIN --cap-add=SYS_MODULE \
--sysctl net.ipv4.conf.all.forwarding=1 --sysctl net.ipv4.tcp_timestamps=0 \
--net tmp_21 --ip 172.21.0.20 \
-it debian /bin/bash
# On the host machine:
docker network connect tmp_22 tmp_router --ip 172.22.0.20
각 네트워크마다 하나씩 2개의 테스트 상자를 만듭니다.
docker run \
--name tmp_box21 -h tmp_box21 \
--cap-add=NET_ADMIN \
--net tmp_21 --ip 172.21.0.21 \
-it debian /bin/bash
docker run \
--name tmp_box22 -h tmp_box22 \
--cap-add=NET_ADMIN \
--net tmp_22 --ip 172.22.0.22 \
-it debian /bin/bash
이 시점부터 두 상자 모두 각각 172.21.0.20 및 172.22.0.20에서 라우터를 ping할 수 있습니다.
tmp_box21
이제 ping을 원합니다 tmp_box22
. 나는 여기에 tmp_box21
다음 경로를 추가했습니다 .
ip route add 172.22.0.0/16 via 172.21.0.20
이 시점부터 tmp_box21
172.21.0.20에서 라우터를 ping할 수 있을 뿐만 아니라 172.22.0.20에서 라우터를 ping할 수도 있습니다.
그러나 이로 인해 172.22.0.22에 대한 ping이 가능해지지는 않습니다 tmp_box22
!
왜?
nft list ruleset
라우터의 출력은 비어 있습니다.
답변1
172.21.0.0/16부터 172.22.0.22까지의 역방향 경로가 누락되었습니다. tmp_box22가 ping 패킷을 수신했다고 확신하지만 돌아오는 데 실패했습니다.