VMware TCP 端口映射不起作用 - 无法通过公共 IP 地址访问端口

VMware TCP 端口映射不起作用 - 无法通过公共 IP 地址访问端口

简单来说,转发的端口 45922 在主机上可以通过 127.0.0.1:45922 访问,但在主办本身通过其公网IP加端口45922进行访问,具体如下。


主机操作系统:Ubuntu 14.04.2 LTS
客户机操作系统:CentOS 6.6 (最终版)
虚拟机:VMware Player 7

使用以下命令在终端中启动VM:

vmrun -T player start vmware/CentOS/CentOS.vmx nogui

主机有一个公共 IP 地址,即 128.xx221;
客户机有两个网络适配器,一个是桥接的,有一个公共 IP 地址,即 128.xx219;另一个以 NAT 模式工作,有一个本地 IP 地址,即 192.168.106.129。

主机配置文件的内容/etc/vmware/vmnet8/nat/nat.conf

45922 = 192.168.106.129:22
45911 = 192.168.106.129:5911

第一个端口转发用于 SSH,第二个用于 VNC。基本上它们都存在同样的问题,所以我想在这里把它们放在一起。


观察到的问题:

  1. 在 CentOS 客户机上:
    ssh 127.0.0.1在职的
    SSH 192.168.106.129在职的

  2. 在 Ubuntu 主机上:
    ssh 192.168.106.129在职的
    ssh -p 45922 127.0.0.1在职的
    ssh -p 45922 128.xx221不工作

  3. 从随机公共机器:
    ssh -p 45922 128.xx221不工作


但与此同时,桥接网络工作正常。从随机公共机器:
ssh 128.xx219在职的

主机和客户机均未启用防火墙。iptables -L返回空列表。

这似乎不是网关防火墙的问题,因为主机打开了另一个端口 45940,并且可以从随机公共机器访问。


附加信息

netstat在主机上运行:

$ netstat -ano | grep 459 
tcp        0      0 0.0.0.0:45911           0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 0.0.0.0:45922           0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 0.0.0.0:45940           0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp6       0      0 :::45940                :::*                    LISTEN      off (0.00/0/0)
udp        0      0 0.0.0.0:45932           0.0.0.0:*                           off (0.00/0/0)

当我在主机本身上运行tcpdump port 45922时,在主机上运行时不会捕获任何数据包ssh -p 45922 128.x.x.221

ssh -vvv -p 45922 128.x.x.221在随机机器上运行输出如下内容:

OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to 128.x.x.221 [128.x.x.221] port 45922.
debug1: Connection established.
debug1: identity file /home/x/.ssh/id_rsa type -1
debug1: identity file /home/x/.ssh/id_rsa-cert type -1
debug1: identity file /home/x/.ssh/id_dsa type -1
debug1: identity file /home/x/.ssh/id_dsa-cert type -1
debug1: identity file /home/x/.ssh/id_ecdsa type -1
debug1: identity file /home/x/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/x/.ssh/id_ed25519 type -1
debug1: identity file /home/x/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
ssh_exchange_identification: read: Connection reset by peer

tcpdump port 45922 -vv当我尝试从公共网络上的随机机器连接到客户机时,在主机上运行会输出以下信息:

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:56:56.942537 IP (tos 0x0, ttl 60, id 64633, offset 0, flags [DF], proto TCP (6), length 60)
    vcv069158.x.x.x.44417 > dhcp-x221.x.x.x.45922: Flags [S], cksum 0x13ee (correct), seq 584972499, win 25820, options [mss 1291,sackOK,TS val 2545185 ecr 0,nop,wscale 7], length 0
12:56:56.942603 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    dhcp-x221.x.x.x.45922 > vcv069158.x.x.x.44417: Flags [S.], cksum 0x7d30 (incorrect -> 0xfd9e), seq 2889461335, ack 584972500, win 28960, options [mss 1460,sackOK,TS val 1093302 ecr 2545185,nop,wscale 0], length 0
12:56:57.042734 IP (tos 0x0, ttl 60, id 64634, offset 0, flags [DF], proto TCP (6), length 52)
    vcv069158.x.x.x.44417 > dhcp-x221.x.x.x.45922: Flags [.], cksum 0x9c9f (correct), seq 1, ack 1, win 202, options [nop,nop,TS val 2545212 ecr 1093302], length 0
12:56:57.046954 IP (tos 0x0, ttl 60, id 64635, offset 0, flags [DF], proto TCP (6), length 93)
    vcv069158.x.x.x.44417 > dhcp-x221.x.x.x.45922: Flags [P.], cksum 0x7748 (correct), seq 1:42, ack 1, win 202, options [nop,nop,TS val 2545212 ecr 1093302], length 41
12:56:57.046973 IP (tos 0x0, ttl 64, id 151, offset 0, flags [DF], proto TCP (6), length 52)
    dhcp-x221.x.x.x.45922 > vcv069158.x.x.x.44417: Flags [.], cksum 0x7d28 (incorrect -> 0x2c06), seq 1, ack 42, win 28960, options [nop,nop,TS val 1093328 ecr 2545212], length 0
12:57:01.371307 IP (tos 0x0, ttl 64, id 50327, offset 0, flags [DF], proto TCP (6), length 52)
    dhcp-x221.x.x.x.45922 > vcv069158.x.x.x.44416: Flags [R.], cksum 0x7d28 (incorrect -> 0x58b6), seq 81219880, ack 929809342, win 28960, options [nop,nop,TS val 1094409 ecr 2542228], length 0
12:57:27.042892 IP (tos 0x0, ttl 64, id 152, offset 0, flags [DF], proto TCP (6), length 52)
    dhcp-x221.x.x.x.45922 > vcv069158.x.x.x.44417: Flags [R.], cksum 0x7d28 (incorrect -> 0x0eb7), seq 1, ack 42, win 28960, options [nop,nop,TS val 1100827 ecr 2545212], length 0
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel

似乎主机 (221) 发送的每个数据包都有cksum incorrect。我不知道为什么会发生这种情况...

答案1

我终于明白发生了什么。问题是“客户机有两个网络适配器,一个是桥接的,具有公共 IP 地址 128.xx219,另一个以 NAT 模式工作,具有本地 IP 地址 192.168.106.129。”看来我们不应该这么做。我们不应该在同一台虚拟机上安装两个虚拟适配器,其中一个以桥接模式工作(桥接到公共互联网),另一个以 NAT 模式工作(转换到公共互联网)。

解决办法很简单删除桥接适配器vmplayer在 VMWare Player 中,并保存配置文件。使用或运行 VM 并不重要vmrun

看起来,当虚拟机通过端口转发收到连接请求时,它会尝试连接到位于公共互联网上的请求发送者,但其尝试通过桥接适配器而不是 NAT 适配器,这会导致校验和不正确。这可能是由于虚拟机上的路由表造成的。

相关内容