![](/img/trans.png)
[英]How to bind a raw socket to a specific interface using python in linux centOS?
[英]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.