FreshTomato 2021.2(R7000)下OpenVPN客户端内端口转发至LAN服务器的配置故障排查请求
FreshTomato 2021.2(R7000)下OpenVPN客户端内端口转发至LAN服务器的配置故障排查请求
看起来你卡在了OpenVPN客户端隧道内端口转发到LAN服务器的问题上,我结合你给出的iptables规则和现象帮你分析下问题点,再给出具体的解决步骤:
首先先把你当前的iptables规则整理出来方便查看:
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N shlimit -N upnp -N wanin -N wanout -A INPUT -i tun21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -m state --state INVALID -j DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j shlimit -A INPUT -i lo -j ACCEPT -A INPUT -i br0 -j ACCEPT -A FORWARD -i tun11 -m state --state NEW -j wanin -A FORWARD -i tun21 -j ACCEPT -A FORWARD -o tun11 -j ACCEPT -A FORWARD -m account --aaddr 21.9.12.0/255.255.255.0 --aname lan -A FORWARD -i br0 -o br0 -j ACCEPT -A FORWARD -m state --state INVALID -j DROP -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i vlan2 -j wanin -A FORWARD -o vlan2 -j wanout -A FORWARD -i vlan3 -j wanin -A FORWARD -o vlan3 -j wanout -A FORWARD -i br0 -j ACCEPT -A FORWARD -i vlan2 -j upnp -A shlimit -m recent --set --name shlimit --mask 255.255.255.255 --rsource -A shlimit -m recent --update --seconds 60 --hitcount 4 --name shlimit --mask 255.255.255.255 --rsource -j DROP -A upnp -d 21.9.12.153/32 -p udp -m udp --dport 9308 -j ACCEPT -A upnp -d 21.9.12.153/32 -p udp -m udp --dport 9305 -j ACCEPT -A upnp -d 21.9.12.92/32 -p udp -m udp --dport 59319 -j ACCEPT -A wanin -d 21.9.12.211/32 -p tcp -m tcp --dport 80 -j ACCEPT -A wanin -d 21.9.12.211/32 -p udp -m udp --dport 80 -j ACCEPT -A wanin -d 21.9.12.211/32 -p tcp -m tcp --dport 443 -j ACCEPT -A wanin -d 21.9.12.211/32 -p udp -m udp --dport 443 -j ACCEPT -A wanin -d 21.9.12.211/32 -p tcp -m tcp --dport 64246 -j ACCEPT -A wanin -d 21.9.12.211/32 -p udp -m udp --dport 64246 -j ACCEPT
核心问题分析
你当前的配置有两个关键缺失:
- 缺少DNAT(目标地址转换)规则:wanin链只是允许了到21.9.12.211的80/443流量转发,但没有把VPN公网IP(172.94..*)的80/443请求转换到LAN服务器的IP上——这是端口转发的核心步骤,没有DNAT,外部请求的目标还是VPN公网IP,路由器不知道要把它发给LAN服务器。
- 回程路由不匹配:你提到telnet能连上但HTTP请求发送后就断开,这典型是单向连通问题——客户端发的SYN包能到服务器,但服务器的SYN-ACK回程流量没走OpenVPN隧道,而是走了默认的WAN口,导致客户端收不到回复,最终连接断开。
具体解决步骤
1. 添加DNAT规则(端口转发核心)
需要在nat表的PREROUTING链添加规则,把tun11接口进来的80/443请求转发到LAN服务器:
# 转发TCP 80到LAN服务器 iptables -t nat -A PREROUTING -i tun11 -p tcp --dport 80 -j DNAT --to-destination 21.9.12.211:80 # 转发TCP 443到LAN服务器 iptables -t nat -A PREROUTING -i tun11 -p tcp --dport 443 -j DNAT --to-destination 21.9.12.211:443
注:你之前的wanin里加了UDP的80/443规则,一般HTTP/HTTPS不需要UDP,如果你没特殊需求可以忽略UDP部分。
2. 配置回程路由(解决单向连通)
需要让LAN服务器21.9.12.211的回程流量通过tun11隧道返回,有两种方式:
- 命令行临时配置:
先查看tun11的网关IP(可以用ifconfig tun11查看,一般是隧道的远端IP),然后添加策略路由:# 让来自21.9.12.211的流量使用表100路由 ip rule add from 21.9.12.211 table 100 # 给表100添加默认路由,指向tun11的网关 ip route add default via <tun11网关IP> table 100 - FreshTomato Web界面配置(永久生效):
进入OpenVPN客户端设置页面,找到「Redirect Internet traffic」选项,选择「Policy Rules (strict)」,然后添加一条规则:- 源IP:21.9.12.211
- 目标:Any
- 动作:通过此VPN客户端
3. 验证配置
- 执行
iptables -t nat -L PREROUTING -v查看DNAT规则是否已经生效,能看到对应规则的数据包计数。 - 从外部再次测试HTTP/HTTPS访问,同时可以在路由器上抓tun11接口的流量,确认请求到达服务器,且回程流量通过tun11返回。
额外检查点
- 确认LAN服务器21.9.12.211的防火墙没有阻止来自tun11段的80/443请求。
- 确认OpenVPN客户端的配置里没有禁用端口转发相关的选项(比如
client-to-client等,不过FreshTomato默认应该是允许的)。
备注:内容来源于stack exchange,提问作者smallfrenchy




