동일한 호스트의 다른 인터페이스에서 하나의 인터페이스를 ping합니다.

동일한 호스트의 다른 인터페이스에서 하나의 인터페이스를 ping합니다.

두 개의 이더넷 인터페이스가 있는 컴퓨터(Linux 실행)가 있습니다. 다른 PC를 사용하지 않고 테스트하고 싶습니다.

설정:

  (192.168.1.5) eth1-------.
Linux PC/device            | loopback cable
  (192.168.1.6) eth2-------'

난 달린다

ping -I eth1 192.168.1.6

하지만 답장은 오지 않는다.

문제가 무엇인지 이해하지 못합니다. Linux가 이 작업을 방지하는 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있나요?

답변1

왜?

나는 완전히 설명할 수 없다.


이 문제를 어떻게 해결할 수 있나요?

대개Linux는 내부적으로 로컬로 할당된 IP 주소에 도달합니다.그냥 작동합니다. 귀하의 경우처럼 외부(예: 케이블을 통해)로 이동하고 다시 돌아오기 위해 패킷이 실제로 필요할 때 문제가 나타나는 것 같습니다.

네트워크 네임스페이스를 사용하여 작동하게 할 수 있습니다. 조정했어요내 다른 답변당신의 필요에.

노트:

  • 데비안 10에서 테스트했습니다.
  • 명령이 있는 곳에 ip …아마도 가 필요할 것입니다 sudo ip …. 가독성을 위해 생략합니다 sudo. 높은 수준의 셸에서 작업하거나 (일시적으로) alias ip='sudo ip'편리하게 복사하여 붙여넣을 수 있도록 정의하세요.
  • 자동화가 간섭하지 않는다고 가정합니다. 즉, 관련 인터페이스를 자체 방식으로 구성하려고 시도하는 데몬이 없습니다.
  • 기본이 아닌 네트워크 네임스페이스에서 명령을 실행하려면 ip netns exec …. 이런 식으로 쉘을 실행하는 것이 가능합니다. 그러면 쉘에서 실행하는 모든 것이 네트워크 네임스페이스를 사용하게 됩니다. 이 답변은 ip netns exec …기본이 아닌 네트워크 네임스페이스에서 무언가를 실행해야 할 때마다 사용됩니다.

다음과 같이 진행하세요:

  1. 유용한 변수를 정의합니다. 다음은 ns1네임스페이스에 대한 임의의 이름입니다. 사용하려는 장치입니다 eth1.eth2

    netns=ns1
    dev1=eth1
    dev2=eth2
    
  2. 새 네트워크 네임스페이스를 만듭니다.

    ip netns add "$netns"
    
  3. 기본 네임스페이스에서 장치를 종료합니다.

    ip link set dev "$dev1" down
    ip link set dev "$dev2" down
    
  4. 새 네임스페이스에 장치 중 하나를 추가합니다(기본 네임스페이스에서는 사라집니다). 여기서는 $dev2새 네임스페이스로 이동하기로 선택했습니다 .

    ip link set dev "$dev2" netns "$netns"
    
  5. IP 주소를 할당합니다.

                           ip address add 192.168.1.5/24 dev "$dev1"
    ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
    
  6. 두 장치가 올바른 IP 주소를 사용하여 있어야 할 위치에 있는지 확인합니다.

                           ip address show
    ip netns exec "$netns" ip address show
    # examine output
    
  7. 아직 연결하지 않은 경우 케이블을 사용하여 두 인터페이스를 물리적으로 연결합니다.

  8. 인터페이스를 불러옵니다. 네임스페이스에는 자체 루프백 장치가 포함되어 있습니다 lo. 일반적인 프로그램에서는 이에 의존하고 싶을 수 있기 때문에 만일의 경우에 대비해 언급하겠습니다.

                           ip link set dev "$dev1" up
    ip netns exec "$netns" ip link set dev "$dev2" up
    ip netns exec "$netns" ip link set dev      lo up
    
  9. 경로를 확인하세요. 내 Debian 10에서는 정상적인 경로가 자동으로 나타납니다. 이 명령

    ip route show
    

    인쇄 (다른 줄 중에서)

    192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
    

    그리고 이 명령은

    ip netns exec "$netns" ip route show
    

    인쇄물

    192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
    
  10. 어느 쪽이든 핑을 보내세요.

                           ping 192.168.1.6
    ip netns exec "$netns" ping 192.168.1.5
    

    사용할 수 있지만 -I꼭 필요한 것은 아닙니다. 주소는 192.168.1.6기본 네트워크 네임스페이스의 인터페이스에 할당되지 않습니다. 192.168.1.5기본이 아닌 네임스페이스에는 할당되지 않습니다 .

그리고 이것이다. 작동해야합니다. 내 테스트에 따르면 ping실제로 케이블을 사용하는 것으로 나타났습니다. 제가 알 수 있는 이유는 다음과 같습니다.

  • 케이블을 분리하면 케이블의 흐름이 중단됩니다. 비교를 위해: "내부" 핑(유선 인터페이스에서 자체 IP 주소로)은 케이블 없이도 흐릅니다.
  • iptraf-ng핑된 인터페이스를 모니터링하면 ICMP 에코 요청과 ICMP 에코 응답이 표시됩니다. 비교를 위해 이 도구는 유선 인터페이스에 대한 "내부" 핑을 표시하지 않습니다.

기본 정리: 네트워크 네임스페이스를 삭제합니다.

ip netns del "$netns"

이렇게 하면 두 번째 장치가 기본 네트워크 네임스페이스로 다시 이동됩니다.

우리가 사용한 명령 중 어느 것도 영구적인 변경을 구현하지 않으므로 문제가 발생하면 재부팅하면 됩니다.

관련 정보