我的博客

分享技术与思想的点滴

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 ```