用户 'repl_user'@'10.0.0.5' 的访问被拒绝但是 ip 10.0.0.5 来自哪里?

Access denied for user 'repl_user'@'10.0.0.5' but where ip 10.0.0.5 coming from?

在其中一个节点上,我设置了以下主节点:

CHANGE MASTER TO MASTER_HOST = '192.168.1.11',  MASTER_USER = 'repl_user', MASTER_PASSWORD = 'repl123',  MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 842;

这在过去有效,但现在我收到了这个奇怪的错误:

MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 192.168.1.11
                  Master_User: repl_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 842
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 842
              Relay_Log_Space: 249
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1698
                Last_IO_Error: error connecting to master 'repl_user@192.168.1.11:3306' - retry-time: 60  maximum-retries: 86400  message: Access denied for user 'repl_user'@'10.0.0.5'
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
1 row in set (0.00 sec)

Slave状态显示:

Last_IO_Error: error connecting to master 'repl_user@192.168.1.11:3306' - retry-time: 60  maximum-retries: 86400  message: Access denied for user 'repl_user'@'10.0.0.5'

但是这个 'repl_user'@'10.0.0.5' 来自哪里?

我将此用户设置为:

MariaDB [(none)]> select user,host from mysql.user where user = 'repl_user';
+-----------+------+
| user      | host |
+-----------+------+
| repl_user | %    |
+-----------+------+

我在任何子网 10 上都没有任何节点。0.x.x .

错误的原因很简单:主主机将副本连接视为来自 10.0.0.5

为什么会这样,我说不上来。一种明显的可能性是您的副本位于其自己的子网上 - 例如 192.168.7.0/24 - 即主服务器;并且通过 NAT(或某种 VPN)建立连接:

192.168.77.77 (your PC) --- 192.168.77.1 (local gateway)
                                  |
                                  |
                               10.0.0.5 (remote gateway)
                                  |
                            192.168.1.11

要检查这一点,在副本机器上,运行:

traceroute -n 192.168.1.11

看看它告诉你什么。

确认复制机只有一个接口192.168.1.x,没有潜伏的10.0.0.x接口

然后,验证路由表以确保它们是正确的(如果它们不正确我会感到惊讶,但我已经看到 事情 发生了)。

如果没有用,我必须得出结论,技术上服务器与副本在同一网段,如您所说,但实际上 它是 而不是 :它可能是,例如,在虚拟机环境中,或受防火墙保护。像这样的“地址克隆”设置非常不寻常,容易出现问题,但并非不可能:

192.168.1.77 (replica) ----- 192.168.1.11 (VM Host)
                                   |
                                10.0.0.5 (internal dispatcher)
                                   |
                                10.0.0.4 (MariaDB primary)

 
192.168.1.77 (replica) ----- 192.168.1.11 (Firewall external)
                                   |
                                10.0.0.5 (Firewall internal)
                                   |
                             192.168.1.11 (MariaDB primary)

这些设置甚至可能只能通过 hping 和仔细的跟踪路由(所谓的“firewalking”)等工具检测到(或不能检测到),假设没有非常小心地隐藏服务器寻址是它似乎是什么。例如,对 192.168.1.11 的端口 3306 的 TTL 测量可能会关闭,并显示数据包实际上通过了一两个不应该存在的额外节点。

然而,通过询问 NetOps 人员可以更容易地发现所有这些,这只是一种好奇心 - 你[=56= 重要的是] 正在使副本工作,为此,就目前情况而言,您需要授权 10.0.0.5。

===

比如我这里自己的PC是192.168.100.76。如果我连接到 192.168.200.233 上的主服务器,那将通过 192.168.200.x 子网的 NATting 网关发生,即 192.168.100.1(在 my 端) 和 192.168.200.1(在 other 一侧)。因此,主节点会看到我的副本请求来自 192.168.200.1.

如果我想让副本正常工作,那将是我必须授权的地址。

同理,需要从10.0.0.5授权replica.

是的,这意味着 我的 192.168.100.x 网络 中的任何 PC 都将被授权连接到该主机。要以不同的方式组织事情,必须更改网络路由

例如,我可以请求 VPN 连接,以便我的 PC 收到 192.168.200.x 范围内的地址。数据包将被封装,发送到 192.168.100.1(显然),到达端口 1194 上的 192.168.200.1,然后“重新膨胀”并可能给定源地址 192.168.200.137。然后主要将“我”视为 192.168.200.137,我需要授权该地址,保留供我个人使用。