Não é possível redirecionar a porta virtual para a interface de toque

2

Eu instalei o libvirt fora da caixa no Ubuntu 16.04, ele cria uma ponte virtual virbr0, em 192.168.122.0/24, uma instância dnsmasq para servir esse intervalo e configura o mascaramento NAT básico.

Eu criei uma interface de toque abaixo para o meu software de virtualização usar. O software em si é capaz de acessar a internet e o restante da rede perfeitamente, então o mascaramento está funcionando corretamente. Também posso acessar a porta ssh do software de virtualização do host, usando o endereço IP reivindicado por esse software. Então, acho que as tabelas de roteamento "fora da caixa" estão corretas.

O que eu quero fazer é encaminhar uma conexão ssh de entrada de fora para este software e para o sistema host em geral. Agora o sistema host tem o ssh, e eu preciso disso para funcionar. Então, estou tentando usar outra porta, como a porta 2022.

Eu criei uma regra DNAT no iptables para direcionar o tráfego de entrada na porta 2022 para o endereço IP do software na porta 22. Eu obtenho o destino inacessível quando tento fazer ssh de fora (ex. computador A abaixo) . Parece que a tradução do endereço está acontecendo corretamente, mas imediatamente após passar para a etapa "FORWARD" no iptables, eu começo a receber pacotes ICMP inacessíveis de saída.

Estou perplexo sobre como proceder. Eu tentei algumas regras do SNAT, mas eu estraguei ou não é o problema. Alguém tem idéias sobre isso?

ATUALIZAÇÃO: O Wireshark na tap0 não mostra ter recebido o pacote encaminhado. O que quer que esteja retornando o pacote não está relacionado ao software de virtualização.

Aqui está uma foto da minha rede:

           ----------
          | Internet |
           ----------
               |
               |
            --------
           | Router | 10.211.255.1
            --------
               |
               | 
   ____________|_______________
  |                            |
 ----------                   ---------
|          |                 |  enp0s5 | 10.211.255.4
| Computer | 10.211.255.2    |  Host   | 192.168.122.1
|    A     |                 |  virbr0 |
 ----------                   ---------
                                  |
                                  | LAN NAT 192.168.122.0/24 
                                  |
                              ----------
                             |   tap0   |
                             | Guest OS | 192.168.122.118
                             |          |
                              ----------

Aqui estão as minhas regras de tabelas IP:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "INTRACE: "
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "FORTRACE: "
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "OUTTRACE: "
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

NAT tables:
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        tcp  --  anywhere             anywhere             tcp dpt:2022 LOG level debug prefix "NATPTRACE: "
DNAT       tcp  --  anywhere             anywhere             tcp dpt:2022 to:192.168.122.118:22

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATITRACE: "

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATOTRACE: "

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATQTRACE: "
SNAT       tcp  --  anywhere             anywhere             tcp spt:ssh to::2022
RETURN     all  --  192.168.122.0/24     base-address.mcast.net/24
RETURN     all  --  192.168.122.0/24     broadcasthost.localdomain
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24

Finalmente, este é um exemplo do que vejo no syslog com as regras acima:

Oct 20 09:49:15 ubuntu kernel: [85149.812291] RAWPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812318] MGPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812326] NATPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812336] MGFTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812340] FORTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812354] RAWOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812357] MGOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812361] OUTTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812364] MGQTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
    
por Darth Voidpointer 20.10.2017 / 16:57

1 resposta

1

O problema estava nas regras do FORWARD. Como eu não os configurei, estava interpretando mal a saída de iptables --list .

Nessa lista, a regra 4 diz:

ACCEPT     all  --  anywhere             anywhere

Isso parece aceitar todos os pacotes recebidos de qualquer lugar vinculado a qualquer lugar.

No entanto, se eu olhar para iptables -S , a regra 4 é:

-A FORWARD -i virbr0 -o virbr0 -j ACCEPT

Que não será correspondido por um pacote proveniente de enp0s5 destinado a vibr0. Então, estava atingindo a regra REJECT 5, que na verdade era uma rejeição para todos os pacotes destinados a vibr0.

A lição que aprendi não é confiar na saída de iptables --list , mas em verificar iptables -S output quando algo parece errado.

    
por 20.10.2017 / 17:32