为什么需要自动测端口映射
家里装了宽带,路由器上设了端口映射,想让外网访问家里的NAS或者摄像头。可每次改完设置,都得掏出手机连4G,再打开浏览器输IP加端口号试试通不通。有时候半天打不开,是配置错了?还是设备没开机?还是运营商封了端口?来回折腾,费时间还容易烦躁。
其实这种重复性操作完全可以让程序来干。写个简单的Python脚本,定时检测外部能否访问指定端口,结果直接发到微信或者邮箱,省心多了。
用Python检测端口连通性
Python有个很轻量的模块叫socket,专门处理网络通信。我们可以用它模拟一次TCP连接,就像浏览器访问网站那样,看目标端口是否响应。
import socket
def check_port(host, port, timeout=5):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
sock.close()
if result == 0:
return True
else:
return False
except Exception as e:
print(f"检查出错: {e}")
return False
# 示例:检测公网IP的8080端口
if check_port('123.123.123.123', 8080):
print("端口开放,映射正常")
else:
print("端口不通,检查路由器设置")把上面代码里的IP和端口换成你自己的,运行一下就能知道外网能不能连上。可以把它打包成一个定时任务,比如每5分钟跑一次,发现不通就发个提醒。
结合实际场景做自动化
比如你在公司想远程连家里的Windows电脑,做了3389端口映射。但小区宽带不稳定,偶尔断线重拨后公网IP变了,原来的映射就失效了。这时候可以在家里放一台树莓派或旧电脑,跑一个Python脚本定期检测3389端口,并抓取当前公网IP。
一旦发现IP变了或者端口不通,就自动发邮件或通过企业微信机器人通知你。甚至还能调用路由器的API自动重新配置端口映射规则,全程不用动手。
扩展功能:批量测试多个映射
如果你同时开了好几个服务——NAS用5000端口,监控系统用8000,Web服务器用80,完全可以写个列表批量检测。
servers = [
('123.123.123.123', 5000, 'NAS'),
('123.123.123.123', 8000, '监控'),
('123.123.123.123', 80, '网站')
]
for ip, port, name in servers:
if check_port(ip, port):
print(f"{name}({port}) - 正常")
else:
print(f"{name}({port}) - 异常!")输出一目了然,哪个服务挂了马上就知道。还可以把结果写进日志文件,方便以后排查问题。
别忘了防火墙和内网设备
脚本报端口不通,不一定就是路由器映射没配好。也可能是内网那台机器的Windows防火墙拦了连接,或者是服务根本没启动。所以建议在脚本里先ping一下内网设备确认在线,再从局域网内测试一遍对应端口,排除本地问题。
自动化不是一步到位的事,但从第一个check_port开始,你就已经走在摆脱手动测试的路上了。