2017-09-26 2 views
0

로컬 주소로 일부 데이터를 보낸 다음 특정 인터페이스 ppp0을 사용하여 외부 주소로 '전달'하려고합니다. 내 문제는 패킷 라우팅/소켓 바인딩 문제와 관련이 있다고 생각하지만 너무 많은 초보자가 그것을 이해할 수 있습니다. 파이썬의 특정 인터페이스에 대한 리눅스 루프백 인터페이스

내 네트워크 설정 : 루프백과

Kernel IP routing table 
Destination  Gateway   Genmask   Flags Metric Ref Use Iface 
0.0.0.0   192.168.1.1  0.0.0.0   UG 0  0  0 wlan0 
0.0.0.0   192.168.1.1  0.0.0.0   UG 303 0  0 wlan0 
10.64.64.64  0.0.0.0   255.255.255.255 UH 0  0  0 ppp0 
169.254.0.0  0.0.0.0   255.255.0.0  U  304 0  0 wwan0 
192.168.1.0  0.0.0.0   255.255.255.0 U  0  0  0 wlan0 
192.168.1.0  0.0.0.0   255.255.255.0 U  303 0  0 wlan0 

:

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 
      inet6 addr: ::1/128 Scope:Host 
      UP LOOPBACK RUNNING MTU:65536 Metric:1 
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1 
      RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

파이썬 측면에서, 나는 단순히를하려고하면 잘 작동 소켓

HOST = '' 
PORT_vid = 0 

try: 
    s_vid = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s_vid.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    s_vid.setsockopt(socket.SOL_SOCKET, 25, "ppp0")#this works to bind it to ppp0 
    print("Socket created.") 
except socket.error, msg: 
    print("Failed. Error: " + str(msg)) 
    sys.exit() 

try: 
    s_vid.bind((HOST,PORT_vid)) 
    print("Socket binding complete.") 
except socket.error, msg: 
    print("Bind failed. Error: " + str(msg)) 
    s_vid.close() 
    sys.exit() 

에게 바인딩 외부 주소를 핑 (ping)하십시오. 지금은 내가 그 로컬 포트에서 수신하고 그것을 전달 다음 netcat

#p_nc is taking some data from a local process and sending it to the local point 
p_nc = subprocess.Popen(["nc", "-u", "127.0.0.1", str(s_vid.getsockname()[1])],stdin=another_process.stdout) 

그리고를 사용하여 주변 지역에 내 데이터를 전송

while 1: 
    data, addr = s_vid.recvfrom(1024) 
    print('local reception') 

    #do stuff here with 'data' - never reached 
    s_vid.sendto(data_amended,(external_ip,external_port)) 
(난 그냥 netcat로를 전송하지 않는 이유 좋은 이유가있다)

데이터는 ppp0을 통해 외부 주소로 이동해야하며 위의 "외부로 로컬로 연결하는 프로세스"로는 "netcat 처리"를 사용하는 것이 좋습니다. s_vid 소켓은 외부 트래픽을 수신 대기 할 필요가 없으며 간단히 외부 및 수신 대기 지역을 전송합니다.

내 소켓이 ppp0에 바인딩되어있어 루프백 데이터를 읽을 수 없다고 생각하지만 해결 방법을 모르겠습니다. 파이썬 끝 또는 ip 라우팅 끝의 솔루션이 작동하지만 라우팅 및 인터페이스가 처음입니다.

답변

0

lo 인터페이스 (다른 사람이 ppp0에 바인딩되는 방식과 비슷 함)에 바인딩 된 새 코드를 내 코드에 추가하기 만하면 끝납니다. lo 소켓은 로컬 소켓 (루프의 s_lo.recvfrom())을 읽는 반면, 우리는 s_vid.sendto()을 유지합니다.

관련 문제