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/sshd
para 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/sshd
para 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_config
o 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.conf
conforme 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/everything
para 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 Address
do 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.