Linux에서 루프백 인터페이스를 통하지 않고 로컬 대상으로 패킷을 보내는 방법

Linux에서 루프백 인터페이스를 통하지 않고 로컬 대상으로 패킷을 보내는 방법

동일한 스위치에 연결되고 동일한 서브네트워크에 있는 두 개의 이더넷 인터페이스가 있는 Linux 서버가 있습니다. 토폴로지는 다음과 같습니다

+--------------------+
|                    |
|         +----------+        +----------+
|         | enp1s0f0 |<======>|          |
|         +----------+        | ethernet |
|  Server            |        |          |
|         +----------+        |  switch  |
|         | enp1s0f1 |<======>|          |
|         +----------+        +----------+
|                    |
+--------------------+

이 두 인터페이스의 IP 주소는 각각 172.16.0.100및 입니다 172.16.1.100.

$ ip addr
...
4: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 10:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f0
       valid_lft forever preferred_lft forever
5: enp1s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 10:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f1
       valid_lft forever preferred_lft forever
...

enp1s0f0이제 외부 스위치를 통해 패킷을 보내고 싶습니다 enp1s0f1(테스트 목적으로 스위치의 관점에서 보면 두 개의 개별 컴퓨터가 서로 통신하고 있습니다). 그래서 소켓의 로컬 주소를 172.16.0.100에 바인딩하고 이를 172.16.1.100에 연결합니다(예: telnet -b 172.16.0.100 172.16.1.100 22명령 사용). 그러나 lo이 두 개의 이더넷 인터페이스와 스위치가 아닌 인터페이스(캡처된 패킷 검사를 통해)를 통해 이동하는 패킷만 볼 수 있습니다 .

그래서 내 첫 번째 질문은Linux가 외부 인터페이스를 통해 이러한 패킷을 로컬 대상으로 보내도록 하려면 어떻게 해야 합니까?

주소와 라우팅 테이블을 올바르게 설정한 것 같습니다. 라우팅 테이블에는 다음 항목이 포함됩니다.

$ ip route
...
172.16.0.0/16 dev enp1s0f0 proto kernel scope link src 172.16.0.100 metric 100
172.16.0.0/16 dev enp1s0f1 proto kernel scope link src 172.16.1.100 metric 101

그리고 ARP 테이블도 올바르게 구성된 것 같습니다.

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.1.100             ether   10:00:00:00:01:00   CM                    enp1s0f0
172.16.0.100             ether   10:00:00:00:00:00   CM                    enp1s0f1

그러나 Linux는 여전히 lo인터페이스를 통해 이러한 패킷을 라우팅합니다.

$ ip route get from 172.16.0.100  172.16.1.100
local 172.16.1.100 from 172.16.0.100 dev lo uid 1000
    cache <local>
$ ip route get from 172.16.1.100  172.16.0.100
local 172.16.0.100 from 172.16.1.100 dev lo uid 1000
    cache <local>

나는 또한 ping이러한 인터페이스에서 ing을 시도했습니다 ping -I enp1s0f0 172.16.1.100. 캡처된 패킷은 전송된 ICMP 패킷이 예상대로 스위치를 통해 대상에 도착할 수 있지만 enp1s0f1인터페이스에 응답 패킷이 표시되지 않음을 보여줍니다. 이 문제에 대한 해결책을 검색해 본 결과이것대답하면 이것이 다음과 관련이 있을 수 있다고 나와 있습니다.역방향 경로 필터링. 그래서 rp_filter기본값과 인터페이스 값을 0과 2 중 하나로 설정하여 비활성화하려고 했지만 rp_filter문제가 해결되지 않았습니다. 내 추가 질문은내 구성이 정확합니까? 이 상황에서 Linux가 ICMP 핑 패킷에 응답하도록 하려면 어떻게 해야 합니까?

내 OS는 Ubuntu 20.04이고 ICMP 응답은 다른 인터페이스에서 잘 작동하며 구성된 iptable 항목이 없습니다.

관련 정보