写了个 Windows 端口映射管理工具,再也不用敲命令了

起因

最近在做内网穿透的时候,经常需要用 netsh interface portproxy 来配置端口转发。每次都要敲一长串命令,而且想查看现有的映射规则还得再敲一遍命令,删除的时候又是一遍...

敲多了真的烦,于是花了点时间撸了个图形化工具,现在分享出来。

先看效果

界面长这样,简单直观:

主要功能:

  • 一键添加端口映射
  • 批量删除(支持多选)
  • 按 IP 和端口筛选
  • 自动配置防火墙规则

为什么要做这个

Windows 自带的 netsh interface portproxy 功能挺强大,但是命令行操作实在太麻烦了。

比如添加一个映射:

bash 复制代码
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=192.168.1.100 connectport=80

查看所有映射:

bash 复制代码
netsh interface portproxy show all

删除映射:

bash 复制代码
netsh interface portproxy delete v4tov4 listenport=8080

每次都要敲这么长,而且容易打错。更麻烦的是,添加完映射还得手动配置防火墙规则,不然外部访问不了。

所以就想着做个工具,把这些操作都可视化,点点鼠标就能搞定。

技术选型

用的是 Python + CustomTkinter,主要考虑:

  • Python 写起来快
  • CustomTkinter 界面比原生 Tkinter 好看多了
  • 可以打包成 exe,不用装 Python 环境

核心就是调用系统命令,然后解析输出结果展示在界面上。

实现细节

1. 自动提权

端口映射需要管理员权限,所以程序启动时会自动请求提权:

python 复制代码
def run_as_admin():
    try:
        if ctypes.windll.shell32.IsUserAnAdmin():
            return True
    except:
        pass
    
    try:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, f'"{sys.argv[0]}"', None, 1)
        return True
    except:
        return False

if not ctypes.windll.shell32.IsUserAnAdmin():
    run_as_admin()
    sys.exit()

2. 命令执行

封装了一个执行命令的函数,处理了编码问题(Windows 的编码真是个坑):

python 复制代码
def run_cmd(cmd):
    result = subprocess.run(
        cmd,
        shell=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        creationflags=subprocess.CREATE_NO_WINDOW
    )
    # 尝试多种编码解析输出
    try:
        stdout = result.stdout.decode("utf-8", errors="ignore")
    except:
        try:
            stdout = result.stdout.decode("gbk", errors="ignore")
        except:
            stdout = result.stdout.decode("latin-1", errors="ignore")
    
    return (result.returncode, stdout, stderr)

3. 解析映射列表

netsh interface portproxy show all 的输出格式比较固定,直接按空格分割就行:

python 复制代码
code, out, err = run_cmd("netsh interface portproxy show all")
lines = out.splitlines()

for line in lines:
    if "侦听" in line or "ipv4" in line or "---" in line:
        continue
    parts = line.split()
    if len(parts) >= 4:
        listen_addr = parts[0]
        listen_port = parts[1]
        target_ip = parts[2]
        target_port = parts[3]
        # 存储到列表

4. 自动配置防火墙

添加映射的时候,顺便把防火墙规则也加上:

python 复制代码
# 添加映射
cmd = f"netsh interface portproxy add v4tov4 listenport={listen_port} connectaddress={to_ip} connectport={to_port}"
run_cmd(cmd)

# 添加防火墙规则
firewall = f'netsh advfirewall firewall add rule name="Port{listen_port}" dir=in action=allow protocol=TCP localport={listen_port}'
run_cmd(firewall)

这样就不用手动去防火墙里配置了。

使用场景

我自己主要用在这几个地方:

1. 内网服务转发

公司内网有个测试服务器,但是只能通过跳板机访问。在跳板机上配置端口映射,就可以直接从本地访问了:

yaml 复制代码
本地 8080 → 内网服务器 192.168.1.100:80

2. 多服务统一管理

本地开发的时候,经常要同时跑好几个服务,端口一多就容易乱。用这个工具统一管理,一目了然:

yaml 复制代码
3000 → 前端服务
3001 → 后端 API
3002 → 数据库管理界面

3. 临时端口转发

有时候需要临时把某个端口的流量转到另一台机器,用这个工具几秒钟就能搞定,不用去改配置文件。

遇到的坑

坑1:界面字体看不清

一开始用的深色主题,结果发现某些情况下字体颜色和背景色对比度不够,看不清。后来改成浅色主题,并且手动指定了文字颜色,才解决。

坑2:编码问题

Windows 命令行输出的编码真是个大坑,有时候是 GBK,有时候是 UTF-8。最后用了多重 try-except 来处理,先试 UTF-8,不行再试 GBK,再不行就用 latin-1。

坑3:防火墙规则

一开始只添加了端口映射,没加防火墙规则,结果外部访问不了。后来才发现还得手动配置防火墙,于是在代码里自动加上了。

打包成 exe

用 PyInstaller 打包很简单:

bash 复制代码
pip install pyinstaller
pyinstaller --onefile --windowed portMapping.py

--onefile 打包成单个 exe 文件,--windowed 不显示命令行窗口。

打包完的 exe 大概 20MB 左右,可以直接分发给别人用,不需要装 Python 环境。

后续计划

目前功能还比较基础,后面打算加上:

  • 导入导出配置(方便备份和迁移)
  • 支持 IPv6
  • 添加日志记录
  • 支持端口范围批量映射

开源地址

代码已经开源了,有需要的可以自取:

欢迎 Star 和提 Issue!

总结

这个工具虽然简单,但确实提高了不少效率。以前配置端口映射要敲好几条命令,现在点几下鼠标就搞定了。

如果你也经常需要配置端口转发,不妨试试这个工具。有问题或建议欢迎留言交流!


最后说一句 :工具是死的,人是活的。这个工具只是把命令行操作可视化了,底层还是调用的系统命令。如果你对 Windows 端口映射的原理感兴趣,建议还是先了解一下 netsh interface portproxy 的用法,这样遇到问题也知道怎么排查。


本文首发于 [稀土掘金],转载请注明出处。

相关推荐
tang777892 小时前
哪些行业用动态代理ip?哪些行业用静态代理IP?怎样区分动态ip和静态ip?(互联网人必码·实用长文)
大数据·网络·爬虫·python·网络协议·tcp/ip·智能路由器
龙泉寺天下行走2 小时前
LangChain Skills框架核心解析
python·langchain·aigc
echome8882 小时前
Python 装饰器详解:从入门到精通的实用指南
开发语言·python
tang777892 小时前
爬虫代理IP池到底有啥用?
网络·爬虫·python·网络协议·tcp/ip·ip
sg_knight2 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
墨有6662 小时前
基于弦论流体对偶与环空间约化的湍流精确数值模型
python·流体力学·弦理论
兰文彬2 小时前
n8n 2.x版本没有内嵌Python环境
开发语言·python
smileNicky3 小时前
Spring AI系列之对话记忆与工具调用指南
人工智能·python·spring
飞Link3 小时前
深度解析 TS2Vec:时序表示学习中的层次化建模(Hierarchical Contrastive Learning)
开发语言·python·学习·数据挖掘