问题遇到的现象和发生背景
目标 :
scapy构造一个imcp的reply的包,目的地址是自己的虚拟网卡,源地址是其他虚拟机的地址,我有什么办法可以让他接到
拓扑图:
client虚拟网卡tun:192.168.53.99,默认从着发出
下一行不重要,跟上面同理。
server虚拟网卡tun0:192.168.53.98,到client的默认路由
程序原理
client和server中间通过一个ssl管道最为隧道,client会通过自己通过createtun函数创建的虚拟网卡发出,信息会用ipfoward函数将数据包封装进入sslsocket的data内,server出来的时候会用received函数把它从data内拿出来并转发到目标。从server回来也是同理,server通过ipfoward封装,client会用received将信息拿出并转发到自己虚拟网卡tun
问题
上面粗体的地方出了问题,比如说client发出一个dst为host的icmp包,在上面粗体的地方,received函数把icmp的reply包拆解出来后转发。虽然说这个reply的icmp包的dst为自己的虚拟网卡,在自己send出去后,自己接收不到icmp的reply包,ping命令就无法完成。通过wireshark发现reply包出现在10.9.0.0/24网段内
问题相关代码,请勿粘贴截图
sock是我连接好的sslsocket
from socket import IP_DEFAULT_MULTICAST_LOOP
from scapy.all import *
import fcntl
import struct
import os
import time
import aes
import base64
#加密装入隧道
def ipforward(sock, tun):
while True:
packet = os.read(tun, 2048)#读取发送时的缓存
if packet:
ip = IP(packet)#scapy封装
print(ip.summary())
packet = aes.encrypt(packet)#icmp内容加密
sock.sendall(packet)#sslsocket发送
#隧道接收解密并转发
def received(sock):
while True:
data=sock.recv(2048)#sslsocket接收信息
pkt = IP(aes.decrypt(data)) #解密出icmp数据包
print(" Inside:{} -->{}".format(pkt.src,pkt.dst))
print(pkt.summary())
send(pkt)#scapy转发
#创建虚拟网卡
def create_tun(myip, dst):
TUNSETIFF = 0x400454ca
IFF_TUN = 0x0001
IFF_TAP = 0x0002
IFF_NO_PI = 0x1000
# Create the tun interface
tun = os.open("/dev/net/tun", os.O_RDWR)
ifr = struct.pack('16sH', b'tun%d', IFF_TUN | IFF_NO_PI)
ifname_bytes = fcntl.ioctl(tun, TUNSETIFF, ifr)
# Get the interface name
ifname = ifname_bytes.decode('UTF-8')[:16].strip("\x00")
print("Interface Name: {}".format(ifname))
os.system("ip addr add {}/24 dev {}".format(myip, ifname))
os.system("ip link set dev {} up".format(ifname))
os.system("ip route add {}/24 dev {} via {}".format(dst, ifname, myip))
return tun
运行结果及报错内容
client ping host
10.9.0网段抓包。五个一组,前四个是正常的TLS的包,data部分数据为icmp包,第五个就是不应该出现的东西了,本来received函数scapy用转发的时候应该直接发送到自己的虚拟网卡,可是结果ping失败并且出现在网段中
192.168.60网段抓包
client程序结果,一切正常
我觉得的原因
有没有可能是sslsocket的问题?
我想要达到的结果
ping成功,这个成功去我其他都能正常
一些不重要的个人尝试
我自己构造了一个dst为自己的icmp包后,一切正常,可以在网段接收到自己的reply包