如何在VPN互联的Fritzbox环境下用Python获取办公网IP(MacOS/Ubuntu)
获取办公网内设备IP的Python实现方案
思路说明
你的设备通过VPN接入办公网后,会被分配一个10.131.131.x段的IP。可以通过两种方式获取该IP:一是利用socket连接办公网节点自动匹配对应接口IP;二是直接枚举本地网络接口,筛选办公网子网段的IP。
方法一:通过Socket连接办公网节点获取
这种方法依赖VPN连接正常,且办公网内有可访问的节点(比如你traceroute里的10.131.131.13),系统会自动使用VPN接口的IP发起连接,从而获取本地的办公网IP。
import socket def get_office_vpn_ip(): target_host = "10.131.131.13" # 办公网内可访问的目标IP try: # 创建socket连接,不发送数据 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.connect((target_host, 80)) office_ip = s.getsockname()[0] return office_ip except Exception as e: print(f"获取失败: {e}") return None if __name__ == "__main__": ip = get_office_vpn_ip() if ip: print(f"设备在办公网的IP: {ip}")
方法二:枚举本地网络接口筛选办公网IP
直接读取本地所有网络接口的IP地址,筛选属于10.131.131.0/24子网的IP。这种方法不需要依赖办公网节点的连通性,只要VPN接口已分配IP即可。
依赖说明
需要安装netifaces库(跨平台支持MacOS和Ubuntu),执行安装命令:
pip install netifaces
实现代码
import netifaces import ipaddress def get_office_ip_from_interfaces(): target_subnet = ipaddress.IPv4Network("10.131.131.0/24", strict=False) for interface in netifaces.interfaces(): addrs = netifaces.ifaddresses(interface) if netifaces.AF_INET in addrs: for addr_info in addrs[netifaces.AF_INET]: ip = addr_info["addr"] if ipaddress.IPv4Address(ip) in target_subnet: return ip return None if __name__ == "__main__": ip = get_office_ip_from_interfaces() if ip: print(f"设备在办公网的IP: {ip}") else: print("未找到办公网IP,请检查VPN连接")
注意事项
- 两种方法都需要确保VPN处于连接状态,且办公网子网配置正确(
10.131.131.0/24)。 - 方法一需要目标主机(
10.131.131.13)可访问,若该主机不可用,可替换为办公网内其他稳定在线的设备IP。 - MacOS和Ubuntu系统均支持上述代码,无需额外适配。
内容的提问来源于stack exchange,提问作者jotpunkt
相关产品推荐
相关产品推荐

