V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lry
V2EX  ›  服务器

OpenVPN 客户机怎么访问主机 NAT 后面的虚拟服务器

  •  
  •   lry · 67 天前 · 1401 次点击
    这是一个创建于 67 天前的主题,其中的信息可能已经有所发展或是发生改变。

    路由器直接分配的网段是 192.168.0.0/24

    主机 192.168.0.108 安装了几台 Vmware 虚拟机,网络模式为 NAT 虚拟机网段为 192.168.204.0/24 (主机 192.168.204.1,虚拟机 192.168.204.10-20 )

    现在怎么才能让主机同路由器下的其他客户机(假设 192.168.0.107 )可以访问主机服务器上的虚拟机

    我在主机上安装了 OpenVPN 服务器,主机中的虚拟机中可以 telnet 连上客户机,但是客户机只能脸上主机,连不上主机上的虚拟机

    photo_2021-02-07_12-37-26.jpg

    附上 server.ovpn 和 client.ovpn

    port 1194
    proto udp
    dev tun
    
    ca ca.crt
    cert server.crt
    key server.key
    dh dh2048.pem
    
    server 10.8.0.0 255.255.255.0
    
    ifconfig-pool-persist ipp.txt
    
    push "route 192.168.204.0 255.255.255.0"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 114.114.114.114"
    
    keepalive 10 120
    cipher AES-256-CBC
    
    persist-key
    persist-tun
    
    status openvpn-status.log
    log-append  openvpn.log
    verb 3
    explicit-exit-notify 1
    
    client
    
    dev tun
    proto udp
    
    remote 192.168.0.108 1194
    
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    
    ca ca.crt
    cert client.crt
    key client.key
    
    cipher AES-256-CBC
    
    verb 3
    
    27 条回复    2021-02-09 00:40:56 +08:00
    UnknownSky
        1
    UnknownSky   67 天前 via Android
    正好前段時間有這方面的研究,給個參考鏈接,實測有用。Iptables 就解決了。
    UnknownSky
        2
    UnknownSky   67 天前 via Android
    你的意思就是說 Openvpn clients 暴露出來嘛
    UnknownSky
        5
    UnknownSky   67 天前 via Android
    還有個方法,編譯 FullconeNAT Kernel module,和 iptables,直接實現 server Fullcone
    lry
        6
    lry   67 天前
    @UnknownSky 我的目的是让 NAT 后面的虚拟机暴漏出来,这样同局域网下的其他机器可以连上去。
    lry
        7
    lry   67 天前
    @UnknownSky 端口转发可以,但是这样就得为每一台虚拟机配置一个端口转发了,我觉得用 OpenVPN 也可以实现这个效果,而且不用记住虚拟机配置的端口转发,直接使用虚拟机 ip 。(谁要连主机上的虚拟机,就直接装个 OpenVPN 的客户端,但是我这配置好像有问题,连不上)
    XiaoxiaoPu
        8
    XiaoxiaoPu   67 天前
    在主机上抓包看看。
    看你的 server 配置,把虚拟机所在网络的路由推送给了客户端,那么客户端到虚拟机的包应该会正确的发给主机,那问题应该就是主机没有转发给虚拟机,或者虚拟机的响应没有转发给客户端。猜测可能跟 VMware 的 NAT 模式下的网络限制有关(比如防火墙等)。所以先定位下具体哪里没走下去吧。
    XiaoxiaoPu
        9
    XiaoxiaoPu   67 天前
    另外有个疑问,如你所说,客户端和服务端在一个路由器下,已经在一个子网里了,就应该不需要再连 vpn 了,连 vpn 的需求是啥?
    lry
        10
    lry   67 天前
    @XiaoxiaoPu 客户端可以直接连服务端没问题,但是服务端上的虚拟机用的 NAT 模式(装的时候未选择桥接模式),客户端和虚拟机不在同一个网段。
    JmmBite
        11
    JmmBite   67 天前
    先理解什么是 NAT:
    局域网访问互联网,经过 NAT 转换肯定没问题,
    那你认为互联网主机可以逆向访问局域网主机吗?肯定不行。
    如果要实现,那就还需要 外网到内网的 入口 NAT ;
    XiaoxiaoPu
        12
    XiaoxiaoPu   67 天前
    @lry 所谓的网段,影响的无非就是路由。在客户端上加一条 "192.168.204.0/24 via 192.168.0.108 dev eth0" 这样的路由,也能让客户端就知道发给虚拟机的包要交给主机来转发。

    不过这两种方法都是可行的,都能实现让主机作为通信的中转节点。问题关键还是 VMware 的 NAT 是否有防火墙策略。分步排查吧:客户端 -> 主机 -> 虚拟机 -> (回应) -> 主机 -> 客户端,看看链路在哪一步断掉了。
    JmmBite
        13
    JmmBite   67 天前
    所谓 NAT 就是通过软件把主机当路由器,NAT 后面的虚拟机网络就是一个小型局域网。
    所谓 桥接 就是通过软件把主机当成交换机,虚拟机直接暴露给外网。

    如果是双向 NAT (路由转发),那就是 桥接(交换机)的功能了。
    cdlnls
        14
    cdlnls   67 天前 via Android
    如果跨 IP 网段,数据包就需要先把数据包转发给网关(路由器),然后由路由器判断下一跳去哪。所以你要在路由器上检查一下发往虚拟机的包发去哪里了,(一般路由器默认只有一个指向 wan 口的默认路由,不会有 vmware 定义的路由,所以数据包就直接从默认的 wan 口发走了)

    你可以在路由器再加一个路由指向 vmware 的虚拟机,将发往虚拟机网段的数据包先转发给 vmware 。

    最后在 vmware 上再转发给虚拟机。
    cdlnls
        15
    cdlnls   67 天前 via Android
    现在就是不确定的是,vmware 能不能把包正常转发给内部的虚拟机,这个没验证过。

    我自己测试过 kvm 的 router 网络,是可以访问的虚拟机的。kvm 的 router 网络和 nat 应该差不太多。
    lry
        16
    lry   67 天前
    @XiaoxiaoPu
    @cdlnls 我撤去了 OpenVPN,直接在客户机上面加了一条静态路由 `sudo route -n add -net 192.168.204.0 -netmask 255.255.255.0 192.168.0.108`,同时抓包服务器上的以太网卡和 Vmware 的 nat 网卡,发现客户机 telnet 虚拟机的 tcp 包第一次握手就收不到 ack,但是 虚拟机 telnet 客户机的包连接正常。这种一般会是什么问题

    图 1: 192.168.0.107 --> 192.168.204.10
    https://i.loli.net/2021/02/07/UrbXvO9En2764lH.png
    图 2: 192.168.204.10 --> 192.168.0.107
    https://i.loli.net/2021/02/07/zIPnVkiY2758THE.png
    cdlnls
        17
    cdlnls   67 天前 via Android
    @lry 看看客户机的路由表,和对应的虚拟的网络接口。
    你这个不应该是这样加的,可能要指定一下接口
    XiaoxiaoPu
        18
    XiaoxiaoPu   67 天前
    客户机加的路由应该要指定网卡的。我一般用 ip 命令,不用 route 命令,这样试试 “sudo ip route replace 192.168.204.0/24 via 192.168.0.108 dev eth0”。eth0 是客户机的网卡名称,如果不是 eth0 需要替换下。然后可以在客户机上执行“sudo ip route show” 看下当前路由是否符合预期。


    主机的防火墙策略也看一下,在主机上执行 “sudo iptables-save” 查看。
    ourgoder
        19
    ourgoder   67 天前
    我也类似 25,很多也不动
    lry
        20
    lry   67 天前
    @cdlnls @ourgoder 我这边客户机是 MacOS,主机是 Win10,虚拟机才是 Debian
    贴了下客户机上面的路由,感觉这个路由没有问题 😂
    https://paste.ubuntu.com/p/FxNdJV2n3X/
    XiaoxiaoPu
        21
    XiaoxiaoPu   67 天前
    windows 啊,那不了解了。

    干脆一把梭吧,客户端跟虚拟机都连 vpn 里,通过 vpn 的网段通信 = =
    ourgoder
        22
    ourgoder   66 天前
    @lry #20 我试试哦
    fzinfz
        23
    fzinfz   65 天前
    vmware 改 bridge 模式

    https://docs.vmware.com/en/VMware-Workstation-Pro/16.0/com.vmware.ws.using.doc/GUID-3B504F2F-7A0B-415F-AE01-62363A95D052.html

    With NAT, the virtual machine and the host system share a single network identity that is not visible outside the network.
    fzinfz
        24
    fzinfz   65 天前
    收回#23 回复,貌似 NAT 支持 Port Forwarding: (多年未用 VMware-Workstation,仅纸上谈兵,逃~ )

    https://docs.vmware.com/en/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-E146C894-664C-479A-9E19-484400614BED.html
    lry
        25
    lry   65 天前
    @cdlnls @XiaoxiaoPu
    这个问题解决了。如果 openvpn 用的路由模式 (dev tun),需要 win10 服务器上开启端口转发,并且在虚拟机里面添加一条静态路由( route add -net 10.8.0.0/24 gw 192.168.204.1 )
    或者使用 openvpn 的桥接模式( dev tap ),将 openvpn 的 Tap-Windows Adapter V9 虚拟网卡和 VMware 的 Vment8 NAT 虚拟网卡桥接下
    lry
        26
    lry   65 天前
    @lry #25 说错了,应该叫路由转发。https://www.jianshu.com/p/3d5ada946a31
    lry
        27
    lry   65 天前
    @fzinfz 是的,这个可以,综上所述,我觉得还是 openvpn 的桥接模式方便点,不需要一个个配置
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3510 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 08:25 · PVG 16:25 · LAX 01:25 · JFK 04:25
    ♥ Do have faith in what you're doing.