2017-09-26 3 views
0

J'essaie d'envoyer des données à une adresse locale, puis de la «transférer» à une adresse externe en utilisant une interface spécifique ppp0. Je pense que mon problème est lié aux problèmes de routage de paquets/liaison de socket, mais je suis trop novice pour comprendre le problème.Interface loopback linux vers une interface spécifique en python

Ma configuration réseau:

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 

avec le rebouclage:

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) 

Du côté Python, je lie la prise

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() 

Ce qui fonctionne bien si j'essaie simplement Ping une adresse externe. Maintenant, je vous envoie mes données à un point local en utilisant 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) 

Et puis j'écoute sur ce port local et de le transmettre (il y a de bonnes raisons pour lesquelles je ne suis pas simplement l'envoyer avec netcat)

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)) 

Les données doivent être dirigées vers l'adresse externe via ppp0, et l'utilisation de la configuration "traiter vers netcat vers local vers externe" (comme ci-dessus) serait préférable. Le socket s_vid n'a pas besoin d'écouter le trafic externe, il envoie simplement des informations externes et en écoute.

Je suppose que mon socket est lié à ppp0 et ne peut donc pas lire les données de bouclage, mais je ne sais pas comment le réparer. Une solution à la fin de Python ou à l'extrémité de routage d'IP fonctionnera, mais je suis nouveau au routage et aux interfaces.

Répondre

0

J'ai simplement ajouté un nouveau socket à mon code, qui est lié à l'interface lo (similaire à la façon dont l'autre est lié à ppp0). Le socket lo lit le socket local (s_lo.recvfrom() dans la boucle), alors que nous gardons s_vid.sendto().