# 连接测试指南

## 当前状态
- ✅ 服务在服务器上正常运行
- ✅ 本地访问成功 (localhost:12240)
- ❌ 外部访问失败 (119.45.30.82:12240)

## 问题原因
外部无法访问通常是以下原因之一：
1. **服务器防火墙未开放端口**（最常见）
2. **云服务器安全组未配置**
3. **网络路由问题**

## 解决步骤

### 步骤1: 配置服务器防火墙

在服务器上执行：

```bash
# 方法1: 使用 firewalld (CentOS 7+/RHEL 7+)
sudo firewall-cmd --add-port=12240/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports  # 验证

# 方法2: 使用 iptables
sudo iptables -A INPUT -p tcp --dport 12240 -j ACCEPT
sudo service iptables save
# 或
sudo iptables-save > /etc/sysconfig/iptables

# 方法3: 使用提供的脚本
chmod +x open_firewall.sh
sudo ./open_firewall.sh
```

### 步骤2: 配置云服务器安全组

#### 阿里云
1. 登录阿里云控制台
2. 进入 **ECS** → **网络与安全** → **安全组**
3. 选择对应的安全组
4. 点击 **配置规则** → **添加安全组规则**
5. 配置：
   - 规则方向：入方向
   - 授权策略：允许
   - 协议类型：TCP
   - 端口范围：12240/12240
   - 授权对象：0.0.0.0/0（或指定IP）

#### 腾讯云
1. 登录腾讯云控制台
2. 进入 **云服务器** → **安全组**
3. 选择对应的安全组 → **修改规则**
4. 添加入站规则：
   - 类型：自定义
   - 来源：0.0.0.0/0
   - 协议端口：TCP:12240
   - 策略：允许

#### 其他云服务商
类似操作，在安全组/防火墙规则中添加 TCP 12240 端口的入站规则。

### 步骤3: 验证配置

```bash
# 1. 检查端口监听（应该显示 0.0.0.0:12240）
netstat -tlnp | grep 12240
# 或
ss -tlnp | grep 12240

# 2. 检查防火墙规则
firewall-cmd --list-ports  # firewalld
# 或
iptables -L INPUT -n | grep 12240  # iptables

# 3. 从服务器测试外部IP
curl http://119.45.30.82:12240/api/cattle-data

# 4. 从外部测试（在本地Windows PowerShell）
curl http://119.45.30.82:12240/api/cattle-data
```

## 临时测试方案（SSH隧道）

如果暂时无法配置防火墙，可以使用 SSH 隧道进行测试：

```bash
# 在本地Windows PowerShell中执行
ssh -L 12240:localhost:12240 root@119.45.30.82

# 然后在另一个终端测试
curl http://localhost:12240/api/cattle-data
```

## 诊断工具

使用提供的诊断脚本：

```bash
chmod +x check_connection.sh
./check_connection.sh
```

## 常见问题

### Q: 防火墙已配置但仍无法访问？
A: 检查云服务器安全组，这是最常见的遗漏。

### Q: 如何确认端口是否开放？
A: 使用在线端口检测工具，或从其他服务器测试。

### Q: 服务只监听 localhost？
A: Spring Boot 默认监听 0.0.0.0，如需明确指定：
```yaml
server:
  address: 0.0.0.0
  port: 12240
```

## 测试命令汇总

```bash
# 服务器端
netstat -tlnp | grep 12240          # 检查监听
curl http://localhost:12240/api/cattle-data  # 本地测试
firewall-cmd --list-ports           # 查看防火墙端口

# 客户端（Windows PowerShell）
curl http://119.45.30.82:12240/api/cattle-data
Invoke-WebRequest -Uri http://119.45.30.82:12240/api/cattle-data
```

