家裡網路設定了旁路由後, OpenVPN 連進來,可以 ping,但是無法正常連線何故?

程式設計師 nozer • at 2021-01-13 12:05:47 • 4 Views

路由配置情況如圖,我希望 PC1 也能夠正常訪問:

網路拓播

有沒有懂的,指點指點,不知道如何下手。


主路由是華碩原廠韌體,AsusWRT
華碩韌體自帶 OPENVPN,就懶得折騰了,所以服務端沒有放在 OpenWRT 上。 理論上也是可以的,只是我想知到是什麼原因,導致無法訪問 PC1
OpenVPN 網段是:10.8.0.0/24
能 ping 通,證明至少 icmp 報文來回是沒有問題的, 其他基於 TCP 的的網路服務搞死不行。
我抓了個 SSH 連線的包,各位有空的時候可以研究研究原因,我看的不是很明白。

https://wws.lanzous.com/it2EWkdjmxc

密碼:1yiy
我看了半天,三次握手大概是沒毛病的。 但是 SSH say hello 的時候就不行了。
Total: 26
  • UnknownSky 2021-01-13 12:05:48
    你這 openvpn server 直接掛在 Openwrt 上不得了
  • UnknownSky 2021-01-13 12:05:48
    主路由什麼系統,建 server 也要 iptables NAT 規則。
  • ztechstack 2021-01-13 12:05:48
    openvpn 服務端需要虛擬出一個網路,需要 iptables 指定 source 為改網路的轉發到物理網絡卡上。
    iptables -t nat -A POSTROUTING -s x.x.x.x/x -o eth0 -j MASQURADE
  • Jirajine 2021-01-13 12:05:48
    你這配的亂七八糟,旁路由上開 masquerade 是要搞什麼?
    盲猜 hairpin nat 的問題, 把 masquerade 去掉。
  • nozer 2021-01-14 12:05:48
    @Jirajine ? 我感覺線路很清晰啊,哪裡亂了。
  • nozer 2021-01-14 12:05:48
    @Jirajine 去掉的話無法正常上網了,
  • huangya 2021-01-14 12:05:48
    openvpn client 虛擬網絡卡拿到的 IP 也是 192.168.2.0/24 網段嗎?
  • huangya 2021-01-14 12:05:48
    另外,在 openvpn client 虛擬網絡卡上抓下 ssh 或者 web 服務至少有沒有三次握手的包。
  • nozer 2021-01-14 12:05:48
    @huangya vpn client 的虛擬網絡卡網段是:10.8.0.0/24
  • huangya 2021-01-14 12:05:48
    @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 2021-01-14 12:05:48
    @huangya
    更正:
    Windows 用管理員許可權開啟 cmd:
    route add 10.8.0.0 mask 255.255.255.0 192.168.2.1
  • nozer 2021-01-14 12:05:48
    @huangya 謝謝我試試看。
  • jasonyang9 2021-01-14 12:05:48
    瞎猜的,
    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 2021-01-14 12:05:48
    @jasonyang9 我也有這種猜測,但是不知道怎麼處理。 @huangya 的辦法不錯,我試試看應該能解決問題。

    但是如果能夠在路由器上解決問題就更好了,那樣就不用在 PC 上單獨配置。
  • huangya 2021-01-14 12:05:48
    @jasonyang9 yes, I think so. 樓主可以用 wireshark 檢查下 icmp 包和 tcp 包的源地址。所以我提供的方案是 vpn 網段直接走 192.168.2.1
  • nozer 2021-01-14 12:05:48
    或許如 @Jirajine 所說,去掉 MASQ 就可以了,但是去掉 MASQ 似乎會導致資料包在 192.168.2.2 上迴圈導致無法正常上網了。
  • nozer 2021-01-14 12:05:48
    @huangya 嗯嗯,我抓包看看。
  • huangya 2021-01-14 12:05:48
    @nozer

    >但是如果能夠在路由器上解決問題就更好了,那樣就不用在 PC 上單獨配置。

    >或許如 @Jirajine 所說,去掉 MASQ 就可以了,但是去掉 MASQ 似乎會導致資料包在 192.168.2.2 上迴圈導致無法正常上網了。

    可以在 OpenWRT 上用如下命令試試看,這種方法或許也可以,這樣就不需要在 PC 上單獨配置靜態路由了.
    iptables -I nat 1 -s 10.8.0.0/24 -j ACCEPT
  • Lemeng 2021-01-14 12:05:48
    抓包瞭解走向,走到哪步,哪步出了問題
  • huangya 2021-01-14 12:05:48
    @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 2021-01-14 12:05:48
    能 ping 通是因為 icmp 自帶 redirect,不受 hairpin nat 的影響。
    去掉 masquerade 不能上網說明你配的有問題,檢查防火牆和核心 ip 轉發開了沒。
    旁路由這種方式本來就是 ipv4 下的一種 trick,踩坑是很正常的,配成兩級主幹串起來才是正統方式。
  • nozer 2021-01-14 12:05:48
    @huangya 很感謝。PC 上設定靜態路由可以解決問題。 但是路由器上設定 iptables 規則沒什麼效果。 抓包我也抓了下,但是水平有限研究不出來啥。
  • huangya 2021-01-15 12:05:48
    @nozer
    想了下,OpenWRT 上的這條命令還是有問題,當時腦抽了,改成以下估計就可以了。
    iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT
  • nozer 2021-01-15 12:05:48
    @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-15 12:05:48
    不會,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-15 12:05:48
    @huangya 太感謝了! 搞懂了,謝謝。
Add a reply
For Commenting you need to Login. If you dont have a Account you need to Register.