Python 网络编程:端口检测与IP解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。

Python 网络编程:端口检测与IP解析

在现代网络编程中,了解如何检查端口状态以及根据IP地址解析主机名是非常重要的技能。本文将介绍如何使用Python实现这两个功能,并提供相应的示例代码供读者参考。

一、检查端口是否打开

在网络应用中,判断一个特定端口是否开放可以帮助我们进行故障排查或安全审计。Python的socket库为我们提供了方便的工具来完成这一任务。以下是一个简单的示例,实现了对指定主机和端口的检查:

# 定义一个扫描给定主机IP地址和端口函数,参数为目标主机、目标端口
def connScan(tgtHost, tgtPort):
    try:
        # 创建一个socket对象
        connSkt = socket(AF_INET, SOCK_STREAM)
        # 设置socket超时时间
        connSkt.settimeout(1)  # 设置为1秒
        # 尝试连接到指定的主机和端口
        result = connSkt.connect_ex((tgtHost, tgtPort))
        # 如果返回值为0,说明端口开放
        if result == 0:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是开放的。")
        else:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是关闭的。")
    except Exception as e:
        print(f"发生异常:{e}")
    finally:
        connSkt.close()

代码解析

  • 使用socket()创建一个TCP/IP socket。
  • settimeout()方法用于设置连接的超时时间,以防止在连接过程中长时间阻塞。
  • connect_ex()方法尝试连接指定的主机和端口,并返回连接结果。
  • 最后,我们在finally块中确保无论成功与否都关闭socket连接,释放资源。

二、根据IP地址解析主机名

了解如何将IP地址转换为主机名是另一项重要的技能,特别是在调试网络问题时。我们同样可以通过socket库来实现这一功能。以下是相关示例代码:

# 定义一个主机解析函数,参数为目标主机,目标端口(可以是多个)
def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except Exception as e:
        print('[-] Cannot resolve \'%s\':Unknown host' %tgtHost)
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print('\n[+] Scan Results for: ' + tgtName[0])
    except Exception as e:
        print('\n[+] Scan Results for: ' +tgtIP)

    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('Scanning port ' + tgtPort)
        connScan(tgtHost, int(tgtPort))

代码解析

  • gethostbyaddr()方法根据IP地址返回对应的主机名及相关信息。
  • 我们同样在代码中使用了try...except结构,以捕获解析失败的情况并处理可能出现的异常。

三、整合上面两段代码

源码如下:

import optparse
import socket
from socket import *



def connScan(tgtHost, tgtPort):
    try:
        # 创建一个socket对象
        connSkt = socket(AF_INET, SOCK_STREAM)
        # 设置socket超时时间
        connSkt.settimeout(1)  # 设置为1秒
        # 尝试连接到指定的主机和端口
        result = connSkt.connect_ex((tgtHost, tgtPort))
        # 如果返回值为0,说明端口开放
        if result == 0:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是开放的。")
        else:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是关闭的。")
    except Exception as e:
        print(f"发生异常:{e}")
    finally:
        connSkt.close()


def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except Exception as e:
        print('[-] Cannot resolve \'%s\':Unknown host' %tgtHost)
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print('\n[+] Scan Results for: ' + tgtName[0])
    except Exception as e:
        print('\n[+] Scan Results for: ' +tgtIP)

    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('Scanning port ' + tgtPort)
        connScan(tgtHost, int(tgtPort))

def main():
    parser = optparse.OptionParser('usage %prog -H' + \
                                   '<target host> -p <target port>')
    parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] seperated by comma')
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')

    if tgtHost == None or tgtPorts[0] == None:
        print('[-] You must specify a target host and port[s].')
        exit(0)
    portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
    main()

运行结果如下:

(.venv) (base) liuxiaowei@localhost 运维 % python scanner.py -H 'www.baidu.com' -p '21,22,80'

[+] Scan Results for: 110.242.68.4
Scanning port 21
端口 - 21 在主机 www.baidu.com 上是关闭的。
Scanning port 22
端口 - 22 在主机 www.baidu.com 上是关闭的。
Scanning port 80
端口 - 80 在主机 www.baidu.com 上是开放的。
(.venv) (base) liuxiaowei@localhost 运维 % python scanner.py -H '192.168.1.23' -p '21,22,23,135,445'

[+] Scan Results for: localhost
Scanning port 21
端口 - 21 在主机 192.168.1.23 上是关闭的。
Scanning port 22
端口 - 22 在主机 192.168.1.23 上是开放的。
Scanning port 23
端口 - 23 在主机 192.168.1.23 上是关闭的。
Scanning port 135
端口 - 135 在主机 192.168.1.23 上是关闭的。
Scanning port 445
端口 - 445 在主机 192.168.1.23 上是关闭的。

总结

通过以上两个示例代码,我们可以看到使用Python进行网络编程是多么简单而高效。无论是检查端口状态还是根据IP地址进行反向解析,这些基本技能都是网络开发和运维过程中不可或缺的部分。希望本文能帮助您更好地理解和应用这些技术!

原创不易,欢迎点赞、关注、转发、收藏!!!

相关文章
|
4天前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
120 89
|
1月前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
176 84
|
1月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
219 30
|
27天前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
27天前
|
存储 监控 网络协议
一次读懂网络分层:应用层到物理层全解析
网络模型分为五层结构,从应用层到物理层逐层解析。应用层提供HTTP、SMTP、DNS等常见协议;传输层通过TCP和UDP确保数据可靠或高效传输;网络层利用IP和路由器实现跨网数据包路由;数据链路层通过MAC地址管理局域网设备;物理层负责比特流的物理传输。各层协同工作,使网络通信得以实现。
|
27天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
102 1
|
1月前
|
网络协议 API
检测指定TCP端口开放状态免费API接口教程
此API用于检测指定TCP端口是否开放,支持POST/GET请求。需提供用户ID、KEY、目标主机,可选指定端口(默认80)和地区(默认国内)。返回状态码、信息提示、检测主机、端口及状态(开放或关闭)。示例中ID和KEY为公共测试用,建议使用个人ID和KEY以享受更高调用频率。
64 14
|
1月前
|
网络协议 Ubuntu Linux
解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)
解决 `ssh: connect to host IP port 22: Connection timed out` 报错涉及检查 SSH 服务状态、防火墙配置、网络连通性和主机名解析等多个方面。通过逐步排查上述问题,并在 `scp` 命令中正确指定端口,可以有效解决连接超时的问题,确保文件传输的顺利进行。希望本文提供的解决方案能帮助您快速定位并解决该错误。
186 3
|
1月前
|
运维 网络安全
解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)
通过这些步骤和方法,您可以有效解决“ssh: connect to host IP port 22: Connection timed out”问题,并顺利使用 `scp`命令传输文件。
618 7
|
1月前
|
SQL 安全 算法
网络安全之盾:漏洞防御与加密技术解析
在数字时代的浪潮中,网络安全和信息安全成为维护个人隐私和企业资产的重要防线。本文将深入探讨网络安全的薄弱环节—漏洞,并分析如何通过加密技术来加固这道防线。文章还将分享提升安全意识的重要性,以预防潜在的网络威胁,确保数据的安全与隐私。
79 2

热门文章

最新文章

推荐镜像

更多