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.