두 개의 로봇 장치를 내 컴퓨터에 연결해야 하며 이를 위해 서로 다른 하드웨어에 연결된 두 개의 네트워크 카드를 사용하고 싶습니다. 두 장치 모두 동일한 네트워크(두 경우 모두 IP 주소 10.0.0.70 및 10.0.0.21, 넷마스크 255.255.255.0)를 사용하고 있습니다.
단일 카드로 네트워크를 구성하고 설정하면 제대로 작동한다는 것을 알았습니다. 안드로이드 장치에 핑을 보낼 수 있고 연결할 수 있습니다. 그런데 두 번째 카드를 꺼냈더니 카드 두 개 중 하나만 작동합니다. 메인 컴퓨터에 다른 IP 주소를 부여해 보았고, 동일한 IP 주소도 부여해 보았지만 아무런 차이가 없었습니다. 호스트의 IP 주소를 게이트웨이로 지정해 보았지만 카드마다 다르고 동일하며 차이가 없습니다. 두 카드가 모두 가동되면 핑 시 사용할 인터페이스를 지정하더라도 카드 중 하나에서 핑이 작동하지 않습니다.
내 커널은 4.15.0-39-generic #42~16.04.1-Ubuntu SMP Wed Oct 24 17:09:54 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux입니다.
두 네트워크 카드를 서로 다른 네트워크에 할당하면 함께 작동합니다. 단, 로봇 장치측에서는 네트워크 설정을 변경하지 않는 것이 바람직합니다. 이 두 카드 사이에 패킷을 라우팅할 필요가 없습니다.
이것은 내가 얻은 작업 구성입니다.
enp3s0 Link encap:Ethernet HWaddr 18:d6:c7:00:d9:3e
inet addr:10.0.1.30 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16929681 errors:0 dropped:0 overruns:0 frame:0
TX packets:56504 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1219898415 (1.2 GB) TX bytes:5267812 (5.2 MB)
enp6s0 Link encap:Ethernet HWaddr 18:d6:c7:01:69:35
inet addr:10.0.0.22 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::1ad6:c7ff:fe01:6935/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:52316 errors:0 dropped:0 overruns:0 frame:0
TX packets:16935487 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4325056 (4.3 MB) TX bytes:1220948325 (1.2 GB)
첫 번째 장치의 IP를 10.0.0.30(및 브로드캐스트 주소를 10.0.0.255)으로 변경하자마자 작동이 중지되었습니다.
방금 Kali Linux 라이브 배포판에서 시도해 보았지만 거기에서도 작동하지 않습니다. 칼리 리눅스에서
ifconfig eth0 10.0.0.21 netmask 255.255.255.0 up
ifconfig eth1 10.0.0.70 netmask 255.255.255.0 up
다시 말하지만, 최소한 ping -I가 작동하기를 바랐지만 둘 중 하나를 ping하려면 다른 하나도 다운되어야 합니다. 간단한 스위치는 동일한 네트워크에 연결된 여러 개의 물리적 포트를 가질 수 있는데 메인프레임 컴퓨터는 어떻게 할 수 없습니까?
답변1
기본적으로 Linux의 IP 프로토콜 드라이버는 기술적으로 "약한 시스템 모델" 또는 "약한 호스트 모델"로 알려진 최적화를 사용합니다.자세한 내용은 이 질문을 참조하세요.
결론은 동일한 IP 주소 공간 블록에 속하는 IP/넷마스크 조합으로 두 개의 NIC를 구성할 때 나가는 IP 주소 라우팅을 담당하는 코드는 이것이 두 NIC가 모두 연결되어 있음을 의미한다고 가정한다는 것입니다.동일한 물리적 네트워크 세그먼트, 따라서 그 중 하나를 사용하여 해당 블록의 IP 주소를 가진 모든 호스트와 통신할 수 있습니다. 그런 다음 해당 네트워크 세그먼트에서 나가는 모든 트래픽에 대해 라우팅 테이블에 처음 나열된 인터페이스만 사용합니다.동일한 IP 주소 공간의 복사본을 사용하는 여러 개의 서로 다른 물리적 네트워크에 대한 개념이 없습니다.
시스템에 문제가 있는 경우역방향 경로 필터링( /proc/sys/net/ipv4/conf/*/rp_filter
) 활성화되면 네트워크 인터페이스를 지정하더라도(예를 들어) 봇 중 하나에 핑을 보내는 것을 방지할 수 있습니다. eth1
응답이 오면 eth1
역방향 경로 필터는 해당 소스 IP에 대한 일반 경로가 통과하는 것을 확인합니다. eth0
, 따라서 이 수신 패킷은 eth1
가짜임이 틀림없습니다. 다음 기능을 활성화하면 이런 일이 발생하는지 확인할 수 있습니다화성 로그환경:
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $i
done
그런 다음 봇에 ping을 시도하고 출력 끝을 확인하세요 dmesg
. 삭제된 패킷에 대한 메시지가 표시될 수 있습니다.
귀하의 상황에서는 나가는 패킷에 사용할 NIC를 결정할 때 소스 IP 주소를 고려하여 소위 "강력한 엔드 시스템 모델" 또는 "강력한 호스트 모델"에 따라 작동하도록 라우팅이 필요합니다. 글쎄, 리눅스할 수 있는고급 라우팅 기능을 사용하여 이 작업을 수행할 수 있지만 이는 확실히 기본값이 아니며 구성하기가 매우 까다롭습니다. 정말로 이 작업을 수행하려면 구성 방법에 대한 위 질문의 답변을 참조하세요.
그러나 로봇의 IP 주소는 겹치지 않기 때문에 소프트웨어 구성 측면에서 가장 간단한 해결책은 작고 저렴한 네트워크 스위치(또는 허브)를 구입하고 로봇과 컴퓨터의 네트워크 케이블을 여기에 연결하는 것입니다.
또는 최소한의 하드웨어로 단순성을 원하는 경우 동일한 시스템의 여러 NIC에 직접 연결하려는 경우 서로 다른 IP 세그먼트를 사용하도록 로봇을 구성하면 됩니다.
답변2
로봇 장치의 IP가 다르기 때문에 가장 쉬운 방법은 두 개의 이더넷 인터페이스를 포트로 사용하여 Linux 브리지를 만드는 것입니다. 비슷한 것
ip link add name br0 type bridge
ip link set enp3s0 master br0
ip link set enp6s0 master br0
그런 다음하나의내부 인터페이스의 IP 주소 br0
:
ip addr add 10.0.0.1/24 dev br0
상자 끝에 스위치가 걸려 있지 않고 모든 것이 여전히 동일한 네트워크에 있습니다.
그리고 제발,제발, Kali Linux를 사용하여 그런 일을 하지 마십시오. 읽다이것, 일상 업무를 위해 일부 배포판(Kali도 Debian 기반이므로 Debian 기반)으로 전환하세요. 고생이 훨씬 줄어들 겁니다. Kali가 사용할 수 있는 모든 빛나는 도구도 설치할 수 있습니다.
답변3
21 및 70의 경우 두 개의 겹치지 않는 서브넷 10.0.0.0/26 및 10.0.0.64/26(/26 = 마스크 255.255.255.192)을 사용할 수 있습니다. 다른 인터페이스에는 10.0.0.0/25가 포함되어 있지 않다고 가정합니다.