소스 라우팅(LSRR) 사용 - 어떤 아이디어가 있습니까?

소스 라우팅(LSRR) 사용 - 어떤 아이디어가 있습니까?

내가 하고 싶은 일은 개념적으로는 매우 간단하지만 이를 수행하는 방법에 대한 정보나 도움말을 찾을 수 없습니다.

기본적으로 소스 라우팅(LSRR)을 사용하도록 네트워크를 구성하고 싶습니다. 이제 나는 이것에 "보안 문제"가 있다는 것을 알고 있으므로 일반적으로 공용 인터넷에서 차단되므로 튜토리얼이 막다른 골목에 도달합니다. 그러나 저는 완전한 개인 네트워크를 갖고 있으며 몇 가지 엔지니어링상의 이유로 이 작업을 수행해야 합니다. [기본적으로 몇 가지 실험을 하고 있으며 hop-by-hop 라우팅 프로토콜을 "시뮬레이션"하고 싶습니다.]

그래서 (IP 주소가 있는 시스템) A에서 (IP 주소가 있는 시스템) X로 트래픽을 보내고 싶습니다. 하지만 트래픽이 중간 노드 B, C, D를 거쳐 특정 경로(예: A -> B -> C -> D -> X)를 따르기를 원합니다. 이는 개인 IP 주소이며 올바른 ip_forwarding 등을 구성했습니다.

Ping을 사용하면 실제로 LSRR을 사용할 수 있으므로 A에서 다음으로 핑을 보낼 수 있습니다.

따라서 문제는 느슨한 소스 라우팅을 사용하여 이 경로를 따라 모든 일반 트래픽을 리디렉션하기 위해 iptables 또는 tun 인터페이스(또는 기타 - VPN?) 등의 일부 기능을 어떻게 사용합니까? 기본적으로 A에서 X로 트래픽을 보내려고 할 때 해당 IP 패킷을 가로채서 LSRR을 추가하여 지정된 중간 지점을 통해 전달되도록 A에 무언가를 구현하고 싶습니다.

누구든지 나를 도울 수 있다면 나는 이 작업을 수행하는 방법을 알 수 없는 것 같아서 매우 감사할 것입니다.

정말 고마워요, 트리포니님

답변1

가상 네트워크에서 ssh/scp 연결에 LSRR(Loose Source and Record Routing) 옵션을 사용하기 시작했습니다. 이는 RFC 791(원본 IP 프로토콜 사양)에 문서화되어 있습니다. 내가 찾은 것은 다음과 같습니다.

나는 패킷 헤더를 수정하기 위해 Linux eBPF를 사용하는 방법을 조사했으며( tc일치하는 패킷을 수정하기 위해 eBPF 프로그램을 첨부하기 위해) 여전히 이것이 작동할 것이라고 생각했지만 더 깊이 파고들면서 다른 문제가 분명해졌습니다.

먼저, 우리는 check_ip_options다음 설명과 함께 주식 프로그램의 루틴을 설명했습니다.openssh

/*
 * If IP options are supported, make sure there are none (log and
 * return an error if any are found).  Basically we are worried about
 * source routing; it can be used to pretend you are somebody
 * (ip-address) you are not. That itself may be "almost acceptable"
 * under certain circumstances, but rhosts authentication is useless
 * if source routing is accepted. Notice also that if we just dropped
 * source routing here, the other side could use IP spoofing to do
 * rest of the interaction and could still bypass security.  So we
 * exit here if we detect any IP options.
 */

따라서 패킷에 LSRR 옵션을 설정하더라도 opensshssh 또는 scp와 작동하려면 수정된 서버가 필요합니다. 이 변경은 어렵지 않은 것 같습니다. check_ip_options코드를 주석 처리하면 됩니다. 어쨌든 서버를 수정해야 하므로 클라이언트를 openssh수정하여 opensshLSRR 옵션을 설정하는 것이 eBPF를 사용하는 것보다 쉬울 것 같아서 결정했습니다. 내가 지금까지 가지고 있는 것:

--- sshconnect.c.dist   2022-08-20 22:13:41.119013377 -0400
+++ sshconnect.c    2022-08-20 22:14:13.180812775 -0400
@@ -380,6 +380,10 @@
    }
    fcntl(sock, F_SETFD, FD_CLOEXEC);
 
+   char lssr_option[] = {131, 0, 4, 192, 168, 4, 171};
+   lssr_option[1] = sizeof(lssr_option);
+   setsockopt(sock, IPPROTO_IP, IP_OPTIONS, lssr_option, sizeof(lssr_option));
+
    /* Bind the socket to an alternative local IP address */
    if (options.bind_address == NULL && options.bind_interface == NULL)
        return sock;

이 코드는 작동합니다. 옵션 131은 LSRR이고 192.168.4.171은 첫 번째 홉 주소입니다. 그건 그렇고, Linux 네트워킹 코드는 이 옵션을 패킷에 직접 복사하지 않고 주소를 패킷의 대상 주소로 바꾸는 것 같습니다. 그래서 RFC 791을 읽어보면 에 최종 목적지를 지정하고 싶을 수도 있겠지만 lssr_option거기에 중간 주소를 넣고 최종 목적지를 IP 목적지 주소로 사용해야 합니다.

분명히 나는 ​​내 대상 주소가 C 코드에 내장되는 것을 원하지 않으며 반환 값에서 오류를 확인해야 하지만 작동합니다. 나는 그것을 테스트했다. 다음과 같이 소스 라우팅을 허용하도록 경로의 모든 Linux 시스템을 구성해야 합니다.

echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/accept_source_route

또한 에 대한 호출을 주석 처리하여 openssh 서버를 수정했습니다 check_ip_options.

패킷은 통과하지만 Wireshark와 tcpdump 모두 잘못된 TCP 체크섬을 보고하며 TCP 체크섬 오프로딩을 끌 수 없습니다.

baccala@samsung:~/src/openssh-8.2p1$ sudo ethtool -K wlp1s0 tx off
Cannot change tx-checksumming
Could not change any device features

그렇다면 WiFi 카드가 TCP 체크섬을 계산하는데 LSRR 옵션이 있으면 올바르게 수행되지 않을 수 있습니까? 이는 TCP 체크섬에 대상 주소가 포함되어 있고, LSRR이 있는 경우 최종 대상 주소는 대상 주소 필드(첫 번째 홉만 포함)가 아닌 LSRR 옵션에 있기 때문에 믿기 쉽습니다.

나는 "충분하다"고 말하고 다른 해결책을 모색했습니다.

SSH 키를 허용하도록 가상 Linux 라우터를 구성한 다음 openssh의 "점프 호스트" 옵션을 사용하여 다음과 같이 네트워크를 통해 터널링했습니다.

ssh -J [email protected],[email protected] [email protected]

나는 "너도 하지 말아야 해"라고 말하고 싶은 것이 아니다.생각하다이렇게 하세요" 경향이 있지만 내 경험에 따르면 호스트를 ssh 점프하는 것이 내 문제에 대한 더 쉬운 해결책이라는 것입니다.

답변2

대답은 매우 간단합니다. 소스 라우팅은 혼란을 야기하는 수많은 흥미로운 방법을 생성하며 실제로는 거의 사용되지 않습니다(아마도 진단 목적으로 블루문 3번에 한 번씩). 그래서 대부분의 최신 네트워크 장비는 이를 무시합니다.

관련 정보