Files
Socat/README.md
2026-06-25 11:33:13 +08:00

423 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Socat 端口转发管理脚本
## 简介
一个功能完善的 Socat 一键安装管理脚本支持多种协议的端口转发配置提供开机自启、域名监控DDNS、网络加速BBR等功能。
**版本**: 5.2
**系统要求**: CentOS 7+、Debian 8+、Ubuntu 16+、Arch Linux
## 功能特性
### 支持的转发协议
| 协议 | 说明 | 防火墙配置 | 域名监控 | 典型场景 |
|------|------|------------|----------|----------|
| **TCP** | 标准TCP转发 | TCP | 支持 | 通用端口转发、HTTP/HTTPS、SSH |
| **UDP** | UDP转发 | UDP | 不支持 | DNS、游戏服务器、视频流 |
| **SCTP** | 流控制传输协议 | SCTP | 支持 | 电话信令、高可靠消息传输 |
| **SSL/TLS** | 加密TCP转发 | TCP | 支持 | HTTPS代理、数据加密传输 |
| **UNIX** | 本地套接字转发 | 不需要 | 不适用 | 容器/数据库socket通信 |
| **SOCKS4A** | SOCKS代理转发 | TCP | 不支持 | 穿透防火墙、代理上网 |
| **HTTP PROXY** | HTTP CONNECT代理 | TCP | 不支持 | 企业网络代理、HTTP/HTTPS代理 |
### 核心功能
- **多协议支持**: 支持 TCP、UDP、SCTP、SSL/TLS、UNIX 套接字、SOCKS4A、HTTP PROXY
- **IPv4/IPv6**: 支持纯 IPv4、纯 IPv6、IPv4 域名、IPv6 域名四种地址类型
- **开机自启**: 通过 systemd 服务实现开机自动恢复转发配置
- **域名监控**: 支持 DDNS 域名监控IP 变更自动重启服务
- **网络加速**: 支持 BBR 拥塞控制算法,提升传输性能
- **防火墙配置**: 自动配置 firewalld/ufw/iptables 防火墙规则
- **配置持久化**: JSON 格式配置文件,支持导出导入
- **多发行版支持**: 兼容 CentOS、Debian、Ubuntu、Arch 等主流 Linux 发行版
## 安装
```bash
# 下载脚本
curl -sL https://raw.githubusercontent.com/baichal/Socat/refs/heads/main/socat.sh
# 添加执行权限
chmod +x socat.sh
# 运行脚本(需要 root 权限)
sudo ./socat.sh
```
## 使用指南
### 首次运行
首次运行脚本时程序会自动检测并安装必要的依赖socat、jq、openssl然后进入交互式菜单。
### 主菜单功能
```
========================================
Socat 端口转发一键管理脚本
========================================
1. 添加端口转发
2. 查看转发列表
3. 删除转发规则
4. 开启网络加速
5. 关闭网络加速
6. 查看加速状态
7. 切换 IPv4/IPv6 监控
8. 修改域名监控间隔
9. 恢复转发规则
10. 卸载 Socat
11. 退出
========================================
请输入选项数字:
```
### 添加转发配置
#### 1. 选择协议类型
脚本提供 8 种协议选项:
```
请选择转发协议:
1. TCP + UDP默认- 同时支持 TCP 和 UDP 流量
2. 仅 TCP - 仅转发 TCP 流量
3. 仅 UDP - 仅转发 UDP 流量
4. SCTP - 流控制传输协议
5. SSL/TLS 加密转发 - 数据全程加密
6. UNIX 域套接字 - TCP 与本地 socket 互转
7. SOCKS4A 代理转发 - 通过 SOCKS 代理
8. HTTP PROXY 代理转发 - 通过 HTTP 代理
```
#### 2. 选择地址类型
```
请选择 IP 版本:
1. IPv4默认
2. IPv6
3. IPv4 域名DDNS
4. IPv6 域名DDNS
```
#### 3. 输入转发信息
根据选择的协议和地址类型,输入相应信息:
- **本地端口**: 监听端口1-65535
- **远程端口**: 目标端口
- **远程地址**: 目标 IP 或域名
#### 4. 配置示例
**示例 1: TCP 端口转发**
```
协议: TCP + UDP
地址类型: IPv4
本地端口: 8080
远程端口: 80
远程地址: 192.168.1.100
```
将本机 8080 端口的流量转发到 192.168.1.100:80
**示例 2: SSL/TLS 加密转发**
```
协议: SSL/TLS 加密转发
地址类型: IPv4 域名
本地端口: 443
远程端口: 80
远程地址: example.com
```
将本机 443 端口的加密流量转发到 example.com:80
**示例 3: UNIX 套接字转发**
```
协议: UNIX 域套接字
方向: TCP端口 -> UNIX套接字
套接字路径: /var/run/mysql/mysql.sock
本地端口: 3306
```
将本机 3306 端口转发到 MySQL UNIX 套接字
### 查看转发列表
运行后显示当前所有转发配置:
```
当前转发列表:
1. IPv4: 0.0.0.0:8080 --> 192.168.1.100:80 (TCP/UDP)
2. IPv4 域名: 0.0.0.0:443 --> example.com:80 (OPENSSL) [DDNS, IPv4]
3. IPv6: [::]:8080 --> [2001:db8::1]:80 (TCP)
```
### 删除转发
选择要删除的转发编号,脚本会:
1. 停止对应的 systemd 服务
2. 删除服务文件
3. 移除防火墙规则(如有)
4. 从配置文件删除记录
### 网络加速BBR
BBRBottleneck Bandwidth and RTT是一种 TCP 拥塞控制算法,可显著提升网络传输速度。
**开启加速**:
```
选择功能: 4. 开启网络加速
正在优化网络参数...
已开启 BBR 加速
```
**查看状态**:
```
选择功能: 6. 查看加速状态
当前加速状态: 已开启
算法: bbr
```
### 域名监控DDNS
当使用域名作为远程地址时,脚本会每 5 分钟自动检查域名 IP 是否变更。
**修改监控间隔**:
```
选择功能: 8. 修改域名监控间隔
当前监控间隔: 5 分钟
请输入新的监控间隔(分钟): 10
已更新监控间隔为 10 分钟
```
## 配置文件
### 配置文件位置
- **主配置**: `/etc/socats/config.json`
- **JSON 格式化开关**: `/etc/socats/.json_format`
- **SSL 证书**: `/etc/socats/ssl/server.crt``server.key`
- **域名缓存**: `/etc/socats/dns_cache_*.txt`
- **监控脚本**: `/etc/socats/monitor_*.sh`
### 配置格式
```json
[
{
"type": "ipv4",
"listen_port": 8080,
"remote_ip": "192.168.1.100",
"remote_port": 80,
"protocols": ["tcp", "udp"],
"extra": "null"
},
{
"type": "domain",
"listen_port": 443,
"remote_ip": "example.com",
"remote_port": 80,
"protocols": ["openssl"],
"extra": "null"
},
{
"type": "ipv4",
"listen_port": 3306,
"remote_ip": "127.0.0.1",
"remote_port": 0,
"protocols": ["unix"],
"extra": "tcp2unix:/var/run/mysql/mysql.sock"
}
]
```
### 字段说明
| 字段 | 说明 |
|------|------|
| `type` | 地址类型:`ipv4``ipv6``domain``domain6` |
| `listen_port` | 本地监听端口UNIX→TCP 模式为 0 |
| `remote_ip` | 远程 IP 或域名UNIX→TCP 模式为 `127.0.0.1` |
| `remote_port` | 远程端口TCP→UNIX 模式为 0 |
| `protocols` | 协议列表:`tcp``udp``sctp``openssl``unix``socks``proxy` |
| `extra` | 额外参数UNIX 路径或代理地址 |
## 服务管理
### 查看服务状态
```bash
# 查看所有 Socat 服务
systemctl list-units 'socat-*' --type=service
# 查看单个服务状态
systemctl status socat-8080-80-tcp
```
### 手动管理服务
```bash
# 停止服务
sudo systemctl stop socat-8080-80-tcp
# 启动服务
sudo systemctl start socat-8080-80-tcp
# 重启服务
sudo systemctl restart socat-8080-80-tcp
# 查看日志
sudo journalctl -u socat-8080-80-tcp -f
```
### 服务命名规则
| 协议类型 | 服务名格式 |
|----------|------------|
| TCP/UDP/SCTP/SSL | `socat-<监听端口>-<目标端口>-<协议>` |
| UNIX→TCP | `socat-unix-<socket名>-<目标端口>-unix` |
| TCP→UNIX | `socat-<监听端口>-unix-<socket名>-unix` |
## 防火墙配置
脚本会自动检测并配置防火墙:
### firewalld (CentOS 7+)
```bash
# 查看开放的端口
sudo firewall-cmd --list-ports
# 手动添加端口
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
```
### ufw (Ubuntu/Debian)
```bash
# 查看状态
sudo ufw status
# 手动添加规则
sudo ufw allow 8080/tcp
```
### iptables
```bash
# 查看规则
sudo iptables -L -n
# 手动添加规则
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
```
## 故障排查
### 服务启动失败
```bash
# 查看详细错误
sudo journalctl -u socat-端口1-端口2-协议 -xe
# 常见错误
# - 端口已被占用: 更换端口或停止占用进程
# - 权限不足: 以 root 运行
# - socat 未安装: 重新运行安装脚本
```
### 端口无法访问
```bash
# 检查防火墙
sudo firewall-cmd --list-ports
sudo iptables -L -n | grep 端口
# 检查服务状态
sudo systemctl status socat-端口1-端口2-协议
# 检查端口监听
sudo ss -tlnp | grep 端口
sudo netstat -tlnp | grep 端口
```
### 域名监控不生效
```bash
# 检查监控服务
sudo systemctl status socat-domain-monitor
# 查看监控日志
sudo cat /etc/socats/dns_monitor.log
# 检查域名解析
nslookup your-domain.com
dig your-domain.com
```
### 转发连接不稳定
```bash
# 开启 BBR 加速
sudo ./socat.sh
# 选择 4. 开启网络加速
# 检查系统参数
sysctl net.ipv4.tcp_congestion_control
# 应显示: net.ipv4.tcp_congestion_control = bbr
```
## 卸载
```bash
# 运行卸载
sudo ./socat.sh
# 选择 10. 卸载 Socat
# 或强制卸载
sudo killall socat
sudo rm -rf /etc/socats
sudo rm -f /etc/systemd/system/socat-*.service
sudo systemctl daemon-reload
```
## 常见问题
### Q: 如何同时转发多个端口?
A: 多次运行添加转发功能,或手动创建多个 systemd 服务。
### Q: 支持端口范围转发吗?
A: Socat 支持端口范围,需要手动创建服务,脚本暂不支持。
### Q: 如何实现 TCP/UDP 端口复用?
A: 脚本使用独立的 TCP 和 UDP 服务,如需端口复用可手动修改配置。
### Q: SSL 证书如何实现双向认证?
A: 当前脚本使用自签名证书,如需双向认证请手动配置证书。
### Q: 如何限制转发带宽?
A: 可通过 iptables 或 tc 命令限制带宽,脚本暂不内置此功能。
## 许可证
MIT License
## 更新日志
### v5.2
- 新增 UNIX 套接字转发支持TCP↔UNIX 双向)
- 新增 SOCKS4A 和 HTTP PROXY 代理转发
- 新增 SCTP 协议支持
- 优化域名监控服务,支持多协议重启
- 修复配置文件 JSON 解析问题
- 提升防火墙配置兼容性