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

问题描述:

我试图发送一些数据到本地地址,然后使用特定的接口ppp0'转发'到外部地址。我认为我的问题与分组路由/套接字绑定问题有关,但我太多了解它的新手。在python中的特定接口的linux loopback接口

我的网络设置:

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