Estou no processo de executar um script php em um servidor da Web em um site remoto (eu chamarei o SiteB) que se conecta a um servidor MySql em um local remoto (eu chamarei o Site A). Agora, o servidor SQL no Site A tem 2 usuários, um chamado 'usr'@'192.168.1.%' para acesso de dentro da rede interna no Site A e um chamado 'usr'@'client.siteB.com' .
O servidor no Site A está atrás de um roteador e tem todo o tráfego TCP e UDP na porta 3306 encaminhado para 192.168.1.12 (o IP local do servidor MySQL no Site A). O site A tem um IP dinâmico, todas as referências ao servidor SQL são iniciadas por meio do nome do host (chamaremos server.siteA.com). O Site B tem um IP externo estático, mas todas as conexões SQL que estão chegando são referenciadas apenas pelo nome do host, portanto, por que o usuário do SQL é 'usr' @ 'client.siteB.com'.
O problema que estou tendo é que sempre que eu executo o script php do servidor web no site B, recebo o seguinte erro:
Access denied for user 'usr'@'client.siteB.com' (using password: NO)
Também faz referência a uma linha, que é:
$this->MCdbConnection = mysql_connect($this->MySQLhost, $this->MySQLuser, $this->MySQLpassword);
Então, como você pode ver, estou passando uma senha. A parte mais estranha é que, ao executar o mesmo script na rede local no Site A e alterar nada além da variável $ MySQLhost de server.siteA.com para 192.168.1.7, o script funciona bem e conecta e seleciona e insere os dados bem.
Um erro como esse geralmente me faz pensar que é um problema de nome de usuário, mas ambos os usuários do MySQL ('usr'@'192.168.1.%' e 'usr'@'client.siteB.com') são completamente idênticos, e ambos têm a mesma senha e privilégios (somente SELECT, INSERT e UPDATE).
Eu também tenho o mesmo erro ao tentar conectar via MySQL Workbench e o cliente de linha de comando de outra máquina na rede local no Site A quando eu deixei o usuário 'usr'@'192.168.1.%'. Todos os sinais apontam para um usuário faltando, ruim ou sub-autenticado, mas eu sei que o usuário está lá e tem as permissões adequadas, a única coisa que me faz desconfiar é que ele usa um nome de host em vez de um endereço IP.
Também verifiquei que tenho o seguinte conjunto de regras do IPTables no servidor MySQL no SiteA:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
Eu também posso e tenho executado conexões mysql similares via PHP no mesmo servidor no Site B, mas todas elas se conectam ao localhost.
Além disso, para uma boa medida, o SQL Server no my.cnf do SiteA:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
general-log
expire_logs_days = 60
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Eu também tentei alterar o host de 'usr'@'client.siteB.com' para '%', mas ainda estou recebendo o mesmo erro. Além disso, estou executando o servidor MySQL no Fedora e tenho o selinux configurado como permissivo.
Além disso, tentei alterar o nome do host para o ip do Site B no host do usuário do MySQL, mas ainda recebo o mesmo erro. No entanto, todo o erro que eu vi para ele se referia a ele como "client.siteB.com", mesmo quando eu faço um tcpdump no SiteA eu vejo o tráfego vindo da fonte "client.siteB.com"
Eu sei que os erros do SQL Access Denied são muito comuns e têm uma infinidade de problemas de root, mas nenhum dos tópicos que vi até agora sobre SF parecem resolver este problema e estou completamente perplexo. Além disso, meu google-fu falhou comigo desta vez. : (