두 개의 이더넷 인터페이스가 있는 컴퓨터(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 …
기본이 아닌 네트워크 네임스페이스에서 무언가를 실행해야 할 때마다 사용됩니다.
다음과 같이 진행하세요:
유용한 변수를 정의합니다. 다음은
ns1
네임스페이스에 대한 임의의 이름입니다. 사용하려는 장치입니다eth1
.eth2
netns=ns1 dev1=eth1 dev2=eth2
새 네트워크 네임스페이스를 만듭니다.
ip netns add "$netns"
기본 네임스페이스에서 장치를 종료합니다.
ip link set dev "$dev1" down ip link set dev "$dev2" down
새 네임스페이스에 장치 중 하나를 추가합니다(기본 네임스페이스에서는 사라집니다). 여기서는
$dev2
새 네임스페이스로 이동하기로 선택했습니다 .ip link set dev "$dev2" netns "$netns"
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"
두 장치가 올바른 IP 주소를 사용하여 있어야 할 위치에 있는지 확인합니다.
ip address show ip netns exec "$netns" ip address show # examine output
아직 연결하지 않은 경우 케이블을 사용하여 두 인터페이스를 물리적으로 연결합니다.
인터페이스를 불러옵니다. 네임스페이스에는 자체 루프백 장치가 포함되어 있습니다
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
경로를 확인하세요. 내 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
어느 쪽이든 핑을 보내세요.
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"
이렇게 하면 두 번째 장치가 기본 네트워크 네임스페이스로 다시 이동됩니다.
우리가 사용한 명령 중 어느 것도 영구적인 변경을 구현하지 않으므로 문제가 발생하면 재부팅하면 됩니다.