iStoreOS 端口转发 iptables 规则配置 🛠️

iStoreOS 网络配置

一份详尽的 iStoreOS (基于 OpenWrt) iptables 端口转发配置指南,帮助您实现内网服务的远程访问


目录 📚


🌐 网络环境概述

设备 IP地址 角色 备注
主路由 OpenWrt 10.10.10.253 网关/NAT 主要网络入口
旁路由 OpenWrt 10.10.10.252 辅助路由 特殊服务处理
Windows 桌面 10.10.10.249:3389 目标服务 远程桌面服务
Sun-panel 服务 10.10.10.251:3002 Web服务 内部Web应用

📋 配置前准备

1. 启用 IP 转发功能

在配置端口转发前,需要确保系统已启用 IP 转发功能:

1
2
3
4
5
6
7
8
# 编辑 sysctl.conf 文件
vi /etc/sysctl.conf

# 找到并取消注释以下行(或添加它)
net.ipv4.ip_forward = 1

# 使配置立即生效
sysctl -p

2. 检查当前防火墙规则

1
2
3
4
5
6
7
8
9
10
11
# 查看现有 NAT 规则
iptables -t nat -L -n -v

# 查看 PREROUTING 链
iptables -t nat -L PREROUTING -n -v

# 查看 POSTROUTING 链
iptables -t nat -L POSTROUTING -n -v

# 查看 Filter 表中的 FORWARD 规则(确保转发不被阻止)
iptables -L FORWARD -n -v

3. 备份原配置文件

1
2
3
4
5
6
7
8
# 备份防火墙配置
cp /etc/firewall.user /etc/firewall.user.backup.$(date +%Y%m%d)

# 备份网络配置
cp /etc/config/network /etc/config/network.backup.$(date +%Y%m%d)

# 如果需要,备份当前的 iptables 规则
iptables-save > /root/iptables.backup.$(date +%Y%m%d).rules

🎯 方案一:网关指向主路由时的配置

直接端口转发配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建或覆盖防火墙配置
cat > /etc/firewall.user <<'EOF'
### iStoreOS 端口转发配置 ###
### 生成时间: $(date) ###

### PVE-Win11桌面-主路由直接转发 ###
# 外部3366端口 -> 内部3389端口
iptables -t nat -A PREROUTING -p tcp --dport 3366 -j DNAT --to-destination 10.10.10.249:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.249 --dport 3389 -j MASQUERADE

# 确保 FORWARD 链允许转发的流量
iptables -A FORWARD -p tcp -d 10.10.10.249 --dport 3389 -j ACCEPT

### 配置结束 ###
EOF

# 重启防火墙使配置生效
/etc/init.d/firewall restart

参数说明

  • --dport 3366:外部访问端口(可自定义)
  • --to-destination 10.10.10.249:3389:内部服务地址和端口
  • MASQUERADE:IP伪装,确保返回流量正确路由
  • FORWARD 规则:确保数据包能被转发到目标地址

🔄 方案二:网关指向旁路由时的配置

步骤1:旁路由端口转发配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在旁路由 (10.10.10.252) 上执行
cat > /etc/firewall.user <<'EOF'
### 旁路由端口转发配置 ###

### PVE-Win11桌面-旁路由转发 ###
# 外部3389端口 -> 内部3389端口
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 10.10.10.249:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.249 --dport 3389 -j MASQUERADE

# 允许流量转发
iptables -A FORWARD -p tcp -d 10.10.10.249 --dport 3389 -j ACCEPT

EOF

# 重启旁路由防火墙
/etc/init.d/firewall restart

步骤2:主路由端口转发配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在主路由 (10.10.10.253) 上执行
cat > /etc/firewall.user <<'EOF'
### 主路由端口转发配置 ###

### PVE-Win11桌面-主路由二次转发 ###
# 外部3377端口 -> 旁路由3389端口
iptables -t nat -A PREROUTING -p tcp --dport 3377 -j DNAT --to-destination 10.10.10.252:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.252 --dport 3389 -j MASQUERADE

# 允许流量转发
iptables -A FORWARD -p tcp -d 10.10.10.252 --dport 3389 -j ACCEPT

EOF

# 重启主路由防火墙
/etc/init.d/firewall restart

流量路径
公网IP:3377主路由:3377旁路由:3389Win桌面:3389


📝 方案三:追加配置(不覆盖原有规则)

在现有配置基础上追加规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 添加分隔线和注释
echo "" >> /etc/firewall.user
echo "### 新增端口转发规则 ###" >> /etc/firewall.user
echo "### 添加时间: $(date) ###" >> /etc/firewall.user

# 添加 Sun-panel 转发规则
echo "### Sun-panel 服务转发 ###" >> /etc/firewall.user
echo "iptables -t nat -A PREROUTING -p tcp --dport 3002 -j DNAT --to-destination 10.10.10.251:3002" >> /etc/firewall.user
echo "iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.251 --dport 3002 -j MASQUERADE" >> /etc/firewall.user
echo "iptables -A FORWARD -p tcp -d 10.10.10.251 --dport 3002 -j ACCEPT" >> /etc/firewall.user

# 添加其他服务规则示例
echo "### 其他服务示例 ###" >> /etc/firewall.user
echo "# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.250:80" >> /etc/firewall.user
echo "# iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.250 --dport 80 -j MASQUERADE" >> /etc/firewall.user
echo "# iptables -A FORWARD -p tcp -d 10.10.10.250 --dport 80 -j ACCEPT" >> /etc/firewall.user

# 重启防火墙
/etc/init.d/firewall restart

🛠️ 高级配置技巧

1. 多端口范围转发

1
2
3
4
# 转发端口范围 5000-5010
iptables -t nat -A PREROUTING -p tcp --dport 5000:5010 -j DNAT --to-destination 10.10.10.249:5000-5010
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.249 --dport 5000:5010 -j MASQUERADE
iptables -A FORWARD -p tcp -d 10.10.10.249 --dport 5000:5010 -j ACCEPT

2. 指定源IP限制

1
2
3
4
# 只允许特定IP访问
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.100 --dport 3366 -j DNAT --to-destination 10.10.10.249:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.249 --dport 3389 -j MASQUERADE
iptables -A FORWARD -p tcp -s 192.168.1.100 -d 10.10.10.249 --dport 3389 -j ACCEPT

3. UDP协议转发

1
2
3
4
# 转发UDP流量(如VPN)
iptables -t nat -A PREROUTING -p udp --dport 1194 -j DNAT --to-destination 10.10.10.249:1194
iptables -t nat -A POSTROUTING -p udp -d 10.10.10.249 --dport 1194 -j MASQUERADE
iptables -A FORWARD -p udp -d 10.10.10.249 --dport 1194 -j ACCEPT

4. 删除现有规则

1
2
3
4
5
6
7
8
9
# 查看规则编号
iptables -t nat -L PREROUTING -n --line-numbers
iptables -t nat -L POSTROUTING -n --line-numbers
iptables -L FORWARD -n --line-numbers

# 删除指定规则
iptables -t nat -D PREROUTING [规则编号]
iptables -t nat -D POSTROUTING [规则编号]
iptables -D FORWARD [规则编号]

🔍 验证和调试

1. 检查规则是否生效

1
2
3
4
5
6
7
8
9
10
11
# 查看NAT表的所有规则
iptables -t nat -L -n -v

# 查看具体的PREROUTING规则
iptables -t nat -L PREROUTING -n -v

# 查看具体的POSTROUTING规则
iptables -t nat -L POSTROUTING -n -v

# 查看FORWARD规则
iptables -L FORWARD -n -v

2. 测试端口连通性

1
2
3
4
5
6
7
8
9
# 内部测试(在同网络内)
telnet 10.10.10.253 3366
nc -zv 10.10.10.253 3366

# 检查服务是否在目标机器上监听
netstat -tln | grep 3389

# 外部测试(从公网测试)
# 可以使用在线端口检测工具或另一网络设备测试

3. 查看连接跟踪

1
2
3
4
5
# 查看当前的NAT连接
cat /proc/net/ip_conntrack | grep 3389

# 或者使用conntrack工具
conntrack -L | grep 3389

⚠️ 常见问题解决

❌ 问题1: 规则不生效

解决方案

1
2
3
4
5
6
7
8
9
10
11
# 检查防火墙是否运行
/etc/init.d/firewall status

# 重新加载配置
/etc/init.d/firewall reload

# 检查是否有其他冲突规则
iptables -t nat -L -n

# 确认IP转发已开启
sysctl net.ipv4.ip_forward

❌ 问题2: 能连接但无法通信

解决方案

1
2
3
4
5
6
7
8
# 检查目标服务是否运行
netstat -tlnp | grep 3389

# 检查目标防火墙设置
# 在Windows上检查防火墙是否允许3389端口

# 检查FORWARD链是否允许流量通过
iptables -L FORWARD -n -v

❌ 问题3: 重启后规则丢失

解决方案

1
2
3
4
5
6
7
8
9
# 确保规则保存在 /etc/firewall.user
# 检查文件权限
chmod 644 /etc/firewall.user

# 确认防火墙启动脚本会加载这个文件
grep firewall.user /etc/init.d/firewall

# 保存当前iptables规则
iptables-save > /etc/iptables.rules

❌ 问题4: 端口冲突

解决方案

1
2
3
4
5
# 检查端口是否被占用
netstat -tlnp | grep 3366

# 修改为其他端口
# 将 --dport 3366 改为其他未使用端口

📊 配置管理建议

1. 使用版本控制

1
2
3
4
5
6
7
# 备份配置文件
cp /etc/firewall.user /etc/firewall.user.$(date +%Y%m%d_%H%M%S)

# 使用git管理配置(如果安装了git)
cd /etc && git init
git add firewall.user
git commit -m "更新防火墙配置"

2. 添加配置说明头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 在配置文件开头添加详细说明
cat > /etc/firewall.user <<'EOF'
##############################################
# iStoreOS 防火墙自定义规则
# 生成时间: $(date)
# 作者: 你的名字
# 备注: 自定义端口转发规则
##############################################

### 规则说明 ###
# 端口3366 -> Win远程桌面(10.10.10.249:3389)
# 端口3002 -> Sun-panel面板(10.10.10.251:3002)

### 实际规则 ###
iptables -t nat -A PREROUTING -p tcp --dport 3366 -j DNAT --to-destination 10.10.10.249:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.249 --dport 3389 -j MASQUERADE
iptables -A FORWARD -p tcp -d 10.10.10.249 --dport 3389 -j ACCEPT

EOF

3. 定期检查规则

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建检查脚本
cat > /usr/local/bin/check-firewall.sh <<'EOF'
#!/bin/sh
echo "=== 防火墙规则检查 ==="
echo "时间: $(date)"
echo "NAT 规则:"
iptables -t nat -L -n
echo ""
echo "连接跟踪:"
conntrack -L | head -20
EOF

chmod +x /usr/local/bin/check-firewall.sh

🚀 性能优化建议

  1. 减少规则数量:合并类似规则,使用端口范围
  2. 优化规则顺序:将常用规则放在前面
  3. 使用连接跟踪:利用 conntrack 提高性能
  4. 定期清理:移除不再需要的规则
  5. 监控性能:使用 tophtop 监控系统负载

💡 核心原理与注意事项

🔧 iptables 端口转发原理

  1. PREROUTING 链 (DNAT):修改目标地址和端口,将发往本机特定端口的数据包转发到内网机器。
  2. FORWARD 链:允许数据包在接口之间转发。
  3. POSTROUTING 链 (SNAT/MASQUERADE):修改源地址,确保返回包能正确路由。

⚠️ 重要注意事项

  1. 安全风险:端口转发会将内部服务暴露到外部网络,请确保只转发必要的服务,并设置强密码。
  2. 网络拓扑:确保转发设备是流量的必经之路。
  3. 服务状态:确保目标服务正在运行且监听正确端口。
  4. 防火墙干扰:检查目标主机的防火墙设置,确保不会阻止转发的流量。
  5. 规则持久化:记得保存 iptables 规则,以免重启后丢失。

💡 提示:在生产环境中,建议先在测试环境中验证配置,确保所有规则按预期工作后再应用到主网络。同时,记得配置适当的安全措施,如限制源IP地址,避免不必要的端口暴露。

希望本指南帮助您成功配置 iStoreOS 的端口转发功能!如有问题,请参考 OpenWrt 官方文档或社区论坛。