OpenWrt IPv6端口转发优化方案
以下代码请替换`bc:24:11:39:bc:d9`为你的MAC地址,原理很简单,识别MAC地址绑定的IPV6,然后通过socat进行转发。
首先安装socat
```bash
opkg update
opkg install socat
```
## 方案1:最简单的本地启动脚本(有点问题,br-lan不是所有都能识别)
在Web界面"本地启动脚本"中添加:
```bash
# ===== NAS IPv6端口转发 =====
# 等待网络就绪
sleep 45
# 启动转发(无日志)
(
# 等待接口就绪
while ! ip link show br-lan 2>/dev/null | grep -q "UP"; do
sleep 2
done
# 等待IPv6地址
for i in $(seq 1 12); do
if ip -6 addr show br-lan 2>/dev/null | grep -q "global"; then
break
fi
sleep 5
done
# 清理旧进程
killall socat 2>/dev/null
sleep 2
# 查找并启动转发
NAS_MAC="bc:24:11:39:bc:d9"
for i in 1 2 3; do
NAS_IPV6=$(ip -6 neigh show | grep -i "$NAS_MAC" | grep '240e:' | awk '{print $1}' | head -1)
if [ -n "$NAS_IPV6" ]; then
for port in 80 443 5666 3031; do
socat TCP6-LISTEN:${port},fork,reuseaddr,ipv6only=1 TCP6:[${NAS_IPV6}]:${port} &
sleep 0.2
done
break
fi
sleep 5
done
) &
```
## 方案2:极简脚本文件 + 启动项
```bash
# 创建极简脚本
cat > /root/nas-start /dev/null
sleep 1
# 获取NAS IPv6
NAS_MAC="bc:24:11:39:bc:d9"
NAS_IPV6=$(ip -6 neigh show | grep -i "$NAS_MAC" | grep '240e:' | awk '{print $1}' | head -1)
if [ -n "$NAS_IPV6" ]; then
# 启动端口转发
for port in 80 443 5666 3031; do
socat TCP6-LISTEN:${port},fork,reuseaddr,ipv6only=1 TCP6:[${NAS_IPV6}]:${port} &
done
fi
EOF
chmod +x /root/nas-start
```
然后在本地启动脚本中添加:
```bash
# NAS IPv6转发
(sleep 50 && /root/nas-start) &
```
## 方案3:带自动恢复的无日志监控
```bash
cat > /root/nas-monitor /dev/null
sleep 1
NAS_IPV6=$(ip -6 neigh show | grep -i "$NAS_MAC" | grep '240e:' | awk '{print $1}' | head -1)
if [ -n "$NAS_IPV6" ]; then
for port in 80 443 5666 3031; do
socat TCP6-LISTEN:${port},fork,reuseaddr,ipv6only=1 TCP6:[${NAS_IPV6}]:${port} &
done
fi
fi
done
EOF
chmod +x /root/nas-monitor
```
本地启动脚本:
```bash
# NAS IPv6转发 + 监控
(sleep 50 && /root/nas-start && sleep 10 && /root/nas-monitor) &
```
## 方案4:一行命令解决方案(最简)
直接在本地启动脚本里写:
```bash
# NAS IPv6端口转发
(sleep 50 && killall socat 2>/dev/null; sleep 2; NAS_IPV6=$(ip -6 neigh show | grep -i "bc:24:11:39:bc:d9" | grep '240e:' | awk '{print $1}' | head -1); [ -n "$NAS_IPV6" ] && for port in 80 443 5666 3031; do socat TCP6-LISTEN:${port},fork,reuseaddr,ipv6only=1 TCP6:[${NAS_IPV6}]:${port} & done) &
```
## 方案5:带IP变化检测的简洁版
```bash
cat > /root/nas-auto /dev/null)
if [ -n "$CURRENT_IP" ] && [ "$CURRENT_IP" != "$LAST_IP" ]; then
# IP变化,重启转发
killall socat 2>/dev/null
sleep 1
for port in 80 443 5666 3031; do
socat TCP6-LISTEN:${port},fork,reuseaddr,ipv6only=1 TCP6:[${CURRENT_IP}]:${port} &
done
echo "$CURRENT_IP" > "$LAST_IP_FILE"
elif [ -z "$CURRENT_IP" ] && [ -f "$LAST_IP_FILE" ]; then
# NAS可能离线
rm -f "$LAST_IP_FILE"
fi
sleep 180 # 3分钟检查一次
done
EOF
chmod +x /root/nas-auto
```
本地启动脚本:
```bash
# NAS自动转发
(sleep 55 && /root/nas-auto) &
```
## 推荐方案:简洁可靠
**步骤1:创建简洁脚本**
```bash
cat > /root/nas-ipv6 /dev/null
sleep 1
IP=$(ip -6 neigh show | grep -i "bc:24:11:39:bc:d9" | grep '240e:' | awk '{print $1}' | head -1)
[ -n "$IP" ] && for p in 80 443 5666 3031; do
socat TCP6-LISTEN:${p},fork,reuseaddr,ipv6only=1 TCP6:[${IP}]:${p} &
done
EOF
chmod +x /root/nas-ipv6
```
**步骤2:在Web界面本地启动脚本中添加**
```bash
# NAS IPv6转发
(sleep 50 && /root/nas-ipv6) &
```
**步骤3:创建定时检查(可选)**
```bash
# 添加到crontab,每天凌晨3点重启一次转发
echo "0 3 * * * /root/nas-ipv6" >> /etc/crontabs/root
/etc/init.d/cron restart
```
## 验证是否生效
```bash
# 重启后检查
sleep 60
echo "检查端口转发:"
netstat -tln | grep -E ':(80|443|5666|3031)'
echo ""
echo "检查进程:"
ps | grep socat | grep -v grep
# 手动测试
curl -6 -I http://[你的路由器IPv6]:80 2>/dev/null | head -1
```
这样就没有日志文件占空间了,而且简单可靠。核心就是等待网络就绪后启动转发,不需要复杂的监控和日志。
我理解你想查看OpenWrt上的防火墙规则,特别是端口转发相关的配置。不过你提供的信息比较有限,我来帮你梳理如何查看和分析OpenWrt的防火墙规则:
明白了!你想看具体的socat转发规则配置。在OpenWrt上,socat和防火墙转发是两种不同的方式,让我分别解释:
## 1. **使用socat进行端口转发**
### 安装socat:
```bash
opkg update
opkg install socat
```
### socat转发配置示例:
```bash
# 基本格式:socat TCP-LISTEN:外部端口,fork,reuseaddr TCP:内网IP:内部端口
# 将WAN的8080端口转发到内网192.168.1.100的80端口
socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.100:80 &
# 将WAN的2222端口转发到内网192.168.1.101的22端口(SSH)
socat TCP-LISTEN:2222,fork,reuseaddr TCP:192.168.1.101:22 &
# UDP转发示例
socat UDP-LISTEN:5353,fork,reuseaddr UDP:192.168.1.100:53 &
# 保持运行(后台运行)
nohup socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.100:80 >/dev/null 2>&1 &
```
### 查看正在运行的socat进程:
```bash
# 查看所有socat进程
ps | grep socat
ps aux | grep socat
# 查看监听的端口
netstat -tlnp | grep socat
ss -tlnp | grep socat
# 查看具体的连接
lsof -i :8080
# 停止现有socat进程
killall socat
```
## 2. **防火墙端口转发规则**
### 查看现有的防火墙端口转发:
```bash
# 查看所有防火墙规则
iptables -t nat -L -n -v
# 重点查看PREROUTING链(端口转发)
iptables -t nat -L PREROUTING -n -v --line-numbers
# 查看FORWARD链
iptables -L FORWARD -n -v --line-numbers
# 查看INPUT链(入站规则)
iptables -L INPUT -n -v --line-numbers
```
### 防火墙配置文件中的转发规则:
```bash
# 查看所有redirect规则
uci show firewall | grep redirect
# 查看具体配置
cat /etc/config/firewall | grep -A 10 "config redirect"
# 或者使用更清晰的方式
for i in $(uci show firewall | grep "=redirect" | cut -d'.' -f2); do
echo "=== 规则: $i ==="
uci show firewall.$i
done
```
## 3. **两种方式的区别**
| 特性 | socat | 防火墙转发 |
|------|-------|-----------|
| **工作层级** | 应用层 (TCP/UDP) | 网络层 (IPtables) |
| **性能** | 较低 | 较高 |
| **稳定性** | 需保持进程运行 | 系统级别,更稳定 |
| **配置** | 命令行启动 | 配置文件/UCI |
| **重启保持** | 需要添加到启动脚本 | 配置文件自动加载 |
## 4. **查看具体的socat服务配置**
如果你的socat是通过服务方式运行的:
```bash
# 查看socat相关的服务
ls /etc/init.d/*socat* 2>/dev/null
ls /etc/rc.d/*socat* 2>/dev/null
# 查看启动脚本
find /etc -name "*socat*" -type f
# 查看进程的完整命令
ps aux | grep socat | grep -v grep
```
## 5. **我的建议**
**如果你主要想看:**
1. **socat转发**:
```bash
ps aux | grep "socat TCP-LISTEN\|socat UDP-LISTEN"
```
2. **防火墙转发**:
```bash
# 简洁版
iptables -t nat -L PREROUTING -n | grep -E "(dpt:|to:)"
# 详细版
iptables -t nat -L PREROUTING -n -v | grep -A 2 DNAT
```