IPv6 전달이 네트워크 네임스페이스에서 작동하지 않습니다.

IPv6 전달이 네트워크 네임스페이스에서 작동하지 않습니다.

다음과 같이 연결된 3개의 Linux 가상 머신이 있습니다.

 /       server1         \
| ens19 2001:1::2         |
 \                       /
            |  
 /                       \
| ens19 2001:1::1         |
|        server2          |
| ens20 2001:2::1         |
 \                       /
            |
 /                       \
| ens19 2001:2::2        |
 \       server3         / 

server1에서 다음 명령을 실행합니다.

ip link set dev ens19 up
ip -6 address add 2001:1::2/96 dev ens19
ip -6 route add default via 2001:1::1

그런 다음 server3에서 다음을 수행합니다.

ip link set dev ens19 up
ip -6 address add 2001:2::2/96 dev ens19
ip -6 route add default via 2001:2::1

그런 다음 server2에서 다음을 수행합니다.

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
ip link set dev ens19 up
ip link set dev ens20 up
ip -6 address add 2001:1::1/96 dev ens19
ip -6 address add 2001:2::1/96 dev ens20

server1에서 server3을 ping하려고 하면 작동합니다.

root@server1:~# ping6 2001:2::2

하지만 server2의 인터페이스를 네트워크 네임스페이스로 이동하면 다음과 같습니다.

ip netns add net1
ip link set dev ens19 netns net1
ip link set dev ens20 netns net1
ip netns exec net1 ip link set dev ens19 up
ip netns exec net1 ip link set dev ens20 up
ip netns exec net1 ip -6 address add 2001:1::1/96 dev ens19
ip netns exec net1 ip -6 address add 2001:2::1/96 dev ens20

server1에서 server3으로의 ping이 더 이상 작동하지 않습니다. 패킷이 더 이상 전달되지 않습니다.

왜? (참고: IPv4의 프로세스는 동일합니다)

답변1

처음에 완료되었지만 완료되지 않은 두 단계가 있습니다.다시새 네트워크 네임스페이스에서:

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

이 기본 동작을 변경할 수 있는 비교적 새로운 네트워크 스위치에 설명된 대로 IPv4와 IPv6 간의 동작은 다릅니다.devconf_inherit_init_net:

[...]
기본적으로 우리는현재 동작:IPv4의 경우 init_net의 모든 현재 설정을 상속합니다.IPv6의 경우 모든 설정을 기본값으로 재설정합니다.

따라서 새 네트워크 네임스페이스에서는 다음과 같습니다.

  • IPv4 전달은 원래 네트워크 네임스페이스에서 상속됩니다. 초기 네트워크 네임스페이스에서만 실행 중이었으므로 echo 1 > /proc/sys/net/ipv4/ip_forward새 네트워크 네임스페이스도 IPv4 라우터로 설정됩니다.

    따라서 IPv4에서 작동합니다.

  • IPv6 재설정호스트 기본값라우터가 초기 네트워크 네임스페이스에서 수행하는 작업이 아닌(예:앞으로새로운 네트워크 네임스페이스를 생성하세요 sysctl -w net.core.devconf_inherit_init_net=1:)

새 네트워크 네임스페이스에서 실행할 누락된 단계를 추가하기만 하면 됩니다( /proc/sys/net/네트워크 네임스페이스를 인식해야 함). stdout 리디렉션 사용은 일부 체조 없이는 제대로 작동하지 않으므로 전용 명령을 사용하는 것이 좋습니다: sysctl.

ip netns exec net1 sysctl -w net.ipv6.conf.all.forwarding=1

관련 정보