현재 Linux에서 네트워크 네임스페이스를 사용하여 네트워크를 시뮬레이션하려고 합니다. 노드를 설정하고 연결했으며 한 번에 한 홉씩 서로 핑할 수 있습니다. 하지만 IP 전달을 활성화하는 데 정말 문제가 있습니다.
저는 Ubuntu Server 21.04를 사용하고 있으며 시스템의 네트워크는 systemd-networkd에 의해 제어됩니다. systemd 버전은 247.3-3ubuntu3.4입니다. net.ipv6.conf.all.forwarding
이미 net.ipv4.ip_forward
활성화되어 있습니다. 네트워크 연결을 사용하고 있으므로 구성 파일에서도 전달을 활성화해야 합니다. 내 네임스페이스 중 하나는 다음과 같습니다.
/etc/systemd/network/router1i.network:
[Match]
Name=router1i
[Network]
IPForward=yes
및 /etc/systemd/network/router1i2.network:
[Match]
Name=router1i2
[Network]
IPForward=yes
이들 ( router1i
및 router1i2
)은 veth 인터페이스이며 네임스페이스에 있는 유일한 2개의 인터페이스입니다.
네임스페이스에서 명령을 사용하면 경로에 전달이 포함되지 않기 때문에 ip -6 route get to fe80::1:0:200 iif router1i2
정답을 얻습니다 . 다른 인터페이스에서 시작된 fe80::1:0:200 from :: dev router1i2 proto kernel metric 256 iif router1i2 pref medium
유사한 명령을 사용하면 ip -6 route get to fe80::1:0:200 iif router1i
대답은 갑자기 yes 입니다 RNETLINK answers: Network is unreachable
. 전달이 활성화되지 않은 것 같습니다.
networkctl reconfigure router1i
네임스페이스 내에서 을 사용하여 네트워크 업데이트를 시도했지만 이 메시지가 Failed to reconfigure network interface router1i: No such device or address
이상합니다. 사용하면 networkctl status router1i
모든 정보가 올바르게 나열되기 때문입니다. 또한 전체 새로고침을 시도했지만 networkctl reload
아무 것도 변경되지 않았습니다.
솔직히 말해서 도저히 어찌할 수가 없습니다. 네트워크 작업에 꼭 필요한 것도 아닙니다. 어떤 아이디어나 해결 방법이라도 대단히 감사하겠습니다.
편집하다:
이제 dirkt가 제안한 대로 링크 로컬 주소를 고유 로컬 주소로 바꿨습니다. 의 출력으로 판단하면 이제 경로가 올바르게 선택되었습니다 ip -6 route get
. 하지만 여전히 다른 네트워크 인터페이스에 대해 ping을 수행할 수 없습니다. 솔직히 오류를 찾을 수 없어서 아래에 자세한 내용을 추가하겠습니다.
인터페이스 구성:
ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group`default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
6: router1i@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether be:fc:8e:30:e4:18 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fd00:0:0:1000::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::bcfc:8eff:fe30:e418/64 scope link
valid_lft forever preferred_lft forever
8: router1i2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d6:3f:e9:9a:93:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fd00:0:0:1001::1/63 scope global
valid_lft forever preferred_lft forever
inet6 fe80::d43f:e9ff:fe9a:93f3/64 scope link
valid_lft forever preferred_lft forever
IPv6 라우팅 테이블:
ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip -6 route
fd00:0:0:1000::/64 dev router1i proto kernel metric 256 pref medium
fd00:0:0:1000::/63 dev router1i2 proto kernel metric 256 pref medium
fe80::/64 dev router1i proto kernel metric 256 pref medium
fe80::/64 dev router1i2 proto kernel metric 256 pref medium
default via fd00:0:0:1001::2 dev router1i2 metric 1024 pref medium
출력 ip netconf
:
ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip netconf
inet lo forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet router1i forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet router1i2 forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet all forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet default forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 lo forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 router1i forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 router1i2 forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 all forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 default forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
이제 작동합니다:
ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip -6 route get to fd00:0:0:1001::2 iif router1i
fd00:0:0:1001::2 from :: dev router1i2 proto kernel metric 256 iif router1i pref medium
그러나 실제로 router1i에서 주소를 ping하려고 하면 다음과 같이 표시됩니다.
ubuntu@ubuntu:~$ sudo ip netns exec Router1 ping6 fd00:0:0:1001::2 -I router1i
ping6: connect: Network is unreachable
전달이 켜져 있는데 올바른 경로가 선택되었습니다. 왜 여전히 작동하지 않습니까?
편집 2:
나는 그것을 작동시켰다! 도움을 주신 모든 분들께 감사드립니다.
분명히 -I 옵션을 사용한 ping의 효과를 잘못 판단한 것 같습니다. 이것이 나를 혼란스럽게 만들었고, 나의 미숙함은 도움이 되지 않았습니다... 마침내 마지막으로 누락된 부분은 외부 네임스페이스 중 하나의 잘못된 경로로 인해 핑에 응답할 수 없다는 것을 알아냈습니다. 이 방법을 좀 더 일찍 찾았어야 했는데, 포워딩 문제에 너무 집착하네요...
어쨌든 다시 한 번 감사드리며, 좋은 하루 보내세요!
답변1
fe80::/10
링크 로컬 주소입니다. 나는 이것이 라우팅 가능하다고 생각하지 않습니다(비록 라우팅 가능하게 만드는 몇 가지 트릭이 있을 수 있지만 시도한 적이 없습니다).
IPv6 라우팅을 시도하려면 대신 이를 사용하지 마십시오.고유한 로컬 주소fc00::/7
인터페이스의 링크 로컬 주소(일반적으로 자동 구성) 외에도 es(ULA, 범위)가 있습니다.
그리고 디버깅에도 사용할 수 있습니다 ip -6 route get from ... to ...
.
ip route add ...
플레이하는 동안 평소와 같이 경로를 설정하세요.
경로를 설정하는 것을 잊지 마세요모두"전달" 노드뿐만 아니라 패킷 경로(또는 귀하의 경우 네임스페이스)를 따르는 노드입니다(이것을 잊어버리는 것은 일반적인 초보자 실수입니다).
"한 인터페이스에서 다른 인터페이스로 이동"(사용한다고 가정)하여 -I
인생을 어렵게 만들지 않으면 이 작업을 수행하는 것이 더 쉬울 것입니다 .
세 개의 네임스페이스 A, B, C를 설정합니다. A와 B를 veth 쌍으로 연결하고, B와 C를 veth 쌍으로 연결합니다. 4개의 네트워크 인터페이스 모두에 ULA 주소(올바른 서브넷, A/B 하나의 서브넷, B/C 하나의 서브넷 포함)를 배치합니다. A와 C에 기본 경로를 설정합니다(해당 B 인터페이스를 통해). B에서 전달을 활성화합니다. 그런 다음 A에서 B의 근거리 인터페이스 주소, B의 "원거리" 인터페이스 주소, C 순으로 ping을 시도합니다. 그냥 일반을 사용하십시오 ping <addr>
. 작동이 중지되는 위치를 확인하십시오(즉시 작동하지 않는 경우).
디버깅하려면 tcpdump
4개 인터페이스 모두의 4개 터미널에서 실행하세요. 네트워크 네임스페이스에서 하나 이상을 실행하면 xterm
디버깅과 설정이 더 쉬워집니다.
그래도 작동하지 않으면 작동하는 핑과 작동하지 않는 핑에 대한 tcpdump 출력을 포함하여 위 설정에서 수행한 모든 명령을 포함하여 새로운 질문을 하십시오. (Q&A별 원격 디버깅은 PITA입니다.)