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

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

  •  
  •   nozer · 8 天前 · 1227 次点击

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

    网络拓播

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

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

    https://wws.lanzous.com/it2EWkdjmxc

    密码:1yiy
    第 6 条附言  ·  7 天前
    我看了半天,三次握手大概是没毛病的。 但是 SSH say hello 的时候就不行了。
    26 条回复    2021-01-14 22:02:24 +08:00
    UnknownSky
        1
    UnknownSky   8 天前 via Android
    你這 openvpn server 直接掛在 Openwrt 上不得了
    UnknownSky
        2
    UnknownSky   8 天前 via Android
    主路由什麼系統,建 server 也要 iptables NAT 規則。
    ztechstack
        3
    ztechstack   8 天前
    openvpn 服务端需要虚拟出一个网络,需要 iptables 指定 source 为改网络的转发到物理网卡上。
    iptables -t nat -A POSTROUTING -s x.x.x.x/x -o eth0 -j MASQURADE
    Jirajine
        4
    Jirajine   8 天前 via Android
    你这配的乱七八糟,旁路由上开 masquerade 是要搞什么?
    盲猜 hairpin nat 的问题, 把 masquerade 去掉。
    nozer
        5
    nozer   8 天前
    @Jirajine ? 我感觉线路很清晰啊,哪里乱了。
    nozer
        6
    nozer   8 天前
    @Jirajine 去掉的话无法正常上网了,
    huangya
        7
    huangya   8 天前
    openvpn client 虚拟网卡拿到的 IP 也是 192.168.2.0/24 网段吗?
    huangya
        8
    huangya   8 天前
    另外,在 openvpn client 虚拟网卡上抓下 ssh 或者 web 服务至少有没有三次握手的包。
    nozer
        9
    nozer   8 天前
    @huangya vpn client 的虚拟网卡网段是:10.8.0.0/24
    huangya
        10
    huangya   8 天前
    @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   8 天前
    @huangya
    更正:
    Windows 用管理员权限打开 cmd:
    route add 10.8.0.0 mask 255.255.255.0 192.168.2.1
    nozer
        12
    nozer   8 天前
    @huangya 谢谢我试试看。
    jasonyang9
        13
    jasonyang9   8 天前
    瞎猜的,
    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   8 天前
    @jasonyang9 我也有这种猜测,但是不知道怎么处理。 @huangya 的办法不错,我试试看应该能解决问题。

    但是如果能够在路由器上解决问题就更好了,那样就不用在 PC 上单独配置。
    huangya
        15
    huangya   8 天前
    @jasonyang9 yes, I think so. 楼主可以用 wireshark 检查下 icmp 包和 tcp 包的源地址。所以我提供的方案是 vpn 网段直接走 192.168.2.1
    nozer
        16
    nozer   8 天前
    或许如 @Jirajine 所说,去掉 MASQ 就可以了,但是去掉 MASQ 似乎会导致数据包在 192.168.2.2 上循环导致无法正常上网了。
    nozer
        17
    nozer   8 天前
    @huangya 嗯嗯,我抓包看看。
    huangya
        18
    huangya   8 天前
    @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   8 天前
    抓包了解走向,走到哪步,哪步出了问题
    huangya
        20
    huangya   8 天前
    @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   8 天前 via Android
    能 ping 通是因为 icmp 自带 redirect,不受 hairpin nat 的影响。
    去掉 masquerade 不能上网说明你配的有问题,检查防火墙和内核 ip 转发开了没。
    旁路由这种方式本来就是 ipv4 下的一种 trick,踩坑是很正常的,配成两级主干串起来才是正统方式。
    nozer
        22
    nozer   7 天前
    @huangya 很感谢。PC 上设置静态路由可以解决问题。 但是路由器上设置 iptables 规则没什么效果。 抓包我也抓了下,但是水平有限研究不出来啥。
    huangya
        23
    huangya   7 天前   ❤️ 1
    @nozer
    想了下,OpenWRT 上的这条命令还是有问题,当时脑抽了,改成以下估计就可以了。
    iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT
    nozer
        24
    nozer   7 天前
    @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   7 天前
    不会,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   7 天前
    @huangya 太感谢了! 搞懂了,谢谢。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1172 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:40 · PVG 05:40 · LAX 13:40 · JFK 16:40
    ♥ Do have faith in what you're doing.