내 Linux(커널 3.17) 시스템에는 eth0, eth1(및/또는 eth2...) 등 여러 NIC가 있습니다.
각 컴퓨터에 여러 대의 컴퓨터가 연결되어 있습니다.
PC0 <---> eth0 (192.168.1.100)
PC1 <---> eth1 (192.168.1.101)
PC2 <---> eth2 (192.168.1.102)
Linux 시스템의 애플리케이션은 192.168.1.100(및 다른 두 개)에서 수신 대기하는 스레드를 시작합니다. PC0에서 패킷을 받은 후 스레드가 응답합니다. 답변을 보장하는 방법안 돼요동일한 서브넷 마스크를 가지고 있음에도 불구하고 eth1 또는 eth2를 통과합니까? 마찬가지로 pc1으로부터 패킷을 받은 후 응답은 eth0이나 eth2를 거치지 않아야 합니다.
이상적으로는 제가 말하는 내용을 달성하려면 10.0.0.1 및 172와 같이 완전히 다른 세 개의 서브넷을 사용해야 합니다. 그러나 동료가 이것이 작동할 수 있다고 제안했기 때문에 여기에서 동료 의견을 찾고 있습니다. 커널은 내 통제 하에 있으므로 커널이 작동하도록 하기 위해 어떤 솔루션이라도 생각해낼 수 있도록 커널을 만들었습니다.
설명하다
세 개의 네트워크 카드가 동일한 서브넷에 있는 이유는 무엇입니까? Eth0은 Linux 부팅 중에 정적으로 할당되는 기본 IP 주소입니다. 변경해서는 안 되지만 필요한 경우 변경할 수 있습니다. 문제는 사이트의 누군가가 실수로 eth1과 eth2를 eth0과 동일한 서브넷을 갖도록 할당한 경우 어떻게 됩니까? 소켓이 일부 포트 eth0에서 수신 대기 중인 경우 내 애플리케이션은 eth0에만 응답합니까?
가능한 라우팅 테이블
규칙은 요청이 NIC에서 오면 NIC를 통과한다는 것입니다. 어딘가에서 복사했어요
ip route add 172.16.10.0/24 dev eth0 src 172.16.10.10 table 10
ip route add default via 172.16.10.251 table 10
ip route add 172.16.10.0/24 dev eth1 src 172.16.10.20 table 20
ip route add default via 172.16.10.251 table 20
ip route add 172.16.10.0/24 dev eth0 src 172.16.10.10
ip route add 172.16.10.0/24 dev eth1 src 172.16.10.20
ip route add default via 172.16.10.251
ip rule add from 172.16.10.10 table 10
ip rule add from 172.16.10.20 table 20
ip route flush cache
답변1
일반적으로 애플리케이션은 특정 인터페이스가 아닌 IP 주소에 바인딩됩니다. (예외는 tcpdump/wireshark 등과 같이 네트워크를 직접 방해하는 응용 프로그램입니다. 그러나 이는 귀하의 경우가 아니므로 무시하십시오.) 대부분의 응용 프로그램은 하나의 IP 주소 또는 모든 IP 주소(일반적으로 그렇지 않음)에 바인딩할 수 있습니다. 둘 이상이지만 전부는 아님). 특정 애플리케이션에 적합한 것은 코딩 방법에 따라 다릅니다.
클라이언트가 이 소켓에 연결되면 연결은 다음 네 가지 항목으로 식별됩니다.
- 자신의 IP 주소(예: 192.168.1.100)
- 자신의 포트(예: 8080)
- 클라이언트 IP 주소
- 클라이언트 포트
이 연결에서 수신하는 데이터에 전송되는 모든 응답은 다음 네 가지 특성을 사용하여 전송됩니다. 즉, 서버의 다른 IP나 인터페이스에서 전송되지 않습니다.
따라서 애플리케이션이 수행하는 모든 작업이 {IP,port}에서 수신 대기하고 해당 {IP,port}에서 연결을 수락하고 클라이언트에 응답하는 한 문제가 없어야 합니다.
문제가 발생할 수 있는 곳은 애플리케이션이 때때로 자체 연결을 시작한다는 것입니다. 이 경우 (보통) 컴퓨터가 사용할 인터페이스를 결정하게 됩니다. 컴퓨터에서 세 가지 인터페이스가 모두 동일하게 유효한 것으로 간주하는 경우 트래픽이 잘못된 인터페이스에서 흘러나올 수 있습니다.
컴퓨터가 항상 특정 인터페이스를 사용하도록 하는 것도 가능합니다. 정확한 방법은 특정 OS/배포판에 따라 다릅니다. 검색할 용어는 "unix 소스 라우팅"입니다.