Linux에서 127.0.0.0/8 dst 주소를 사용하지만 외부 인터페이스에서 오는 사용자 공간에서 UDP 패킷을 수신할 수 있는지 알고 싶습니다.
nc로 테스트해 보니 nc가 모든 주소에 바인딩되어 있지만 패킷을 수신하지 못하는 것을 알 수 있습니다.
존재하다장치 1로컬 라우팅 테이블을 조작하여 이 패킷을 필요한 인터페이스로 라우팅한 다음 테스트 패킷을 보냅니다.
장치 1:
frr:~# ip route show table local
...
127.1.1.1 nhid 17 encap mpls 16 via 10.10.10.5 dev eth5
...
frr:~# echo "foo" | nc -w1 -u -v -s 3.3.3.3 127.1.1.1 3503
장치 2:
frr:~# nc -l -u -p 3503
다음 패킷은 장치 2 인터페이스의 Wireshark에서 생성되고 캡처됩니다.
나는 그 기초를 안다.RFC 1812이런 일은 절대 있어서는 안 됩니다. 반면에 이것은 유효한 사용 사례입니다.RFC4379. 여기서 트릭은 내가 보내는 패킷이 실제로 IP 라우팅이 아니라 MPLS 전환되고 마지막 홉에서 PHP(두 번째 홉 팝업)로 인해 MPLS 레이블이 손실되고 127.0.0.0/을 사용한다는 것입니다. 목표는 8개 주소입니다. dst는 레이블 스택이 소진되거나 유효한 다음 홉이 없을 때 라우터가 IP 주소를 기반으로 전달하지 않고 대신 패킷을 처리하도록 보장하는 것입니다. 이를 MPLS OAM 또는 LSP Ping이라고 합니다.
답변1
기본적으로Linux 커널은 이러한 소스 또는 대상이 있는 패킷에 대해 경로 확인을 수행할 때 RFC 1812를 적용합니다. 다음은 몇 가지 예입니다. IPv4:1 2 삼 4 5, ARP:6. 모두 비슷해 보입니다.
if (ipv4_is_loopback(saddr) && !IN_DEV_ROUTE_LOCALNET(in_dev)) return -EINVAL;
주소의 소스 또는 대상이 127.0.0.0/8 내에 있고 이것이 호스트 내에서 발생하지 않는 경우, 즉 루프백 인터페이스를 통해 패킷은 삭제됩니다... 전용되지 않는 한시스템 제어스위치route_localnet
(위의 매크로로 확인됨)이 활성화되고, 이 경우 주소는 일반 라우팅 가능 주소로 처리됩니다.
route_localnet
- 불리언 값라우팅 시 루프백 주소를 화성 소스 또는 목적지로 취급하지 마십시오. 이를 통해 127/8을 로컬 라우팅 목적으로 사용할 수 있습니다.
기본값은 거짓
따라서 인터페이스가 라우팅 스택에 의해 삭제되지 않고 이러한 트래픽을 수락하거나 내보내려면 해당 인터페이스에서 전환을 활성화해야 합니다. 인터페이스의 경우 eth5
다음을 사용하여 수행할 수 있습니다.
sysctl -w net.ipv4.conf.eth5.route_localnet=1
캡슐화가 수행되는 방법과 전체 설정에 따라 다른 인터페이스가 포함될 수 있습니다. 의심스러운 경우 all
먼저 사용하는 대신 해당 인터페이스를 사용하십시오.eth5
다음은 네트워크의 이러한 패킷에 대해 SU에서 답변한 질문입니다.
127.0.0.1/8의 주소로 향하는 패킷을 Ubuntu의 네트워크로 보냅니다.
팁: 비활성화도 가능rp_filter
작동이 시작될 때까지 모든 곳( all
및 포함)에서 디버깅할 때. default
이것은 일부로 이어지는 것입니다 RTNETLINK answers: Invalid argument
.모두양방향 라우팅이 올바르게 구성되었습니다.
이 RFC 4379 사용 사례 외에도 더 일반적인 시나리오는 서비스를 루프백 주소에만 바인딩하는 애플리케이션을 저렴하게 극복하기 위해 대상 NAT를 달성하여 일반 주소를 루프백 주소로 변경하는 것입니다. 단순화된 예:
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
라우팅 스택 자체가 패킷을 보기 때문에 스위칭이 활성화된 경우에만 작동합니다.루프백 중이 아님내부적으로 루프백 주소(수신 대상, 응답 소스)가 있습니다. 그러한 패킷은 실제로 회선에 나타나지 않지만(NAT 발생) 라우팅 스택은 이를 알지 못하므로 검사를 무시해야 합니다.
답변2
lo0
생성되면 넷마스크가 /8인 127.0.0.1이 할당됩니다. 이는 커널에 의해 수행됩니다(참고자료 참조 net/ipv4/devinet.c
). 따라서 127.0.0.0/8 공간의 일부를 재사용하려면 초기화 후 IP 마스크를 다시 할당해야 합니다. 따라서 이더넷을 127.1.1.0/24로 설정하기 전에 네트워크를 127.0.0.0/24로 설정해야 합니다 lo0
.
127.0.0.0/8이 켜져 있을 것으로 예상하는 프로세스가 많이 있습니다 lo0
. 따라서 네트워크를 lo0
/24로 설정하면 작동할 수 있지만 다른 프로세스가 중단될 수 있습니다. 시스템이 없는 배포판을 사용할 수도 있습니다.
127.0.0.0/8의 적어도 일부를 회수하기 위한 논의가 진행 중입니다. 예시 보기IETF 초안.
표준 라우터를 통과할 수 없습니다. 또한 이를 사용자 정의해야 합니다.