V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nozer
V2EX  ›  程序员

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

  •  
  •   nozer · 2021-01-13 10:34:25 +08:00 · 9935 次点击
    这是一个创建于 1191 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    网络拓播

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

    第 1 条附言  ·  2021-01-13 13:34:18 +08:00
    主路由是华硕原厂固件,AsusWRT
    第 2 条附言  ·  2021-01-13 13:36:24 +08:00
    华硕固件自带 OPENVPN,就懒得折腾了,所以服务端没有放在 OpenWRT 上。 理论上也是可以的,只是我想知到是什么原因,导致无法访问 PC1
    第 3 条附言  ·  2021-01-13 14:07:24 +08:00
    OpenVPN 网段是:10.8.0.0/24
    第 4 条附言  ·  2021-01-13 14:08:48 +08:00
    能 ping 通,证明至少 icmp 报文来回是没有问题的, 其他基于 TCP 的的网络服务搞死不行。
    第 5 条附言  ·  2021-01-14 09:57:33 +08:00
    我抓了个 SSH 连接的包,各位有空的时候可以研究研究原因,我看的不是很明白。

    https://wws.lanzous.com/it2EWkdjmxc

    密码:1yiy
    第 6 条附言  ·  2021-01-14 09:59:01 +08:00
    我看了半天,三次握手大概是没毛病的。 但是 SSH say hello 的时候就不行了。
    44 条回复    2024-04-16 11:23:44 +08:00
    UnknownSky
        1
    UnknownSky  
       2021-01-13 11:14:10 +08:00 via Android
    你這 openvpn server 直接掛在 Openwrt 上不得了
    UnknownSky
        2
    UnknownSky  
       2021-01-13 11:15:24 +08:00 via Android
    主路由什麼系統,建 server 也要 iptables NAT 規則。
    zliea
        3
    zliea  
       2021-01-13 11:32:50 +08:00
    openvpn 服务端需要虚拟出一个网络,需要 iptables 指定 source 为改网络的转发到物理网卡上。
    iptables -t nat -A POSTROUTING -s x.x.x.x/x -o eth0 -j MASQURADE
    Jirajine
        4
    Jirajine  
       2021-01-13 11:41:23 +08:00 via Android
    你这配的乱七八糟,旁路由上开 masquerade 是要搞什么?
    盲猜 hairpin nat 的问题, 把 masquerade 去掉。
    nozer
        5
    nozer  
    OP
       2021-01-13 13:37:52 +08:00
    @Jirajine ? 我感觉线路很清晰啊,哪里乱了。
    nozer
        6
    nozer  
    OP
       2021-01-13 13:41:21 +08:00
    @Jirajine 去掉的话无法正常上网了,
    huangya
        7
    huangya  
       2021-01-13 13:56:40 +08:00
    openvpn client 虚拟网卡拿到的 IP 也是 192.168.2.0/24 网段吗?
    huangya
        8
    huangya  
       2021-01-13 14:00:22 +08:00
    另外,在 openvpn client 虚拟网卡上抓下 ssh 或者 web 服务至少有没有三次握手的包。
    nozer
        9
    nozer  
    OP
       2021-01-13 14:02:38 +08:00
    @huangya vpn client 的虚拟网卡网段是:10.8.0.0/24
    huangya
        10
    huangya  
       2021-01-13 14:10:19 +08:00
    @nozer
    在 PC1 上添加一条到 10.8.0.0/24 的静态路由.linux 下的命令:
    sudo route add -net 10.8.0.0/24 gw 192.168.2.1

    Windows 用管理员权限打开 cmd:
    route add mask 255.255.255.0 192.168.2.1
    huangya
        11
    huangya  
       2021-01-13 14:12:37 +08:00
    @huangya
    更正:
    Windows 用管理员权限打开 cmd:
    route add 10.8.0.0 mask 255.255.255.0 192.168.2.1
    nozer
        12
    nozer  
    OP
       2021-01-13 14:13:25 +08:00
    @huangya 谢谢我试试看。
    jasonyang9
        13
    jasonyang9  
       2021-01-13 14:15:38 +08:00
    瞎猜的,
    PC1 的默认网关是 192.168.2.2 旁路由,所以对 10.8.0.0/24 发来的数据包它不知道如何返回就走默认网关;
    旁路由收到后也不知道如何到 10.8.0.0/24,也走它的默认网关,192.168.2.1,且被 iptables 匹配到,做了 MASQ,也就是 SNAT,那么数据包的源地址就被替换为旁路由自己的 192.168.2.2 ;
    而请求数据包的目标地址是 192.168.2.10 ( PC1 ),响应却是从 192.168.2.2 收到,就被丢掉了。。。
    nozer
        14
    nozer  
    OP
       2021-01-13 14:19:58 +08:00
    @jasonyang9 我也有这种猜测,但是不知道怎么处理。 @huangya 的办法不错,我试试看应该能解决问题。

    但是如果能够在路由器上解决问题就更好了,那样就不用在 PC 上单独配置。
    huangya
        15
    huangya  
       2021-01-13 14:23:05 +08:00
    @jasonyang9 yes, I think so. 楼主可以用 wireshark 检查下 icmp 包和 tcp 包的源地址。所以我提供的方案是 vpn 网段直接走 192.168.2.1
    nozer
        16
    nozer  
    OP
       2021-01-13 14:23:06 +08:00
    或许如 @Jirajine 所说,去掉 MASQ 就可以了,但是去掉 MASQ 似乎会导致数据包在 192.168.2.2 上循环导致无法正常上网了。
    nozer
        17
    nozer  
    OP
       2021-01-13 14:23:36 +08:00
    @huangya 嗯嗯,我抓包看看。
    huangya
        18
    huangya  
       2021-01-13 14:31:38 +08:00
    @nozer

    >但是如果能够在路由器上解决问题就更好了,那样就不用在 PC 上单独配置。

    >或许如 @Jirajine 所说,去掉 MASQ 就可以了,但是去掉 MASQ 似乎会导致数据包在 192.168.2.2 上循环导致无法正常上网了。

    可以在 OpenWRT 上用如下命令试试看,这种方法或许也可以,这样就不需要在 PC 上单独配置静态路由了.
    iptables -I nat 1 -s 10.8.0.0/24 -j ACCEPT
    Lemeng
        19
    Lemeng  
       2021-01-13 14:33:41 +08:00
    抓包了解走向,走到哪步,哪步出了问题
    huangya
        20
    huangya  
       2021-01-13 14:35:44 +08:00
    @huangya @nozer
    最近总是打错命令

    >可以在 OpenWRT 上用如下命令试试看,这种方法或许也可以,这样就不需要在 PC 上单独配置静态路由了.
    >iptables -I nat 1 -s 10.8.0.0/24 -j ACCEPT

    ->
    iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -j ACCEPT
    Jirajine
        21
    Jirajine  
       2021-01-13 16:49:47 +08:00 via Android
    能 ping 通是因为 icmp 自带 redirect,不受 hairpin nat 的影响。
    去掉 masquerade 不能上网说明你配的有问题,检查防火墙和内核 ip 转发开了没。
    旁路由这种方式本来就是 ipv4 下的一种 trick,踩坑是很正常的,配成两级主干串起来才是正统方式。
    nozer
        22
    nozer  
    OP
       2021-01-14 11:03:02 +08:00
    @huangya 很感谢。PC 上设置静态路由可以解决问题。 但是路由器上设置 iptables 规则没什么效果。 抓包我也抓了下,但是水平有限研究不出来啥。
    huangya
        23
    huangya  
       2021-01-14 16:16:00 +08:00   ❤️ 3
    @nozer
    想了下,OpenWRT 上的这条命令还是有问题,当时脑抽了,改成以下估计就可以了。
    iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT
    nozer
        24
    nozer  
    OP
       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
        25
    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
        26
    nozer  
    OP
       2021-01-14 22:02:24 +08:00
    @huangya 太感谢了! 搞懂了,谢谢。
    WildCat
        27
    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
        28
    huangya  
       2021-04-15 18:23:03 +08:00
    @WildCat
    >国际网络无法走旁路由这个网关( 192.168.50.2 )
    1. 你是想 openvpn client 科学上网通过旁路由?
    2. 提供下 openvpn client 的网段
    liferecord
        29
    liferecord  
       2021-04-15 22:52:45 +08:00
    @nozer 我主路由也是华硕 ac66ub1,旁路由是 n1,主路开了华硕自带的 ddns 和 openvpn,也将您上面的规则写入 n1 的防火墙中,可依然没法通过 openvpn 在外科学上网,希望能从您这了解下具体设置。谢谢!
    huangya
        30
    huangya  
       2021-04-16 09:11:30 +08:00   ❤️ 1
    @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
        31
    liferecord  
       2021-04-16 09:18:54 +08:00
    感谢 @huangya 的指导,我主路由 IP 是 192.168.50.1,主路由设置的 openvpn server 网段是 10.8.0.0,现 主路由已经开启了 ddns 和 1194 端口转发
    huangya
        32
    huangya  
       2021-04-16 09:30:37 +08:00
    @liferecord
    那就先测试
    >如果你在 windows 和 linux 系统使用 openvpn 的 tap 模式,那就好比你的电脑在家中一样,这样只需要添加一条到旁路由的路由规则就可以科学上网了



    >旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。
    WildCat
        33
    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
        34
    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
        35
    liferecord  
       2021-04-16 14:28:36 +08:00
    @huangya 大佬,能否给个邮箱,我把我这的设置详细罗列下,麻烦您再指教下,谢谢!
    huangya
        36
    huangya  
       2021-04-16 14:46:07 +08:00
    @liferecord 可以,但是问题解决了,希望你回帖总结下方法到此帖,这样可以帮助更多人。邮箱是 G 家的,我的 ID 号加 90
    liferecord
        37
    liferecord  
       2021-04-16 22:43:25 +08:00
    @huangya ID 号加 90 是加前面还是后面?谢谢!我现在在尝试各种方法,现只有在旁路由端设置 softehter vpn 服务器后,再在手机等客户端上设置 ipsec 成功过(此时主路由网关指向旁路由,旁路由网关和 dns 都指向主路由)。现正在尝试主路由不设网关为旁路由 ip (也就是旁路由即使非人为断开也不影响主路由正常使用)
    huangya
        38
    huangya  
       2021-04-16 23:57:24 +08:00
    @liferecord 90 加在 ID 后面。
    WildCat
        39
    WildCat  
       2021-04-17 13:27:08 +08:00
    @huangya 感谢您的帮助。我打出来我的 log 了,也发到您邮箱了。十分抱歉做伸手党了(这块实在是不熟悉)。方便时也希望您能推荐一些学习资料。
    huangya
        40
    huangya  
       2021-04-17 19:25:09 +08:00   ❤️ 1
    @WildCat 已提供方法,查看邮件
    WildCat
        41
    WildCat  
       2021-05-09 09:54:57 +08:00
    特别感谢 @huangya 的帮助,太重要了!

    简单总结如下:

    1. 旁路由上要建立对应的 iptables 规则:旁路由 <-> 主路由,注意 MASQURADING 必须启用。关于这个选项: https://superuser.com/a/935988
    2. 旁路由上配置 OpenVPN 服务。需要注意的是 OpenWrt 的 web UI 不足以满足这个需求,建议 ssh 进去 vim 配置。参考配置如下(关键地方都加了注释): https://gist.github.com/imWildCat/f1b2e38215d967f365d86db6db900956
    3. 主路由上配置端口转发(上一步注释里有写)
    4. 主路由上配置 LAN static route,参考华硕: https://www.asus.com/uk/support/FAQ/1011706/ (这一步似乎可以省略,如果 (1) 奏效的话)

    附图 (1):
    yaow
        42
    yaow  
       2022-12-02 14:03:45 +08:00
    @WildCat 你好,请教一下,我现在也是 ikuai 主+op 旁的组网,想通过 openvpn 连接并且流量过一下 op 网关,问下你最后是采用了楼主提供的方案 2 实现的吗
    hs20073
        43
    hs20073  
       2 天前
    @huangya

    iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT

    和楼主情况完全一样,做了这个策略,openvpn client 还是无法访问 PC1 ,请教还会是什么原因呢

    其他策略如下
    iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    #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
    # ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
    # ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
    #iptables -I INPUT -p udp --destination-port 500 -j ACCEPT
    #iptables -I INPUT -p udp --destination-port 4500 -j ACCEPT
    #iptables -I INPUT -p udp --destination-port 1701 -j ACCEPT
    #iptables -I INPUT -p udp --dport 1194 -j ACCEPT
    #iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
    #iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
    #iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
    huangya
        44
    huangya  
       2 天前
    @hs20073
    执行 iptables -t nat -L -nv 把结果贴出来看看。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5436 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:09 · PVG 15:09 · LAX 00:09 · JFK 03:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.