chuzhou-iptables/README.md
2026-06-29 17:09:17 +08:00

579 lines
15 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.

# 客户现场设备网络转发配置说明
## 1. 远程访问地址对应关系
远程通过设备 A 的访问地址进行访问。
| 远程端口 | 访问目标 | 实际链路 |
| ----- | ---------- | -------------------------------------------- |
| 18101 | 设备 A 摄像头 1 | 设备 A -> 10.20.1.11:80 |
| 18102 | 设备 A 摄像头 2 | 设备 A -> 10.20.1.12:80 |
| 18002 | 设备 B 管理页面 | 设备 A -> 10.16.140.112:80 |
| 18103 | 设备 B 摄像头 1 | 设备 A -> 10.16.140.112:28011 -> 10.20.1.11:80 |
| 18104 | 设备 B 摄像头 2 | 设备 A -> 10.16.140.112:28012 -> 10.20.1.12:80 |
| 18003 | 设备 C 管理页面 | 设备 A -> 10.16.140.113:80 |
| 18105 | 设备 C 摄像头 1 | 设备 A -> 10.16.140.113:28011 -> 10.20.1.11:80 |
| 18106 | 设备 C 摄像头 2 | 设备 A -> 10.16.140.113:28012 -> 10.20.1.12:80 |
---
## 2. 背景说明
客户现场共有三台独立设备,分别为:
* 设备 A带 4G 网络,用作现场远程访问入口和转发网关。
* 设备 B无 4G通过设备 A 的 `eth0` 所在局域网访问。
* 设备 C无 4G通过设备 A 的 `eth0` 所在局域网访问。
每台设备都运行一套独立的业务管理服务,并且每台设备本地都连接了两台摄像头。
远程访问需求包括:
1. 远程访问设备 A、B、C 的业务管理页面。
2. 远程访问设备 A、B、C 各自本地连接的两台摄像头 Web 页面。
3. 所有远程访问统一通过设备 A 进入,再由设备 A 转发到对应设备或摄像头。
---
## 3. 当前设备网络结构
### 3.1 设备 A 网络信息
设备 A 是现场唯一带 4G 的设备,作为远程访问入口。
当前已知网口信息如下:
```text
设备 A
ppp04G 拨号网口
eth010.16.140.111/22用于连接设备 B、设备 C
eth110.20.1.1/24用于连接设备 A 本地摄像头
dev010.10.4.28/24疑似穿透或虚拟网络网口
```
设备 A 本地摄像头:
```text
设备 A 摄像头 110.20.1.11:80
设备 A 摄像头 210.20.1.12:80
```
设备 A 已验证可以直接访问本地两个摄像头:
```bash
curl -I http://10.20.1.11
curl -I http://10.20.1.12
```
返回结果均为:
```text
HTTP/1.1 200 OK
```
---
### 3.2 设备 B 网络信息
设备 B 通过设备 A 的 `eth0` 网段访问。
```text
设备 B
eth010.16.140.112
业务管理页面10.16.140.112:80
```
设备 B 本地摄像头网段与设备 A 本地摄像头网段相同,摄像头 IP 也是:
```text
设备 B 摄像头 110.20.1.11:80
设备 B 摄像头 210.20.1.12:80
```
注意:设备 B 的 `10.20.1.11``10.20.1.12` 是设备 B 本地网络内的摄像头,与设备 A 本地的 `10.20.1.11``10.20.1.12` 不是同一台设备。
---
### 3.3 设备 C 网络信息
设备 C 通过设备 A 的 `eth0` 网段访问。
```text
设备 C
eth010.16.140.113
业务管理页面10.16.140.113:80
```
当前已确认:
```text
设备 C 的 10.16.140.113:80 服务未开启,因此 18003 当前无法访问属于正常现象。
```
设备 C 本地摄像头网段与设备 A、设备 B 相同,摄像头 IP 也是:
```text
设备 C 摄像头 110.20.1.11:80
设备 C 摄像头 210.20.1.12:80
```
注意:设备 C 的 `10.20.1.11``10.20.1.12` 是设备 C 本地网络内的摄像头,与设备 A、设备 B 本地同 IP 摄像头不是同一台设备。
---
## 4. 核心转发逻辑
由于 A、B、C 三台设备本地摄像头 IP 都是:
```text
10.20.1.11
10.20.1.12
```
所以不能全部在设备 A 上直接转发到 `10.20.1.11``10.20.1.12`
原因是:
对于设备 A 来说,`10.20.1.11``10.20.1.12` 默认就是设备 A 自己 `eth1` 下的本地摄像头。
因此B、C 设备下的摄像头必须采用“两级转发”方式:
```text
远程访问
设备 A
↓ 通过 eth010.16.140.x 网段
设备 B / 设备 C
↓ 各自本地 10.20.1.x 网段
对应设备本地摄像头
```
也就是说:
```text
设备 A 负责远程入口转发
设备 B / 设备 C 负责把自己的中转端口转发到本地摄像头
```
---
## 5. 端口规划
### 5.1 设备 A 本地摄像头
```text
远程端口 18101 -> 设备 A 本地摄像头 110.20.1.11:80
远程端口 18102 -> 设备 A 本地摄像头 210.20.1.12:80
```
### 5.2 设备 B
```text
远程端口 18002 -> 设备 B 管理页面10.16.140.112:80
远程端口 18103 -> 设备 B 摄像头 1
远程端口 18104 -> 设备 B 摄像头 2
```
设备 B 内部中转端口:
```text
设备 B:28011 -> 设备 B 本地摄像头 110.20.1.11:80
设备 B:28012 -> 设备 B 本地摄像头 210.20.1.12:80
```
因此完整链路为:
```text
远程访问 18103 -> 设备 A -> 10.16.140.112:28011 -> 设备 B 本地 10.20.1.11:80
远程访问 18104 -> 设备 A -> 10.16.140.112:28012 -> 设备 B 本地 10.20.1.12:80
```
### 5.3 设备 C
```text
远程端口 18003 -> 设备 C 管理页面10.16.140.113:80
远程端口 18105 -> 设备 C 摄像头 1
远程端口 18106 -> 设备 C 摄像头 2
```
设备 C 内部中转端口:
```text
设备 C:28011 -> 设备 C 本地摄像头 110.20.1.11:80
设备 C:28012 -> 设备 C 本地摄像头 210.20.1.12:80
```
因此完整链路为:
```text
远程访问 18105 -> 设备 A -> 10.16.140.113:28011 -> 设备 C 本地 10.20.1.11:80
远程访问 18106 -> 设备 A -> 10.16.140.113:28012 -> 设备 C 本地 10.20.1.12:80
```
---
## 6. 设备 A 上的转发配置
### 6.1 开启 IP 转发
在设备 A 上执行:
```bash
echo 1 > /proc/sys/net/ipv4/ip_forward
```
查看是否生效:
```bash
cat /proc/sys/net/ipv4/ip_forward
```
返回:
```text
1
```
表示开启成功。
---
### 6.2 设备 A 本地摄像头转发
设备 A 本地摄像头可以由设备 A 直接转发:
```bash
iptables -t nat -A PREROUTING -p tcp --dport 18101 -j DNAT --to-destination 10.20.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 18102 -j DNAT --to-destination 10.20.1.12:80
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -p tcp -d 10.20.1.11 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.20.1.12 --dport 80 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```
说明:
```text
18101 -> 10.20.1.11:80
18102 -> 10.20.1.12:80
```
---
### 6.3 设备 B 管理页面和摄像头转发
设备 A 转发到设备 B 的规则:
```bash
# 设备 B 管理页面
iptables -t nat -A PREROUTING -p tcp --dport 18002 -j DNAT --to-destination 10.16.140.112:80
# 设备 B 两个摄像头中转端口
iptables -t nat -A PREROUTING -p tcp --dport 18103 -j DNAT --to-destination 10.16.140.112:28011
iptables -t nat -A PREROUTING -p tcp --dport 18104 -j DNAT --to-destination 10.16.140.112:28012
# 设备 A 通过 eth0 访问设备 B进行源地址伪装
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 放行转发
iptables -A FORWARD -p tcp -d 10.16.140.112 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.16.140.112 --dport 28011 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.16.140.112 --dport 28012 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```
对应关系:
```text
18002 -> 10.16.140.112:80
18103 -> 10.16.140.112:28011 -> 设备 B 本地 10.20.1.11:80
18104 -> 10.16.140.112:28012 -> 设备 B 本地 10.20.1.12:80
```
---
### 6.4 设备 C 管理页面和摄像头转发
设备 A 转发到设备 C 的规则:
```bash
# 设备 C 管理页面
iptables -t nat -A PREROUTING -p tcp --dport 18003 -j DNAT --to-destination 10.16.140.113:80
# 设备 C 两个摄像头中转端口
iptables -t nat -A PREROUTING -p tcp --dport 18105 -j DNAT --to-destination 10.16.140.113:28011
iptables -t nat -A PREROUTING -p tcp --dport 18106 -j DNAT --to-destination 10.16.140.113:28012
# 设备 A 通过 eth0 访问设备 C进行源地址伪装
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 放行转发
iptables -A FORWARD -p tcp -d 10.16.140.113 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.16.140.113 --dport 28011 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.16.140.113 --dport 28012 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```
对应关系:
```text
18003 -> 10.16.140.113:80
18105 -> 10.16.140.113:28011 -> 设备 C 本地 10.20.1.11:80
18106 -> 10.16.140.113:28012 -> 设备 C 本地 10.20.1.12:80
```
当前注意事项:
```text
设备 C 的 10.16.140.113:80 服务当前未开启,因此远程访问 18003 不通属于正常现象。
```
---
## 7. 设备 B 上的转发配置
设备 B 需要把自己的两个中转端口 `28011``28012` 转发到本地摄像头。
### 7.1 开启 IP 转发
```bash
echo 1 > /proc/sys/net/ipv4/ip_forward
```
---
### 7.2 添加设备 B 本地摄像头转发规则
假设设备 B 的摄像头网口为 `eth1`,设备 B 的上联业务网口为 `eth0`
```bash
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 28011 -j DNAT --to-destination 10.20.1.11:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 28012 -j DNAT --to-destination 10.20.1.12:80
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -p tcp -d 10.20.1.11 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.20.1.12 --dport 80 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```
对应关系:
```text
10.16.140.112:28011 -> 设备 B 本地摄像头 10.20.1.11:80
10.16.140.112:28012 -> 设备 B 本地摄像头 10.20.1.12:80
```
---
## 8. 设备 C 上的转发配置
设备 C 需要把自己的两个中转端口 `28011``28012` 转发到本地摄像头。
### 8.1 开启 IP 转发
```bash
echo 1 > /proc/sys/net/ipv4/ip_forward
```
---
### 8.2 添加设备 C 本地摄像头转发规则
假设设备 C 的摄像头网口为 `eth1`,设备 C 的上联业务网口为 `eth0`
```bash
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 28011 -j DNAT --to-destination 10.20.1.11:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 28012 -j DNAT --to-destination 10.20.1.12:80
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -p tcp -d 10.20.1.11 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.20.1.12 --dport 80 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```
对应关系:
```text
10.16.140.113:28011 -> 设备 C 本地摄像头 10.20.1.11:80
10.16.140.113:28012 -> 设备 C 本地摄像头 10.20.1.12:80
```
---
## 9. 验证命令
### 9.1 在设备 A 上验证本地摄像头
```bash
curl -I http://10.20.1.11
curl -I http://10.20.1.12
```
---
### 9.2 在设备 A 上验证设备 B
```bash
curl -I http://10.16.140.112
curl -I http://10.16.140.112:28011
curl -I http://10.16.140.112:28012
```
---
### 9.3 在设备 A 上验证设备 C
```bash
curl -I http://10.16.140.113
curl -I http://10.16.140.113:28011
curl -I http://10.16.140.113:28012
```
说明:
```text
如果 curl -I http://10.16.140.113 不通,需要先确认设备 C 的 80 端口服务是否启动。
```
---
### 9.4 查看设备 A 上的 NAT 规则
```bash
iptables -t nat -L PREROUTING -n -v --line-numbers
iptables -t nat -L POSTROUTING -n -v --line-numbers
iptables -L FORWARD -n -v --line-numbers
```
---
## 10. 常见问题说明
### 10.1 为什么 127.0.0.1:18101 测不通?
例如:
```bash
curl -I http://127.0.0.1:18101
```
失败是正常的。
原因是当前使用的是 `iptables PREROUTING` 转发规则,该规则主要处理外部进入本机的流量。
本机访问 `127.0.0.1` 属于回环流量,不经过 `PREROUTING` 链。
正确测试方式应该是从外部访问设备 A 的远程入口地址,或者从同网段其他设备访问设备 A 的对应端口。
---
### 10.2 为什么设备 B、C 的摄像头不能在设备 A 上直接转到 10.20.1.11
因为设备 A、B、C 三台设备的本地摄像头网段都使用了相同 IP
```text
10.20.1.11
10.20.1.12
```
对于设备 A 来说,访问 `10.20.1.11` 默认会走设备 A 自己的 `eth1`,访问到设备 A 本地摄像头。
设备 A 无法仅通过目标 IP 区分这是 A、B、C 哪一台设备下面的摄像头。
所以必须通过中转端口区分:
```text
B 摄像头:设备 A -> 10.16.140.112:28011/28012 -> B 本地摄像头
C 摄像头:设备 A -> 10.16.140.113:28011/28012 -> C 本地摄像头
```
---
### 10.3 18003 当前为什么无法访问?
当前已经确认:
```text
设备 C 的 10.16.140.113:80 服务未开启。
```
因此远程访问:
```text
http://设备A访问地址:18003
```
无法打开属于正常现象。
需要先在设备 C 上启动对应的业务管理服务,并确认设备 A 可以访问:
```bash
curl -I http://10.16.140.113
```
如果返回 HTTP 响应,再测试远程 `18003` 访问。
---
## 11. 临时规则与持久化说明
当前通过 `iptables` 手动添加的规则属于临时规则。
设备重启后,这些规则可能会丢失。
后续如果确认全部链路稳定,需要将以下内容持久化:
1. `/proc/sys/net/ipv4/ip_forward=1`
2. 设备 A 上的所有 DNAT、MASQUERADE、FORWARD 规则
3. 设备 B 上的本地摄像头中转规则
4. 设备 C 上的本地摄像头中转规则
可以考虑使用以下方式之一持久化:
```text
方式 1写入 systemd 启动脚本
方式 2使用 iptables-save / iptables-restore
方式 3安装 iptables-persistent
```
推荐后续根据现场系统情况,整理成独立脚本,例如:
```text
设备 A/usr/local/bin/setup-forward-a.sh
设备 B/usr/local/bin/setup-forward-b.sh
设备 C/usr/local/bin/setup-forward-c.sh
```
并配置 systemd 开机自动执行。
---
## 12. 当前状态总结
当前已确认:
```text
设备 A 本地两个摄像头可远程访问。
设备 B 管理页面可远程访问。
设备 B 本地两个摄像头可远程访问。
设备 C 本地两个摄像头可远程访问。
设备 C 管理页面 18003 当前不可访问,原因为设备 C 的 10.16.140.113:80 服务未开启。
```
整体路由和端口转发逻辑已经验证可行。
核心链路为:
```text
远程访问入口
设备 A4G / 穿透入口
根据端口转发到:
- 设备 A 本地摄像头
- 设备 B 管理页面
- 设备 B 本地摄像头中转端口
- 设备 C 管理页面
- 设备 C 本地摄像头中转端口
```