起因
最近在做内网穿透的时候,经常需要用 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
- 添加日志记录
- 支持端口范围批量映射
开源地址
代码已经开源了,有需要的可以自取:
- GitHub: github.com/JackZho/Jac...
- Gitee: gitee.com/Jackzhou1/j...
欢迎 Star 和提 Issue!
总结
这个工具虽然简单,但确实提高了不少效率。以前配置端口映射要敲好几条命令,现在点几下鼠标就搞定了。
如果你也经常需要配置端口转发,不妨试试这个工具。有问题或建议欢迎留言交流!
最后说一句 :工具是死的,人是活的。这个工具只是把命令行操作可视化了,底层还是调用的系统命令。如果你对 Windows 端口映射的原理感兴趣,建议还是先了解一下 netsh interface portproxy 的用法,这样遇到问题也知道怎么排查。
本文首发于 [稀土掘金],转载请注明出处。