家里网络设置了旁路由后, OpenVPN 连进来,可以 ping,但是无法正常连接何故?

2021-01-13 10:34:25 +08:00
 nozer

路由配置情况如图,我希望 PC1 也能够正常访问:

有没有懂的,指点指点,不知道如何下手。

11083 次点击
所在节点    程序员
51 条回复
Jirajine
2021-01-13 16:49:47 +08:00
能 ping 通是因为 icmp 自带 redirect,不受 hairpin nat 的影响。
去掉 masquerade 不能上网说明你配的有问题,检查防火墙和内核 ip 转发开了没。
旁路由这种方式本来就是 ipv4 下的一种 trick,踩坑是很正常的,配成两级主干串起来才是正统方式。
nozer
2021-01-14 11:03:02 +08:00
@huangya 很感谢。PC 上设置静态路由可以解决问题。 但是路由器上设置 iptables 规则没什么效果。 抓包我也抓了下,但是水平有限研究不出来啥。
huangya
2021-01-14 16:16:00 +08:00
@nozer
想了下,OpenWRT 上的这条命令还是有问题,当时脑抽了,改成以下估计就可以了。
iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT
nozer
2021-01-14 17:31:09 +08:00
@huangya 真的可以了,问题解决。原因应该是跟前面的猜测一致,但是我想请教下,现在的规则是这样的:
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -I POSTROUTING -j MASQUERADE
iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT


就是说,发送到 10.8.0.0/24 的包采用的动作是 ACCEPT,但是这里并没有 return,为何就可以产生效果呢?
iptables 规则的匹配不是从前到后依次匹配,除非无法匹配,或者 return 才会终止匹配后面的规则。

这个地方,ACCEPT 后,并没有 return,那不是最后还是会匹配到 MASQUERADE 上去,导致数据包源地址发生改变?
huangya
2021-01-14 18:07:46 +08:00
不会,ACCEPT 后这个包就在 chain POSTROURING 不会继续跑了,不会到下一条 rule MASQUERADE 中.
ACCEPT 与 RETURN 的区别可以看:

https://ipset.netfilter.org/iptables.man.html#:~:text=ACCEPT%20means%20to%20let%20the,the%20previous%20(calling)%20chain.

>ACCEPT means to let the packet through. DROP means to drop the packet on the floor. RETURN means stop traversing this chain and resume at the next rule in the previous (calling) chain. If the end of a built-in chain is reached or a rule in a built-in chain with target RETURN is matched, the target specified by the chain policy determines the fate of the packet.

关键点有两个:
1.RETRUN 是返回到 calling chain.然后继续匹配下一条 rule.
2.ACCEPT 是直接接受了(在 build-in chain 或者子 chain ),那 build-in chain 和 build-in chain call 的子 chain 中的 rule 都不会匹配了。

另,调试 iptables 可以用-j LOG 看包是如何跑的。
nozer
2021-01-14 22:02:24 +08:00
@huangya 太感谢了! 搞懂了,谢谢。
WildCat
2021-04-15 15:00:37 +08:00
@huangya 感谢您的分享!

我也在尝试类似的方案,主路由华硕,旁路由 OpenWrt 。
目前的问题是可以连接内网和国内网络,国际网络无法走旁路由这个网关( 192.168.50.2 )。

我在 OpenVPN 配置里新增了:
push "route 192.168.50.0 255.255.255.0 192.168.50.2"
push "route 0.0.0.0 255.255.255.0 192.168.50.2"
但是似乎在客户端上没作用。看 log 是可以生效的。

不知有什么见解?调试这个问题不知如何入门?(个人不太熟悉网络)
huangya
2021-04-15 18:23:03 +08:00
@WildCat
>国际网络无法走旁路由这个网关( 192.168.50.2 )
1. 你是想 openvpn client 科学上网通过旁路由?
2. 提供下 openvpn client 的网段
liferecord
2021-04-15 22:52:45 +08:00
@nozer 我主路由也是华硕 ac66ub1,旁路由是 n1,主路开了华硕自带的 ddns 和 openvpn,也将您上面的规则写入 n1 的防火墙中,可依然没法通过 openvpn 在外科学上网,希望能从您这了解下具体设置。谢谢!
huangya
2021-04-16 09:11:30 +08:00
@liferecord 这个问题比较复杂,首先要理解 openvpn 有两种模式,叫做 tap 和 tun 模式。其中 tap 模式是二层的,tun 模式是三层的。什么意思呢? tap 模式下你可以拿到的 IP 地址与你路由器是同一个网段的。假设你的路由器的网段是 192.168.1.0/24, 那么你拿到的 ip 地址就属于这个网段,比如 192.168.1.10. tun 模式拿到的不是同一个网段,是另外一个网段,比如 10.8.0.0/24 (以下以这个网段举例). windows 系统和 linux 系统(苹果 PC 系统不知)都支持两种模式,但在 Android 和 iOS 系统上,只支持 tun 模式。这个模式可以由配置文件决定,打开配置文件,如果你看到有“dev tap", 就表示使用 tap 模式。如果是"dev tun", 就表示 tun 模式。

如果你在 windows 和 linux 系统使用 openvpn 的 tap 模式,那就好比你的电脑在家中一样,这样只需要添加一条到旁路由的路由规则就可以科学上网了。

但是如果你用的是 Android 和 iOS 系统,那就比较复杂了。因为 openvpn client 拿到的地址与你的旁路由不在同一个网段。你在 openvpn client 这端是没办法添加路由规则的。*路由规则中的网关必须要与 openvpn client 在同一个网段*。那这个问题怎么解决呢? 1. 在华硕路由器这边做策略路由,通过在防火墙中打 mark 的方式,让来自于 10.8.0.0 的网段的包走旁路由。这个比较复杂,也不推荐。因为华硕路由器相当于一个黑盒。你的配置可能在有些情况下(比如重开机和重连)被覆盖掉。2. 在旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。
liferecord
2021-04-16 09:18:54 +08:00
感谢 @huangya 的指导,我主路由 IP 是 192.168.50.1,主路由设置的 openvpn server 网段是 10.8.0.0,现 主路由已经开启了 ddns 和 1194 端口转发
huangya
2021-04-16 09:30:37 +08:00
@liferecord
那就先测试
>如果你在 windows 和 linux 系统使用 openvpn 的 tap 模式,那就好比你的电脑在家中一样,这样只需要添加一条到旁路由的路由规则就可以科学上网了



>旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。
WildCat
2021-04-16 10:58:54 +08:00
@huangya

1. 是的
2. 10.8.0.0 255.255.255.0

旁路由也是否需要连接进 OpenVPN 子网?

> 在旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。

我也有尝试这个,但是似乎无法访问华硕路由器的子网 (192.168.50.x 255.255.255.0)
huangya
2021-04-16 11:15:41 +08:00
@WildCat
>我也有尝试这个,但是似乎无法访问华硕路由器的子网 (192.168.50.x 255.255.255.0)
1.首先确定采用这种方法你是否可以科学上网
2.在解决能科学上网之后,关于无法访问华硕路由器的子网问题,你把以下命令的结果发给我,结果如有科学上网的 IP 地址,你可以用”科学上网 IP 地址“代替,以保护隐私。然后我再给你一些命令来解决这个问题。
iptables -L-nv
iptables -t mangle -L -nv
iptables -t nat -L -nv
liferecord
2021-04-16 14:28:36 +08:00
@huangya 大佬,能否给个邮箱,我把我这的设置详细罗列下,麻烦您再指教下,谢谢!
huangya
2021-04-16 14:46:07 +08:00
@liferecord 可以,但是问题解决了,希望你回帖总结下方法到此帖,这样可以帮助更多人。邮箱是 G 家的,我的 ID 号加 90
liferecord
2021-04-16 22:43:25 +08:00
@huangya ID 号加 90 是加前面还是后面?谢谢!我现在在尝试各种方法,现只有在旁路由端设置 softehter vpn 服务器后,再在手机等客户端上设置 ipsec 成功过(此时主路由网关指向旁路由,旁路由网关和 dns 都指向主路由)。现正在尝试主路由不设网关为旁路由 ip (也就是旁路由即使非人为断开也不影响主路由正常使用)
huangya
2021-04-16 23:57:24 +08:00
@liferecord 90 加在 ID 后面。
WildCat
2021-04-17 13:27:08 +08:00
@huangya 感谢您的帮助。我打出来我的 log 了,也发到您邮箱了。十分抱歉做伸手党了(这块实在是不熟悉)。方便时也希望您能推荐一些学习资料。
huangya
2021-04-17 19:25:09 +08:00
@WildCat 已提供方法,查看邮件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744450

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX