client.py

client.py

우분투 14 사용

나는 두 개의 인터페이스를 가진 Linux 머신을 가지고 있습니다: eth1: 172.16.20.1 ppp0: 192.168.0.2

ppp0은 PPP 인터페이스(192.168.0.1) 및 WAN 인터페이스(172.16.20.2)를 사용하여 장치에 연결됩니다. 장치가 172.16.20.1에 도달할 수 있는지 확인할 수 있습니다.

내가 겪고 있는 문제는 동일한 컴퓨터에서 Python을 사용하여 패킷을 보내는 경우입니다.

client.py

import socket
cl = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
cl.sendto("Hello", ("172.16.20.1", 5005))

server.py

import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
srv.bind(("", 5005))
while True:
    data, addr = srv.recvfrom(2048)
    print("Message: ", data)

스크립트는 잘 작동하지만 Wireshark의 eth1에서 나오는 패킷을 볼 수 없습니다(lo 인터페이스에서 캡처하도록 선택한 경우에만 볼 수 있습니다). 나는 운영 체제가 패킷이 로컬 인터페이스 중 하나에 대한 것임을 감지하고 생성된 192.168.0.2 소켓을 통해 패킷을 보내지 않을 것이라고 가정합니다.

이런 일이 발생하지 않도록 다음 규칙을 추가하면 다음과 같습니다.

sudo ip route del table local 172.16.20.1 dev eth1
sudo ip route add table local 172.16.20.1 dev ppp0
sudo ip route flush cache

일어나는 일은 다음과 같습니다.

  • Wireshark에서 패킷이 이제 eth1에 도착하고 소스 주소가 WAN 주소(172.16.20.2)임을 확인할 수 있습니다.
  • 프로그램을 다시 시작한 후 server.py의 출력이 표시되지 않습니다.

ppp0 인터페이스를 무시하고 두 개의 ethx 인터페이스를 사용하십시오. 두 개의 별도 컴퓨터(클라이언트와 서버)에서 규칙을 적용하지 않고 이 프로그램을 실행하려고 하면 Wireshark의 eth1에 도착하는 패킷과 server.py의 출력을 볼 수 있습니다. 두 개의 별도 컴퓨터에서 프로그램을 실행하고 위의 규칙을 ppp0 연결에 적용하려고 하면(제거하지 않음) 더 이상 server.py의 출력을 볼 수 없지만 여전히 도착하는 데이터는 볼 수 있습니다. 와이어샤크 가방. TCP/IP 프로토콜 스택은 잘 모르지만 링크 계층이 더 이상 애플리케이션 계층으로 전달되지 않는 것 같나요?

답변1

링크 레이어가 더 이상 애플리케이션 레이어로 전달되지 않는 것 같습니다.

링크 레이어는 문제가 되지 않습니다. 구성의 영향을 받지 않습니다. 이것은 네트워크 계층(IP)에 관한 것입니다.

local테이블은 패킷이 로컬로 배달될 수 있는지 여부를 결정하는 커널의 방법입니다. IP 주소를 제거하면 패킷이 라우팅되거나 삭제됩니다.

MAC 주소가 다른 시스템의 ARP 캐시에 있기 때문에 이것이 작동하는 것 같습니다. 로컬 테이블에 주소가 없으면 수신 시스템이 ARP 요청에 응답하지 않을 것으로 예상됩니다.

답변2

수신된 패킷에 올바른 UDP 및 IP4 체크섬이 있는지 확인하십시오. Wireshark에서 체크섬 계산을 활성화하고 캡처를 확인합니다.

답변3

제 경우에는 처음에는 로컬 트래픽을 보고 캡처할 수 없었습니다.

조사 결과 근본 원인은 네트워크 트래픽을 포착한 것입니다.네트워크 인터페이스 오류. 예를 들어 네트워크 인터페이스 트래픽을
캡처합니다.eth0loopback네트워크 인터페이스 트래픽 이 아닌

따라서 로컬 네트워크 트래픽을 보고 캡처하려면 사용 가능한 모든 네트워크 인터페이스에 대한 트래픽을 캡처 loopback하거나 선택해야 합니다.any

관련 정보