동일한 스위치에 연결되고 동일한 서브네트워크에 있는 두 개의 이더넷 인터페이스가 있는 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 항목이 없습니다.