Login SSH via IPv6 com sucesso ao usar IPv4 para o mesmo host gera "Permissão negada"

Login SSH via IPv6 com sucesso ao usar IPv4 para o mesmo host gera "Permissão negada"

Atualmente estou perplexo com um problema estranho… Tenho um host de pilha dupla para o qual desejo fazer SSH. Se eu conectar via IPv6 tudo funciona como esperado

datenwolf@foo ~/ > ssh -6 bar.example.com
Password:

datenwolf@bar ~/ >

Porém ao fazer o mesmo via IPv4 ele falha

datenwolf@foo ~/ > ssh -4 bar.example.com
Password:
Permission denied (publickey,keyboard-interactive).

datenwolf@foo ~/ >

Trecho de /var/log/sshdpara a falha no login

Apr 24 16:34:03 [sshd] SSH: Server;Ltype: Version;Remote: www.xxx.yyy.zzz-38427;Protocol: 2.0;Client: OpenSSH_5.9p1 Debian-5ubuntu1
Apr 24 16:34:03 [sshd] SSH: Server;Ltype: Kex;Remote: www.xxx.yyy.zzz-38427;Enc: aes128-ctr;MAC: hmac-md5;Comp: none [preauth]
Apr 24 16:34:04 [sshd] SSH: Server;Ltype: Authname;Remote: www.xxx.yyy.zzz-38427;Name: wolfgangd [preauth]
Apr 24 16:34:07 [sshd] pam_access(sshd:account): access denied for user `datenwolf' from `foo.example.com'
Apr 24 16:34:07 [sshd] error: PAM: User account has expired for datenwolf from foo.example.com
Apr 24 16:34:07 [sshd] Connection closed by www.xxx.yyy.zzz [preauth]

Claro que a conta não expirou e consigo fazer login perfeitamente via IPv6. Usando o Google encontrei vários relatórios sobre as mensagens de log, mas nenhum deles correspondia ao meu problema (no sentido de que aplicar as soluções propostas não funcionou para o meu caso).

Estou praticamente sem ideias aqui.


Atualizar

/var/log/sshdpara login IPv6 bem-sucedidona mesma máquina alvo:

Apr 24 16:56:42 [sshd] SSH: Server;Ltype: Version;Remote: 2001:x:x:x:x:x:x:x-46025;Protocol: 2.0;Client: OpenSSH_5.9p1 Debian-5ubuntu1
Apr 24 16:56:42 [sshd] SSH: Server;Ltype: Kex;Remote: 2001:x:x:x:x:x:x:x-46025;Enc: aes128-ctr;MAC: hmac-md5;Comp: none [preauth]
Apr 24 16:56:43 [sshd] SSH: Server;Ltype: Authname;Remote: 2001:x:x:x:x:x:x:x-46025;Name: datenwolf [preauth]
Apr 24 16:56:47 [sshd] Accepted keyboard-interactive/pam for datenwolf from 2001:x:x:x:x:x:x:x port 46025 ssh2
Apr 24 16:56:47 [sshd] pam_unix(sshd:session): session opened for user datenwolf by (uid=0)

Tentei fazer login em várias máquinas e obtive o mesmo resultado: IPv6 funciona, IPv4 não.


Atualização 2

Para referência, estas são as tabelas IP usadas. Observe queestes são testados em batalha, ou seja, estão em uso há vários anos e não foram alterados recentemente. Login remoto via IPv4feztrabalhar com eles.

Tabelas de ipv4:

Chain INPUT (policy ACCEPT 2144 packets, 336K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  132 20762 fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
  12M   14G ACCEPT     all  --  ppp0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 3111 95984 ACCEPT     icmp --  ppp0   *       0.0.0.0/0            0.0.0.0/0           
18692 1123K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    2   112 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1194
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1194
 4633  288K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:6880:6899
 2826  154K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpts:6880:6899
    4   160 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:123
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:123
44165 3069K REJECT     all  --  ppp0   *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 48032 packets, 44M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:631 reject-with icmp-port-unreachable
    0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:515 reject-with icmp-port-unreachable
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:631 reject-with icmp-port-unreachable
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:515 reject-with icmp-port-unreachable
    0     0 REJECT     all  --  ppp0   ppp0    0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
 133K 8347K TCPMSS     tcp  --  *      ppp0    0.0.0.0/0            0.0.0.0/0            tcp flags:0x06/0x02 TCPMSS clamp to PMTU

Chain OUTPUT (policy ACCEPT 14378 packets, 2172K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain fail2ban-SSH (1 references)
 pkts bytes target     prot opt in     out     source               destination         
  132 20762 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 

Tabelas IPv6 ip6

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all      *      *       ::/0                 ::/0                 rt type:0 segsleft:0
 484K   86M ACCEPT     icmpv6   *      *       ::/0                 ::/0                
 105K 7943K ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:1194
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:1194
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpts:6880:6899
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpts:6880:6899
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:123
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:123
    0     0 ACCEPT     all      ppp0,sixxs *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
4164K  466M ACCEPT     all      !ppp0,sixxs *       ::/0                 ::/0                
    0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all      *      *       ::/0                 ::/0                 rt type:0 segsleft:0
 2864  311K ACCEPT     icmpv6   *      *       ::/0                 ::/0                
    0     0 REJECT     tcp      *      *       ::/0                 ::/0                 multiport ports 631 reject-with icmp6-port-unreachable
    0     0 REJECT     udp      *      *       ::/0                 ::/0                 multiport ports 631 reject-with icmp6-port-unreachable
    0     0 REJECT     tcp      *      *       ::/0                 ::/0                 multiport ports 515 reject-with icmp6-port-unreachable
    0     0 REJECT     udp      *      *       ::/0                 ::/0                 multiport ports 515 reject-with icmp6-port-unreachable
    0     0 REJECT     all      ppp0,sixxs ppp0,sixxs  ::/0                 ::/0                 reject-with icmp6-port-unreachable
    0     0 accept_with_pmtu_clamp  tcp      ppp0,sixxs *      !2001:x:x::/48   2001:x:x::/48   tcp dpt:22
  18M   14G accept_with_pmtu_clamp  all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
65503 5289K accept_with_pmtu_clamp  all      !ppp0,sixxs *       ::/0                 ::/0                
    0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain OUTPUT (policy ACCEPT 8099K packets, 11G bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all      *      *       ::/0                 ::/0                 rt type:0 segsleft:0

Chain accept_with_pmtu_clamp (3 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 TCPMSS     tcp      *      ppp0,sixxs  ::/0                 ::/0                 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
  18M   14G ACCEPT     all      *      *       ::/0                 ::/0 

Atualização 3

Este é /etc/sshd/sshd_configo sistema ao qual tento me conectar, sem todos os comentários:

Port 22
ListenAddress 0.0.0.0
ListenAddress ::

PubkeyAuthentication yes
PasswordAuthentication no
UsePAM yes

AllowAgentForwarding yes
AllowTcpForwarding yes
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
PrintMotd no
PrintLastLog no
UseDNS yes

Subsystem       sftp    /usr/lib64/misc/sftp-server

Responder1

Depois que as coisas ficaram cada vez mais estranhas (veja o tópico de comentários na minha pergunta), finalmente descobri. Comecemos pelo princípio: o processo de autenticaçãofezfalha em pam_access.so, porém não devido a alguma configuração incorreta, /etc/security/access.confconforme sugerido.

Para entender o porquê, devemos observar a configuração desta caixa em particular: ela atua como um roteador para IPv4 que passa nativamente pelo link PPP e IPv6 que passa por um túnel 6 em 4. Além disso, esta caixa atua como um resolvedor recursivo de DNS, e aqui está ficando interessante. Eu configurei o resolvedor de forma que as pesquisas reversas IPv4 sejam resolvidas recursivamente começando com os servidores raiz IPv4 e as pesquisas reversas IPv6 comecem com os servidores raiz IPv6. Esta configuração funcionou quando a instalei pela primeira vez.

Agora meu ISP entra em cena e as pessoas que não entendem como funcionam os ataques de amplificação de DNS. Para resumir uma longa história: tenho certeza de que meu ISP mexe aleatoriamente com pacotes DNS recebidos, ou seja, algumas coisas devem ser resolvidas por meio de seus próprios resolvedores já há algum tempo, enquanto resolve outros endereços DNS recursivamente em seus próprios trabalhos – o oficial o motivo é mitigar ataques de amplificação de DNS, mas eles estão fazendo isso errado então^1.

Como eu não queria mudar muito minha configuração, apenas joguei os resolvedores DNS do meu ISP no final do meu resolvedor DNS local como encaminhamento não recursivo, portanto, se a tentativa de resolução recursiva expirar, ele tentará os resolvedores do meu ISP. Isso funciona até agora. Mas quando configurei isso cometi um pequeno erro: entrei nos resolvedores DNS do ISP para trabalhar apenas em hosts dentro do meu escopo local, ou seja, 192.168.0.0/16, mas esqueci do localhost, também conhecido como meu roteador, que é o host que tentei SSH em, para o qual o resolvedornãoleve em consideração os resolvedores do ISP.

pam_access.so tenta uma pesquisa reversa no endereço dos pares; e isso fecha o círculo: como para a pesquisa reversa IPv6, os servidores raiz DNS IPv6 seriam acessados, os pacotes passariam pelo túnel 6 em 4 sem que meu ISP mexesse com eles, obtendo uma resposta. Mas a pesquisa reversa do IPv4 não seria feita por mim mesmo nos resolvedores do ISP, o que não receberia resposta e, em última análise, reportaria um NXHOST (ou seria executado em um tempo limite). De qualquer forma, pam_access.so não verá algo que goste e apenas dirá "você não deve passar".

Depois de consertar a configuração do resolvedor, tudo agora funciona perfeitamente novamente.Mas eu realmente tenho que pisar no pé do meu ISP agora…

Como eu resolvi isso? Bem, aumentando a verbosidade do registro, estudando intensamente /var/log/everythingpara ver em que ordem as coisas se desenrolavam. Quando vi meu resolvedor registrando as tentativas de pesquisa reversa, eu sabia o que estava acontecendo.


1: do ponto de vista da mitigação da amplificação de DNS, isso é um absurdo completo, porque eu testei e os pacotes DNS de saída passaram perfeitamente – no entanto, esses são os pacotes que eles devem filtrar. Na verdade, todo ISP do cliente final deve descartar todos os pacotes UDP cujo endereço de remetente não corresponda ao de seus clientes

Responder2

A configuração do sshd no servidor é uma das coisas mais interessantes de se observar se você tiver esse tipo de problema. Normalmente está em /etc/ssh/sshd_config.

Há uma boa chance de que em seu arquivo de configuração haja uma seção:

Match Address 10.*.*.*,192.168.0.*
    PasswordAuthentication no

Isso tem algumas regras específicas para essas sub-redes (as Addressdo seu arquivo provavelmente serão diferentes). Essas regras só se aplicam a endereços IPv4 se esses forem os únicos correspondentes (e não IPv6) e as regras da correspondência se aplicarem apenas ao endereço IP correspondente. Portanto, dependendo se você se conecta via IPv4 e IPv6, o sshd tem regras diferentes.

Nem todas as coisas podem ser definidas em um Match, mas são suficientes para fazer a diferença:

AllowAgentForwarding, AllowTcpForwarding, AuthorizedKeysFile,
AuthorizedPrincipalsFile, Banner, ChrootDirectory, ForceCommand,
GatewayPorts, GSSAPIAuthentication, HostbasedAuthentication,
HostbasedUsesNameFromPacketOnly, KbdInteractiveAuthentication,
KerberosAuthentication, MaxAuthTries, MaxSessions,
PasswordAuthentication, PermitEmptyPasswords, PermitOpen,
PermitRootLogin, PermitTunnel, PubkeyAuthentication,
RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset,
X11Forwarding, X11UseLocalHost

Responder3

Eu encontrei o mesmo problema, alinhe otabelas de ipcomtabelas ip6e corrigiu esse problema.

informação relacionada