Python实现网卡报文获取与内容修改转发

该实例实现ARP反向代理

#coding:utf-8
from scapy.all import *
import threading
import random
proxy_mac = "00:0c:29:93:19:97"         #代理MAC地址
net_list = ["vethd5d1611","vethc70d8e3","veth8d0fff2"]     
ip_list = ["192.168.134.10","192.168.134.20","192.168.134.30"]      #虚拟IP池
mac_map = {}
host_ip_mac = {}


glock = threading.Lock()


def icmp_proxy_loop():
    print('proxy begin wait icmp')
    filterStr = "icmp"
    sniff(prn=deal_icmp_packet,filter=filterStr,iface="ens38")


def deal_icmp_packet(pkt):
    # pkt.display()
    # hexdump(pkt)
    # print(pkt.src)
    # print(pkt.dst)
    # print(pkt.hwsrc)
    # print(pkt.hwdst)
    # print(pkt.psrc)
    # print(pkt.pdst)
    if pkt.src != proxy_mac and pkt['IP'].dst in host_ip_mac:
        pkt.src = proxy_mac
        pkt.dst = host_ip_mac[pkt['IP'].dst]
        sendp(pkt, count=1, iface="ens38")
                
    




def arp_proxy_loop():
        print('proxy begin wait arp')
        filterStr = "arp"
        sniff(prn=deal_arp_packet,filter=filterStr,iface="ens38")


def deal_arp_packet(pkt):
    if pkt.dst == proxy_mac:
        glock.acquire()
        host_ip_mac[pkt.psrc] = pkt.hwsrc
        glock.release()
        pkt.src = proxy_mac
        pkt.hwsrc = proxy_mac
        # pkt.dst = list(mac_map.keys())[list(mac_map.values()).index(i)]
        pkt.dst = host_ip_mac[pkt.pdst]
        pkt.hwdst = pkt.dst
        # pkt.display()
        hexdump(pkt)
        sendp(pkt, count=1, iface="ens38")
    
    if pkt.src != proxy_mac:
       if pkt.dst == "ff:ff:ff:ff:ff:ff":
           if pkt.psrc in host_ip_mac:
               # glock.acquire()
               # net_id = mac_map[pkt.src]
               # glock.release()
               pkt.src = proxy_mac
               pkt.hwsrc = proxy_mac
               # pkt.psrc = ip_list[net_id]
               hexdump(pkt)
               sendp(pkt, count=1, iface="ens38")
           else:
               # net_id = random.randint(0,2)
               glock.acquire()
               # mac_map[pkt.src] = net_id
               host_ip_mac[pkt.psrc] = pkt.src
               glock.release()
               pkt.src = proxy_mac
               pkt.hwsrc = proxy_mac
               # pkt.psrc = ip_list[net_id]
               hexdump(pkt)
               sendp(pkt, count=1, iface="ens38")


        
def main():
    t1 = threading.Thread(target = arp_proxy_loop)
    t1.start()
    t2 = threading.Thread(target = icmp_proxy_loop)
    t2.start()


if __name__ == "__main__":
    main()

Linux/C语言实现网卡报文获取与内容修改转发

Python中构建IP数据报文头部通常不会直接操作原始二进制数据,因为这涉及到网络协议层的细节,而Python的标准库并没有提供这样的功能。但是你可以通过一些第三方库,如`scapy`,来进行更底层的网络数据包操作。`scapy`是一个非常强大的网络数据包处理库,可以用来构造、解析和发送数据包。 下面是一个使用`scapy`构建IPv4数据报文头部的基本示例: ```python from scapy.all import * # 创建一个新的IP数据报头 ip_header = IP(src="192.168.1.1", dst="8.8.8.8") # 源和目的地址 # 可选参数:添加TCP头部 tcp_header = TCP(sport=1234, dport=5678, seq=123456, ack=67890) # 合并IP和TCP头部 packet = ip_header/tcp_header # 打印出来查看数据报文结构 packet.show() # 发送数据包(需要安装scapy并设置网卡) # send(packet, verbose=False) ``` 在这个例子中,我们创建了一个包含源地址为192.168.1.1、目标地址为8.8.8.8的IPv4数据包,并附加了TCP端口信息。注意,为了发送数据包,你需要安装`scapy`并且配置好合适的网络接口。 如果你只是想了解基础的IP头部结构,可以参考IP数据报头的字段,例如版本(version)、头部长度(ihl)、服务类型和服务总长度(total length)、标识符(identification)、标志(flags)、头部校验和(header checksum)、生存时间(time to live)、协议类型(protocol)、头部偏移(options)、源地址和目标地址等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值