Python 端口扫描器

0 投票
2 回答
3540 浏览
提问于 2025-04-17 16:27

我刚开始学Python,现在遇到了一些问题。我想用Python 3自带的库来创建一个端口扫描器(也就是说不使用像scapy这样的库)。我现在有以下代码:

import socket
for i in range(1,26):  
  s = socket.socket()  
  s.settimeout(0.5)
  ip = "74.207.244.221" #scanme.nmap.org
  response = s.connect_ex((ip, i)) 
  if response:
      print ("%d\tclose" %i)
  else:
      print ("%d\topen" %i)
  s.close()

现在我想给这个程序添加两个功能:

  1. 区分关闭的端口和被过滤的端口。在这两种情况下,我收到的错误代码是一样的,那我怎么才能判断我收到的是一个重置包(rst包)还是没有收到任何东西呢?我尝试过使用s.recv(),但好像不太管用。
  2. 我想控制尝试的次数,也就是说我只想发送一到两个同步包(syn包)。我不想让这个程序发送超过两个syn包来探测端口。这个功能怎么实现呢?

2 个回答

0
#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socekt.SOCK_STREAM)
host = 74.207.244.221

def portscan(port):
    try:
        s.connect((host,port))
        return True
    else:
        return False
for x in range(1,255):
    if portscan(x):
        print('Port',x,'Is Open')

当然可以!不过你没有提供具体的内容,我无法进行翻译。如果你能把需要翻译的内容发给我,我会很乐意帮你把它变得更简单易懂。

1

区分关闭的端口和被过滤的端口。在这两种情况下,我收到的错误码是一样的,那我怎么能检查我收到的是一个重置包(RST)还是没有收到任何东西呢?

你可能只检查了那些会返回重置包(RST)的服务器。以下是我尝试过的:

  • 第一种情况,正常配置:

    >>> os.strerror(s.connect_ex((ip, 81)))
    'Connection refused'
    
  • 第二种,手动设置iptables:

    iptables -A OUTPUT -p tcp --dport 81 -j DROP
    
    >>> os.strerror(s.connect_ex((ip, 81)))
    'Resource temporarily unavailable'
    

我想控制尝试的次数,也就是说,我只想发送一到两个同步包(SYN)。

我觉得没有一个叫做 setsockopt 的TCP选项可以用,但在Linux上有:

net.ipv4.tcp_syn_retries

不过,由于你限制了套接字的超时时间,所有在0.5秒内没有完成的操作都会超时。所以很可能只会发送1到2个SYN包。

撰写回答