mirror of
https://dl.bcrjl.com/ghg/baichal/Socat.git
synced 2026-07-22 05:27:29 +08:00
423 lines
9.7 KiB
Markdown
423 lines
9.7 KiB
Markdown
# 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/example/socat.sh/socat.sh -o 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)
|
||
|
||
BBR(Bottleneck 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 解析问题
|
||
- 提升防火墙配置兼容性
|