添加代理脚本

This commit is contained in:
cheney 2026-05-24 21:08:10 +08:00
parent 21f5f96677
commit 910084a86f
4 changed files with 381 additions and 0 deletions

103
proxy/README.md Normal file
View File

@ -0,0 +1,103 @@
# 内网代理方案使用说明
## 问题描述
- **A设备当前设备**:可以监听端口,但无法访问内网网站
- **B设备局域网设备**:可以访问内网网站,但无法监听端口
## 解决方案
通过反向代理方式实现访问:
1. **A设备**运行代理服务器监听端口接收用户请求和B设备连接
2. **B设备**主动连接到A设备负责转发请求到内网网站
## 文件结构
```
proxy/
├── proxy_server.py # 运行在A设备上
├── proxy_client.py # 运行在B设备上
└── README.md # 使用说明
```
## 使用步骤
### 第一步在A设备当前设备上启动代理服务器
```bash
python proxy_server.py
```
输出示例:
```
A设备代理服务器已启动监听端口 8080
等待B设备连接和用户请求...
```
记录A设备的IP地址假设为 `192.168.1.50`
### 第二步在B设备上运行客户端程序
```bash
python proxy_client.py 192.168.1.50 8080
```
输出示例:
```
成功连接到A设备: 192.168.1.50:8080
准备转发请求到: superstar.geelytravel.com:443
```
### 第三步在A设备上访问内网网站
**方式一:设置浏览器代理**
1. 打开浏览器设置
2. 设置HTTP/HTTPS代理为`localhost:8080`
3. 访问:`https://superstar.geelytravel.com`
**方式二使用curl测试**
```bash
curl -x http://localhost:8080 https://superstar.geelytravel.com
```
## 工作原理
```
用户浏览器 → A设备(监听端口8080) → B设备 → 内网网站
↑ |
└────────────────────┘
响应返回路径
```
## 配置说明
### A设备proxy_server.py
```python
TARGET_HOST = 'superstar.geelytravel.com' # 目标内网网站
TARGET_PORT = 443 # HTTPS端口
LISTEN_PORT = 8080 # A设备监听端口
```
### B设备proxy_client.py
```python
TARGET_HOST = 'superstar.geelytravel.com' # 目标内网网站
TARGET_PORT = 443 # HTTPS端口
```
## 注意事项
1. 确保两台设备在同一局域网内
2. A设备的防火墙需要允许端口 `8080` 的入站连接
3. B设备需要能正常访问目标内网网站
4. 启动顺序先启动A设备的服务器再启动B设备的客户端
## 故障排除
**B设备无法连接到A设备**
- 检查A设备的IP地址是否正确
- 检查A设备的防火墙设置
- 确保A设备的代理服务器已启动
**网站无法访问:**
- 检查B设备是否能直接访问目标网站
- 检查网络连接是否正常
**连接不稳定:**
- 检查网络稳定性
- 考虑增加超时重试机制

80
proxy/proxy_client.py Normal file
View File

@ -0,0 +1,80 @@
import socket
import threading
import sys
TARGET_HOST = 'superstar.geelytravel.com'
TARGET_PORT = 443
def handle_request(sock):
"""处理从A设备收到的请求转发到目标网站"""
try:
# 接收来自A设备的请求
request = b""
while True:
data = sock.recv(4096)
if not data:
break
request += data
if b"\r\n\r\n" in request:
break
if not request:
return
# 连接到目标网站
target_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
target_sock.connect((TARGET_HOST, TARGET_PORT))
# 发送请求
target_sock.send(request)
# 接收响应并转发回A设备
while True:
response = target_sock.recv(4096)
if not response:
break
sock.send(response)
target_sock.close()
except Exception as e:
print(f"处理请求出错: {e}")
try:
sock.send(b"HTTP/1.1 500 Internal Server Error\r\n\r\n")
except:
pass
def connect_to_a_device(a_host, a_port):
"""连接到A设备"""
while True:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((a_host, a_port))
print(f"成功连接到A设备: {a_host}:{a_port}")
print(f"准备转发请求到: {TARGET_HOST}:{TARGET_PORT}")
handle_request(sock)
sock.close()
print("与A设备的连接已断开")
except ConnectionRefusedError:
print(f"A设备未就绪重试中...")
import time
time.sleep(3)
except Exception as e:
print(f"连接出错: {e}")
import time
time.sleep(3)
def main():
if len(sys.argv) < 3:
print("用法: python proxy_client.py <A设备IP> <A设备端口>")
print("示例: python proxy_client.py 192.168.1.50 8080")
sys.exit(1)
a_host = sys.argv[1]
a_port = int(sys.argv[2])
connect_to_a_device(a_host, a_port)
if __name__ == '__main__':
main()

112
proxy/proxy_manager.py Normal file
View File

@ -0,0 +1,112 @@
import sys
import winreg
def get_current_proxy():
"""获取当前系统代理设置"""
try:
internet_settings = winreg.OpenKey(
winreg.HKEY_CURRENT_USER,
r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
0,
winreg.KEY_READ
)
proxy_server, _ = winreg.QueryValueEx(internet_settings, 'ProxyServer')
proxy_enable, _ = winreg.QueryValueEx(internet_settings, 'ProxyEnable')
winreg.CloseKey(internet_settings)
return {
'enabled': bool(proxy_enable),
'server': proxy_server
}
except FileNotFoundError:
return {'enabled': False, 'server': ''}
except Exception as e:
print(f"获取代理设置失败: {e}")
return {'enabled': False, 'server': ''}
def set_proxy(proxy_host, proxy_port):
"""设置系统代理"""
try:
internet_settings = winreg.OpenKey(
winreg.HKEY_CURRENT_USER,
r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
0,
winreg.KEY_ALL_ACCESS
)
proxy_server = f'{proxy_host}:{proxy_port}'
winreg.SetValueEx(internet_settings, 'ProxyServer', 0, winreg.REG_SZ, proxy_server)
winreg.SetValueEx(internet_settings, 'ProxyEnable', 0, winreg.REG_DWORD, 1)
winreg.CloseKey(internet_settings)
print(f"✅ 系统代理已设置为: {proxy_server}")
return True
except Exception as e:
print(f"❌ 设置代理失败: {e}")
return False
def unset_proxy():
"""取消系统代理"""
try:
internet_settings = winreg.OpenKey(
winreg.HKEY_CURRENT_USER,
r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
0,
winreg.KEY_ALL_ACCESS
)
winreg.SetValueEx(internet_settings, 'ProxyEnable', 0, winreg.REG_DWORD, 0)
winreg.CloseKey(internet_settings)
print("✅ 系统代理已取消")
return True
except Exception as e:
print(f"❌ 取消代理失败: {e}")
return False
def show_status():
"""显示当前代理状态"""
proxy = get_current_proxy()
print("\n当前代理状态:")
print(f" 代理已启用: {'' if proxy['enabled'] else ''}")
if proxy['enabled']:
print(f" 代理服务器: {proxy['server']}")
print()
def main():
if len(sys.argv) < 2:
print("=" * 50)
print(" Windows系统代理管理脚本")
print("=" * 50)
print("用法:")
print(f" {sys.argv[0]} status - 查看当前代理状态")
print(f" {sys.argv[0]} set <host> <port> - 设置代理服务器")
print(f" {sys.argv[0]} unset - 取消代理设置")
print(f" {sys.argv[0]} localhost - 快速设置为 localhost:8080")
print("\n示例:")
print(f" {sys.argv[0]} set 192.168.1.50 8080")
print(f" {sys.argv[0]} localhost")
print(f" {sys.argv[0]} unset")
print("=" * 50)
return
command = sys.argv[1].lower()
if command == 'status':
show_status()
elif command == 'set':
if len(sys.argv) < 4:
print("❌ 参数不足,请提供代理服务器地址和端口")
print(f" 示例: {sys.argv[0]} set 192.168.1.50 8080")
return
proxy_host = sys.argv[2]
proxy_port = sys.argv[3]
set_proxy(proxy_host, proxy_port)
elif command == 'unset':
unset_proxy()
elif command == 'localhost':
set_proxy('localhost', '8080')
else:
print(f"❌ 未知命令: {command}")
if __name__ == '__main__':
main()

86
proxy/proxy_server.py Normal file
View File

@ -0,0 +1,86 @@
import socket
import threading
import select
TARGET_HOST = 'superstar.geelytravel.com'
TARGET_PORT = 443
LISTEN_PORT = 8080
b_device_socket = None
client_socket = None
def handle_b_device(conn):
"""处理B设备的连接"""
global b_device_socket
b_device_socket = conn
print(f"B设备已连接: {conn.getpeername()}")
try:
while True:
data = conn.recv(4096)
if not data:
print("B设备断开连接")
b_device_socket = None
break
if client_socket:
try:
client_socket.send(data)
except:
pass
except Exception as e:
print(f"B设备连接出错: {e}")
b_device_socket = None
def handle_client(conn):
"""处理用户请求"""
global client_socket
client_socket = conn
print(f"用户连接: {conn.getpeername()}")
try:
while True:
data = conn.recv(4096)
if not data:
print("用户断开连接")
client_socket = None
break
if b_device_socket:
try:
b_device_socket.send(data)
except:
conn.send(b"HTTP/1.1 503 Service Unavailable\r\n\r\nB设备未连接")
break
else:
conn.send(b"HTTP/1.1 503 Service Unavailable\r\n\r\nB设备未连接")
break
except Exception as e:
print(f"用户连接出错: {e}")
client_socket = None
def run_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('0.0.0.0', LISTEN_PORT))
server.listen(5)
print(f"A设备代理服务器已启动监听端口 {LISTEN_PORT}")
print(f"等待B设备连接和用户请求...")
while True:
conn, addr = server.accept()
print(f"新连接: {addr}")
# 判断是B设备还是用户简单判断先连接的是B设备
if b_device_socket is None:
# 第一个连接作为B设备
t = threading.Thread(target=handle_b_device, args=(conn,))
t.start()
else:
# 后续连接作为用户
t = threading.Thread(target=handle_client, args=(conn,))
t.start()
if __name__ == '__main__':
run_server()