仅限除特定端口外的所有 VPN 流量

仅限除特定端口外的所有 VPN 流量

我的网络上有一个设备只能通过 VPN 连接到外部世界。我使用具有两个 VLAN 的 OpenWRT 路由器:

192.168.2.X: All devices including the one in question
192.168.3.X: Isolated server

我已经像这样设置了 iptables 来实现我的目标。一切正常。

#Whitelist server
iptables -I FORWARD 2 -m mac --mac-source 00:11:22:33:44:55 -d 192.168.3.2 -j ACCEPT                                                                                                  
#Whitelist VPN connection
iptables -I FORWARD 3 -m mac --mac-source 00:11:22:33:44:55 -d <PUBLIC VPN IP> -j ACCEPT
#Allow incoming OpenVPN connection
iptables -I FORWARD 4 -m mac --mac-source 00:11:22:33:44:55 -d 10.1.1.0/24 -j ACCEPT
#Block everything else
iptables -I FORWARD 5 -m mac --mac-source 00:11:22:33:44:55 -j DROP 

但是,我现在在这台机器 (Synology NAS) 上有一个服务,我想从我的网络外部访问它。使用内置在 GUI 中的反向代理,我可以从内部网络顺利访问它。我从外部世界收到“页面未找到”错误。(服务在端口 3000 上运行。Nginx 反向代理运行完美)。

tcpdump在 NAS 上运行它来查看它在内部网络和外部网络上的样子。

tcpdump -i eth0 host 192.168.2.10 and port 80 -n -s 0 -vvv

内部网络示例

看起来来回沟通都很好?无论如何,页面加载正常,我可以像预期的那样进行交互。一切都很好。

10:44:35.263734 IP (tos 0x0, ttl 64, id 22203, offset 0, flags [DF], proto TCP (6), length 483)
    192.168.2.10.80 > 192.168.2.229.46437: Flags [P.], cksum 0x8815 (incorrect -> 0x6d5b), seq 14449:14880, ack 2109, win 147, options [nop,nop,TS val 44852638 ecr 33125692], length 431
10:44:35.263971 IP (tos 0x0, ttl 64, id 22204, offset 0, flags [DF], proto TCP (6), length 57)
    192.168.2.10.80 > 192.168.2.229.46437: Flags [P.], cksum 0x866b (incorrect -> 0x2281), seq 14880:14885, ack 2109, win 147, options [nop,nop,TS val 44852638 ecr 33125692], length 5
10:44:35.266280 IP (tos 0x0, ttl 64, id 27016, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.2.229.46437 > 192.168.2.10.80: Flags [.], cksum 0x655d (correct), seq 2109, ack 14880, win 475, options [nop,nop,TS val 33125695 ecr 44852638], length 0
10:44:35.266351 IP (tos 0x0, ttl 64, id 27017, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.2.229.46437 > 192.168.2.10.80: Flags [.], cksum 0x6558 (correct), seq 2109, ack 14885, win 475, options [nop,nop,TS val 33125695 ecr 44852638], length 0

外部网络示例

请求到达 NAS,但 NAS 似乎从未响应(虽然这只是一个小样本,但我从未见过本地 IP 对公共 IP 做出响应)

10:47:44.549577 IP (tos 0x0, ttl 50, id 6216, offset 0, flags [DF], proto TCP (6), length 60)
    <PUBLIC IP>.33821 > 192.168.2.10.80: Flags [S], cksum 0xd80e (correct), seq 1643727695, win 65535, options [mss 1400,sackOK,TS val 33182471 ecr 0,nop,wscale 8], length 0
10:47:44.549648 IP (tos 0x0, ttl 50, id 49426, offset 0, flags [DF], proto TCP (6), length 60)
    <PUBLIC IP>.32694 > 192.168.2.10.80: Flags [S], cksum 0x2b29 (correct), seq 3430912533, win 65535, options [mss 1400,sackOK,TS val 33182471 ecr 0,nop,wscale 8], length 0
10:47:44.549726 IP (tos 0x0, ttl 50, id 17073, offset 0, flags [DF], proto TCP (6), length 60)
    <PUBLIC IP>.53751 > 192.168.2.10.80: Flags [S], cksum 0x9568 (correct), seq 2421821881, win 65535, options [mss 1400,sackOK,TS val 33182472 ecr 0,nop,wscale 8], length 0
10:47:44.556677 IP (tos 0x0, ttl 50, id 45509, offset 0, flags [DF], proto TCP (6), length 60)
    <PUBLIC IP>.62353 > 192.168.2.10.80: Flags [S], cksum 0xefcb (correct), seq 1128850125, win 65535, options [mss 1400,sackOK,TS val 33182472 ecr 0,nop,wscale 8], length 0

因此,我尝试创建一条规则,该规则仅在路由器上的防火墙阻止传出请求时才进行记录(NAS 防火墙始终处于禁用状态)。但日志中没有任何内容。所以我猜我的规则设置不正确:

iptables -I FORWARD 1 -m mac --mac-source 00:11:22:33:44:55 -p tcp --sport 80 -j LOG --log-prefix "Blocked: " --log-level 7

除存在 http 请求的特殊情况外,是否可以强制所有传出的 WAN 流量通过 VPN?当 HTTP 请求从外部世界传入并转发到命中 nginx 反向代理的 NAS 时,将允许其响应。

或者说这根本就是错误的方法?

相关内容