eth0을 통해 라우터에 연결되고 eth1을 통해 내 컴퓨터에 Raspberry Pi가 연결되어 있습니다.
저는 systemd-networkd를 사용하여 내 컴퓨터에 IPv4를 스푸핑하는데 아주 잘 작동합니다. 어떤 이유로 인해 이제 두 장치 모두에서 유효한 글로벌 IPv6 주소를 사용해야 합니다. 내 Pi는 정적으로 유효한 글로벌 IPv6 주소로 구성되었으며 Pi에서 IPv6 주소를 내 컴퓨터에 배포하는 radvd를 실행하고 있습니다(나중에 Wi-Fi에서도 동일한 작업을 수행하기를 원합니다).
몇 가지 단서를 따라가며 지난 며칠 동안 이 작업을 수행하려고 노력했습니다(가장 중요한 것은IPv6는 공용을 서브넷으로 라우팅합니다.) 나는 나를 이렇게 만든 것을 발견했습니다.
- 로컬 IPv6 주소(fe80)를 통해 두 장치를 모두 ping할 수 있습니다.
- My Pi는 IPv6를 통해 외부 세계에 연결할 수 있습니다.
- 내 컴퓨터는 IPv6를 통해 인터넷에 액세스하는 것은 물론이고 내 Pi를 포함한 어떤 글로벌 주소에도 ping을 수행할 수 없습니다.
- Pi에서 컴퓨터의 전역 IPv6 주소를 ping할 수 없습니다. 요청은 통과하지만 무시됩니다(tcpdump -i eno1이 ping을 확인함).
- 내 컴퓨터의 모든 핑은 내 Pi(tcpdump -i eth0)로 라우팅되어 이를 글로벌 인터넷으로 전달합니다. 또한 응답을 받지만 이웃 요청 요청에 대해서만 무시하며(tcpdump -i eth1).
- ndppd를 사용해 보았지만 이에 대해 더 자세히 알아보기 전에 Pi와 컴퓨터가 서로 ping을 수행할 수 있는지 확인해야 할 것 같습니다.
그래서 내 생각엔 요청을 수락하기 위해 라우팅 테이블에 뭔가를 해야 할 것 같은데, 어떻게 해야 할지 모르겠습니다.
관련 구성 및 로그 파일은 다음과 같습니다.
컴퓨터:
ip -6 route show:
::1 dev lo proto kernel metric 256 pref medium
fe80::/64 dev eno1 proto kernel metric 100 pref medium
default via fe80:...:b8 dev eno1 proto ra metric 20100 pref medium
tcpdump (filtered):
time IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) ArchPC > ff02::1:ff00:2: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has ***.****.de
source link-address option (1), length 8 (1): 1c:1b:0d:9b:bc:ba
0x0000: 1c1b 0d9b bcba
time IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) _gateway > ArchPC: [icmp6 sum ok] ICMP6, neighbor advertisement, length 24, tgt is _gateway, Flags [router, solicited]
time IP6 (flowlabel 0xa91bf, hlim 64, next-header ICMPv6 (58) payload length: 64) ArchPC > ***.****.de: [icmp6 sum ok] ICMP6, echo request, seq 1
time IP6 (flowlabel 0xfa9b8, hlim 255, next-header ICMPv6 (58) payload length: 88) _gateway > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 88
hop limit 64, Flags [none], pref medium, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
prefix info option (3), length 32 (4): 2001:...::/64, Flags [onlink, auto, router], valid time 86400s, pref. time 14400s
0x0000: 40e0 0001 5180 0000 3840 0000 0000 2001
0x0010: 07c7 20f4 001d 0000 0000 0000 0000
rdnss option (25), length 24 (3): lifetime 600s, addr: ***.****.de
0x0000: 0000 0000 0258 2001 07c7 20f4 001d 0000
0x0010: 0000 0000 0002
mtu option (5), length 8 (1): 1280
0x0000: 0000 0000 0500
source link-address option (1), length 8 (1): 00:e0:4c:82:00:b8
0x0000: 00e0 4c82 00b8
time IP6 (hlim 1, next-header Options (0) payload length: 56) ArchPC > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 2 group record(s) [gaddr ff02:...:5bbf to_ex { }] [gaddr ff02:...:d60f to_ex { }]
PI:
ip -6 route show (I added the second one, global ip of computer to local):
::1 dev lo proto kernel metric 256 pref medium
2001:...:5bbf via fe80:...d60f dev eth1 proto ra metric 256 pref medium
2001:...::/64 dev eth0 proto ra metric 256 pref medium
fe80:...:d60f/64 dev eth1 proto kernel metric 1024 pref medium
fe80::/64 dev eth1 proto kernel metric 256 pref medium
default via 2001:...:1 dev eth0 proto ra metric 1024 pref medium
Radvd.conf:
interface eth1{
AdvSendAdvert on;
RDNSS IPv6 of Pi {};
prefix 2001:...::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
AdvSourceLLAddress on;
AdvLinkMTU 1280;
};
추가 로그가 필요한 경우 명시해 주세요. pi에서 tcpdump는 거의 동일해 보이기 때문에 생략했지만 필요한 경우 추가할 수 있습니다.
아이디어가 있으시면 알려주시기 바랍니다.
답변1
그래서 잘못된 경로에 대한 나의 가설은 옳은 것으로 판명되었습니다. 내 취향에 맞게 많은 수동 조정이 필요했지만 systemd-networkd 및 radvd만 사용하여 문제를 해결한 방법은 다음과 같습니다.
pi의 구성에 다음을 추가합니다.
pi가 컴퓨터 IP에 대한 이웃의 요청에 응답하도록 합니다.
eth0.network (Connected to the internet)
IPv6ProxyNDP=true
IPv6ProxyNDPAddress=2001:...:5bbf
Pi가 컴퓨터의 모든 트래픽을 컴퓨터의 로컬 ipv6 주소로 전달하도록 합니다.
eth1.network (connected to pc)
[Route]
Destination=2001:...:5bbf
Gateway=fe80:...:d60f
IP를 획득한 장치가 Pi의 로컬 IP를 통해 Pi의 글로벌 IP의 모든 트래픽을 전달하도록 만듭니다.
radvd.conf
interface eth1
{
AdvSendAdvert on;
prefix 2001:...::/64
{
AdvOnLink on;
AdvAutonomous on;
};
route 2001:...::/64{};
};
ipv6 주소가 변경되지 않는 한 이것은 나에게 효과적입니다. 수동 구성 파일 없이 이러한 주소를 변경하는 솔루션을 찾지 못했지만 적어도 이와 비슷합니다.