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语言实现网卡报文获取与内容修改转发

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云淡风轻ing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值