首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中响应ICMP,在python中响应ICMP服务器

问在python中响应ICMP,在python中响应ICMP服务器
EN

Stack Overflow用户
提问于 2021-07-09 09:52:48
回答 1查看 222关注 0票数 2

我想用python响应ping,我已经使用以下命令echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all关闭了linux中的默认ping响应器。

现在我想使用我自己的python脚本进行响应,最终目标是创建一个ping防火墙,但现在,我的目标是以某种方式响应ping,并自定义延迟,例如,当我ping我的服务器时,它将在90ms或任何自定义时间内响应ping。

这是我到现在为止的代码:

代码语言:javascript
复制
import socket
import struct
def listen():
    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
    s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
    while 1:
        data, addr = s.recvfrom(1508)
        icmp_header = data[20:28]
        type, code, checksum, p_id, sequence = struct.unpack('bbHHh', icmp_header)
    
listen()
EN

回答 1

Stack Overflow用户

发布于 2021-07-09 13:53:21

对于每个人,我已经找到了解决方案!

虽然它只能在linux上运行,但对我来说已经足够好了,

结果是,我可以为icmp创建一个python防火墙,添加这个延迟,您可以用它做更多的事情,不管怎样,这里是解决方案。

首先,我运行以下命令,使NFQUEUE成为对icmp数据包进行判断的权威:iptables -A INPUT -p icmp -j NFQUEUE --queue-num 1

然后是下面的python代码:

代码语言:javascript
复制
from struct import pack
from scapy.all import IP,ICMP,TCP,Raw
import os

os.system("iptables -A INPUT -p icmp -j NFQUEUE --queue-num 1")
from scapy.utils import *
import time
from netfilterqueue import NetfilterQueue
import socket
import threading
import random
from string import digits
import time
import threading


def modify_icmp(packet, src):
    if not src=="127.0.0.1":

        time.sleep(0.1)
    packet.accept()

def accept_pkt(packet):
    packet.accept()

def modify(packet):
    pkt = IP(packet.get_payload())

    packet.set_payload(bytes(pkt))
    coming_from = pkt.src
    going_to = pkt.dst

    if pkt.haslayer(ICMP):
        threading.Thread(target=modify_icmp, args=(packet,coming_from)).start()

nfqueue = NetfilterQueue()
nfqueue.bind(1, modify)
try:
    nfqueue.run()
except KeyboardInterrupt:
    pass

注意:仅当从您自己的计算机以外的计算机执行pinging操作时,该命令才有效

例如: pinging 127.0.0.1不会增加延迟

代码语言:javascript
复制
kritagya@v0ldemrt - ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=1.66 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=1.74 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=1.89 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=1.64 ms

但是当我从另一台机器ping我自己的机器时,你可以看到:

代码语言:javascript
复制
ping 192.168.29.102
PING 192.168.29.102 (192.168.29.102) 56(84) bytes of data.
64 bytes from 192.168.29.102: icmp_seq=1 ttl=64 time=102 ms

64 bytes from 192.168.29.102: icmp_seq=2 ttl=64 time=102 ms
64 bytes from 192.168.29.102: icmp_seq=3 ttl=64 time=102 ms
64 bytes from 192.168.29.102: icmp_seq=4 ttl=64 time=103 ms
64 bytes from 192.168.29.102: icmp_seq=5 ttl=64 time=102 ms

它增加了延迟

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68310357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档