簡體   English   中英

linux loopback接口到python中的特定接口

[英]linux loopback interface to specific interface in python

我正在嘗試將一些數據發送到本地地址,然后使用特定的接口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)

在Python方面,我綁定了套接字

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)

然后,我在該本地端口上進行偵聽並將其轉發(有充分的理由說明為什么我不只是使用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))

該數據具有經由去外部地址ppp0 ,並使用“進程netcat到本地到外部的”設置(如上所述)是優選的。 s_vid套接字不需要偵聽任何外部流量,它只是發送外部數據並偵聽本地數據。

我猜我的套接字綁定到ppp0 ,因此無法讀取回送數據,但是我不知道如何解決它。 在Python端或ip路由端上的解決方案都可以使用,但是我對路由和接口還是陌生的。

最終只需在我的代碼中添加一個新套接字即可,該套接字綁定到lo接口(類似於另一個套接字綁定到ppp0 )。 lo套接字讀取本地套接字(循環中的s_lo.recvfrom() ),而我們保留s_vid.sendto()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM