O mapeamento de porta TCP do VMware não está funcionando - porta não acessível via endereço IP público

0

Simplesmente falando, a porta encaminhada 45922 é acessível no host via 127.0.0.1:45922, mas não acessível no próprio host através de seu IP público mais o número da porta 45922. Os detalhes são os seguintes.

Sistema operacional do host: Ubuntu 14.04.2 LTS
Convidado OS: CentOS 6.6 (Final)
Máquina Virtual: VMware Player 7

A VM é iniciada no terminal usando o seguinte comando:

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

O host tem um endereço IP público que é 128.x.x.221
O convidado tem dois adaptadores de rede, um é interligado e tem um endereço IP público que é 128.x.x.219, o outro funciona no modo NAT e tem um endereço IP local que é 192.168.106.129.

Conteúdo do arquivo de configuração do host /etc/vmware/vmnet8/nat/nat.conf

45922 = 192.168.106.129:22
45911 = 192.168.106.129:5911

O primeiro encaminhamento de porta é para SSH, o segundo para VNC. Basicamente, eles estão sofrendo do mesmo problema, então eu gostaria de colocá-los juntos aqui.

Problemas observados:

  1. No convidado do CentOS:
    ssh 127.0.0.1 trabalhando
    ssh 192.168.106.129 trabalhando

  2. No host do Ubuntu:
    ssh 192.168.106.129 trabalhando
    ssh -p 45922 127.0.0.1 trabalhando
    ssh -p 45922 128.x.x.221 NÃO está funcionando

  3. De uma máquina pública aleatória:
    ssh -p 45922 128.x.x.221 NÃO está funcionando

No entanto, ao mesmo tempo, a rede interligada funciona bem. De uma máquina pública aleatória:
ssh 128.x.x.219 trabalhando

Nem o host nem o convidado têm o firewall ativado. iptables -L retorna listas vazias.

Não parece ser um problema de firewall de gateway, já que o host tem outra porta 45940 aberta e é acessível a partir de uma máquina pública aleatória.

Informação adicional

Executando netstat no host:

$ 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)

A execução de tcpdump port 45922 no host não captura nenhum pacote quando eu faço ssh -p 45922 128.x.x.221 no próprio host.

A execução de ssh -vvv -p 45922 128.x.x.221 em uma máquina aleatória gera isso:

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

A execução de tcpdump port 45922 -vv no host gera as seguintes informações quando tento conectar-me ao convidado de uma máquina aleatória na rede pública:

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

Parece que todo pacote que o host (221) enviou tem cksum incorrect . Eu não tenho ideia do porquê isso aconteceu ...

    
por bfrgzju 06.04.2015 / 23:50

1 resposta

0

Eu finalmente descobri o que aconteceu. O problema era "O convidado tem dois adaptadores de rede, um é em ponte e tem um endereço IP público que é 128.xx219, o outro funciona no modo NAT e tem um endereço IP local que é 192.168.106.129." Parece que não devemos fazer isso. Não devemos ter dois adaptadores virtuais na mesma VM, com um deles trabalhando em modo de ponte (ligado à Internet pública) e o outro trabalhando no modo NAT (traduzido para a Internet pública).

A solução foi simplesmente remover o adaptador em ponte no VMWare Player e salvar o arquivo de configuração. Não importa se eu executo a VM usando vmplayer ou vmrun .

Parece que, quando a máquina virtual recebe uma solicitação de conexão por meio do encaminhamento de porta, ela tenta se conectar ao remetente da solicitação, que está na Internet pública, mas sua tentativa passa pelo adaptador em ponte, e não pelo adaptador NAT. checksums incorretos. Isso provavelmente se deve à tabela de rotas na VM.

    
por 14.04.2015 / 04:08