저는 Python을 사용하여 탭 인터페이스로 패킷을 보내려고 했습니다. Wireshark를 사용하여 탭 인터페이스를 모니터링하고 있는데 패킷이 수신되지 않습니다. 저는 주로 Python의 VPN, 이더넷 브리징 및 소켓 프로그래밍에 대한 이해를 돕기 위한 연습으로 이 작업을 수행하고 있습니다.
내 시스템 설정은 다음과 같습니다.
Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1
먼저 탭을 다음과 같이 설정했습니다.
sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up
그러면 tap0 인터페이스가 시작되고 tap0을 통해 10.0.0.1/24에 대한 커널 라우팅 규칙이 생성됩니다.
경로 테이블은 다음과 같습니다.
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 * 255.255.255.0 U 0 0 0 tap0
192.168.1.6 * 255.255.255.0 U 1 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
다음으로 Python Interactive를 시작하고 간단한 UDP 소켓을 만듭니다.
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))
tap0에서 Wireshark 모니터링을 사용하여 sendto 명령을 실행합니다. 이제 내 네트워크의 10.0.0.2에는 호스트가 없지만 적어도 tap0 인터페이스에서 나가는 트래픽이 일부 표시되어야 합니다. 나는 이것을 Windows에서 복제했으며 정상적으로 작동하는 것 같습니다.
나는 문제가 Linux의 tap0 인터페이스 설정 어딘가에 있다고 생각할 수 있습니다. 저것 또는 이것에 대한 나의 평범한 이해.
감사해요
답변1
이는 OpenVPN에서 브리지 터널링을 위한 것입니다. 를 사용하여 tap
브리지에 연결해야 합니다 . br0
brctl
tap0
예를 들어 과 를 eth0
브리지에 넣으면 br0
브로드캐스트 트래픽이 이 브리지를 가로질러 이동할 수 있다는 아이디어입니다 . (에서 들어오는 브로드캐스트 트래픽은 tap0
로 전달되고 그 반대로 전달되지만 eth0
라우팅된 표준 상황에서는 그렇지 않습니다.) 그런 다음 OpenVPN 터널을 통해 " 라우팅"되는 대신 tap0
"전환"됩니다 . eth0
전체가 br0
IP를 얻고 br0
대신 eth0
또는 대신 처리합니다 tap0
.
인터페이스가 하나만 있는 브리지를 보유하고 brctl
필요에 따라 추가 인터페이스를 추가/제거하는 것이 완전히 가능합니다.
따라서 tap0
브리지에 넣고 대신 브리지 인터페이스를 처리하거나 tun
인터페이스를 사용하십시오.
iptables
규칙이 방해할 수도 있습니다 .
업데이트 - 여기를 보세요:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- 특히 이 발췌문은 다음과 같습니다.
tap 인터페이스와 tun 인터페이스의 차이점은 tap 인터페이스는 전체 이더넷 프레임을 출력하고(제공해야 함), tun 인터페이스는 원시 IP 패킷을 출력하고(제공해야 함) 커널이 이더넷 헤더를 추가하지 않는다는 것입니다. ). 인터페이스가 tun 인터페이스처럼 작동하는지 아니면 tap 인터페이스처럼 작동하는지 여부는 인터페이스가 생성될 때 플래그로 지정됩니다.
따라서 전체 이더넷 프레임을 tap0으로 보내지 않으면 위의 이유로 인해 예상대로 작동하지 않는 것처럼 보입니다.