VirtualBox 환경에서 Linux를 실행하고 있습니다. 브리지를 통해 연결된 2개의 네임스페이스를 성공적으로 정의했으며 서로 통신할 수 있습니다. 다른 프로세스에서 실행 중인 QEMU 세션 문제를 해결할 수 있도록 UDP 패킷을 실제 네트워크로 보낼 수 있기를 원합니다(현재 질문의 초점은 아님).
다음은 네임스페이스 내에서 작동하는 것으로 보이는 설정 스크립트입니다.
#!/bin/bash -x
sudo ip link add br0 type bridge
sudo ip addr add 172.31.24.5/24 dev br0
sudo ip link set dev br0 up
# tie the ethernet physical port to the bridge
sudo ip link set dev enp0s3 master br0
sudo ip netns add gmi153
sudo ip netns add mock135
sudo ip link add veth-gmi type veth peer name veth-gmi-br
sudo ip link add veth-mock type veth peer name veth-mock-br
sudo ip link
sudo ip link set veth-gmi netns gmi153
sudo ip link set veth-mock netns mock135
sudo ip link set veth-gmi-br master br0
sudo ip link set veth-mock-br master br0
sudo ip -n gmi153 addr add 172.31.24.153/24 dev veth-gmi
sudo ip -n mock135 addr add 172.31.24.135/24 dev veth-mock
sudo ip -n gmi153 link set veth-gmi up
sudo ip -n mock135 link set veth-mock up
sudo ip link set veth-gmi-br up
sudo ip link set veth-mock-br up
# add the default gateway in all the network namespace.
ip netns exec gmi153 ip route add default via 172.31.24.5
sudo ip netns exec gmi153 ping 172.31.24.135
일반 네트워크에서는 다음을 볼 수 있습니다.
구성된 경우
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.31.24.5 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::1cf3:fdff:fe58:ba01 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:86:e4:57 txqueuelen 1000 (Ethernet)
RX packets 375 bytes 21413 (21.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 62 bytes 6916 (6.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::4943:c6f9:c5c1:da26 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:86:e4:57 txqueuelen 1000 (Ethernet)
RX packets 572 bytes 298973 (298.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 569 bytes 59746 (59.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 560 bytes 55475 (55.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 560 bytes 55475 (55.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth-gmi-br: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::18cc:ff:fe79:58df prefixlen 64 scopeid 0x20<link>
ether 1a:cc:00:79:58:df txqueuelen 1000 (Ethernet)
RX packets 80 bytes 7264 (7.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 91 bytes 8675 (8.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth-mock-br: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::f05c:a9ff:fe6b:df90 prefixlen 64 scopeid 0x20<link>
ether f2:5c:a9:6b:df:90 txqueuelen 1000 (Ethernet)
RX packets 35 bytes 3022 (3.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 85 bytes 8238 (8.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
하지만 네임스페이스 내에서는 다음과 같은 내용이 표시됩니다.
ip netns exec gmi153 ifconfig
veth-gmi: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.31.24.153 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::5c20:80ff:fe4c:6a63 prefixlen 64 scopeid 0x20<link>
ether 5e:20:80:4c:6a:63 txqueuelen 1000 (Ethernet)
RX packets 91 bytes 8675 (8.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 80 bytes 7264 (7.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
이렇게 하면 핑 응답이 없습니다.
ip netns exec gmi153 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
참고: 또한 설치 스크립트를 실행하기 전에 수행한 네임스페이스 접두사가 없으면 ping 응답을 받지 못합니다. 그래서 분명히 나는 내가 하고 있는 일을 정말로 이해하지 못합니다.
몇 초 후에 tcpdump에 다음이 표시됩니다.
TCP 덤프
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth-gmi-br, link-type EN10MB (Ethernet), capture size 262144 bytes
14:09:21.468289 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 9, length 64
14:09:22.492296 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 10, length 64
14:09:23.515931 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 11, length 64
14:09:24.539827 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 12, length 64
14:09:25.577254 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 13, length 64
14:09:26.587574 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 14, length 64
14:09:27.623271 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 15, length 64
14:09:28.655940 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 16, length 64
14:09:29.661224 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 17, length 64
14:09:30.683523 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 18, length 64
14:09:31.708402 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 19, length 64
14:09:32.733287 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 20, length 64
14:09:33.764490 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 21, length 64
14:09:34.784327 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 22, length 64
14:09:35.804343 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 23, length 64
14:09:36.829240 IP 172.31.24.153 > 8.8.8.8: ICMP echo request, id 2499, seq 24, length 64
14:09:40.028085 ARP, Request who-has 172.31.24.5 tell 172.31.24.153, length 28
14:09:40.028101 ARP, Reply 172.31.24.5 is-at 08:00:27:86:e4:57 (oui Unknown), length 28
내 목표는 단순히 로컬 Linux 주소 공간이나 상위 인터넷에서 네임스페이스 외부의 다른 위치와 서로 통신할 수 있는 IP 주소를 선언할 수 있는 2개의 네임스페이스를 갖는 것입니다. 감사해요
답변1
외부 네트워크에 액세스하기 위해 네트워크 네임스페이스를 얻는 데 필요한 다음 단계 중 하나 이상이 누락된 것 같습니다.
- 커널에서 IP 패킷 전달이 활성화되어 있는지 확인하려면 sysctl을 사용해야 합니다.
- 네임스페이스 인터페이스와 액세스해야 하는 다른 인터페이스 사이에서 가장/NAT를 수행하도록 방화벽을 구성해야 합니다. 즉, 컴퓨터를 라우터로 설정해야 합니다.
- 예를 들어 하위 명령을 사용하여 라우팅이 올바르게 구성되었는지 확인해야 합니다
ip route
.
질문에 배포 및 방화벽과 같은 일부 특정 정보가 부족하기 때문에 더 완전한 답변을 제공하기는 어렵지만 올바른 방향으로 나아가는 데 도움이 될 것입니다.