veth 장치 쌍을 통해 두 개의 netcat 인스턴스를 연결하는 방법은 무엇입니까?

veth 장치 쌍을 통해 두 개의 netcat 인스턴스를 연결하는 방법은 무엇입니까?

netcatveth(4) 장치 쌍을 통해 인스턴스에 연결 하고 싶습니다 .

그래서 다음을 사용하여 veth 쌍을 만듭니다 ip.

ip link add eth0 type veth peer name eth1
ip addr add 10.0.0.1/24 dev eth0
ip addr add 10.0.0.2/24 dev eth1
ip addr show eth0
13: eth0@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000                                                           
    link/ether 8a:74:8f:e7:dd:cd brd ff:ff:ff:ff:ff:ff 
ip addr show eth1
14: eth1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000                                                              
    link/ether a2:7e:07:be:9a:e2 brd ff:ff:ff:ff:ff:ff 

위에서는 netcat원래 네트워크 장치가 아닌 IP 주소만 청취하므로 veth 장치에 IP 주소를 할당해야 합니다.

그러나 netcat터미널의 eth0에서 리스너를 시작하고 다른 터미널에서 연결을 시도한 후 첫 번째 터미널에서 연결이 수신되지 않습니다.

netcat -n -vvvv -l -s 10.0.0.1 -p 8080
netcat -n -vvv 10.0.0.1 8080 # timeout
netcat -n -vvv 10.0.0.2 8080 # timeout

라우팅 테이블을 보면 ipveth 쌍에 대한 규칙이 자동으로 생성되는 것 같습니다.

ip route 
default via 10.211.55.1 dev enp0s5 proto static metric 100 
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.2
...

내가 뭘 잘못했나요?

답변1

서로 다른 네트워크 네임스페이스에 배치해야 한다는 것을 알았지만 두 veth 쌍에 모두 IP 주소가 할당되었을 때 단일 네임스페이스에서 작동하지 않는 이유를 알려주실 수 있습니까?

다음 사항이 모두 잘못될 수 있습니다.

  • 주소를 수신하는 애플리케이션이 처리합니다.어느패킷의 출처에 관계없이 이 주소로 들어오는 패킷입니다. 따라서 패킷은 양쪽 끝에서 나올 수도 있고 완전히 다른 네트워크 인터페이스(예: eth0)에서 나올 수도 있습니다.
  • Linux 커널이 로컬 대상 주소를 감지하면 이를 로컬 패킷으로 처리하므로 절대 veth-pair를 통과하지 않습니다.
  • Linux 커널 패킷이 수신 패킷의 로컬 소스 주소가 로컬이 아니라는 것을 감지하면(즉, veth-pair를 통해 들어오는) 이를 라우팅 오류로 간주합니다. 왜냐하면 정상적인 상황에서는 이는 네트워크에 누군가가 있다는 것을 의미하기 때문입니다. 어딘가에 라우팅 루프가 있습니다. 네트워크 플러딩을 방지하기 위해 패킷이 삭제됩니다.

eth0컴퓨터에 두 개의 LAN 네트워크 인터페이스(AND )가 있고 이를 LAN 케이블을 사용하여 연결하는 경우에도 eth1마찬가지입니다 .

따라서 veth 쌍을 사용하려면 네트워크 네임스페이스를 생성하세요.

관련 정보