当您使用TCP代理level 7(也称为应用程序级别或第7层代理,OSI模型的最高级别)连接到服务器(或群集)时,应用程序不会直接连接到后端服务器。
使用这种代理(如HA Proxy、ProxySQL和MySQL Router)时的问题是,服务器并不真正知道客户端是从哪里连接的。服务器将代理/路由器的IP地址视为客户端的源IP。
HA Proxy最初设计了代理协议,这是一个简单的协议,允许TCP连接在客户端、代理服务器和目标服务器之间传输与代理相关的信息。代理协议的主要目的是保存客户端的原始IP地址(以及其他一些元数据)。
后端应用程序也必须知道并理解这个协议,才能从中受益。
但是,代理协议存在潜在的安全问题(如欺骗、信息泄漏、使用格式错误或非常大的代理协议头拒绝服务等)。
出于这些原因,正如您所知,安全性对我们Oracle来说非常重要,MySQL不支持代理协议。
这是否意味着如果你使用MySQL路由器,你没有办法知道客户端的IP地址?
当然不是,如果使用安全连接(SSL客户端),MySQL路由器会在握手中添加属性,这些属性在服务器上是可用的。
See Connections Attributes. https://dev.mysql.com/doc/refman/8.0/en/performance-schema-session-connect-attrs-table.html
通过这个简单的查询,现在可以列出客户端通过MySQL路由器连接时的连接和始发IP地址:
<code >(Wed Aug 30 09:06:30 2023)[root@GreatSQL][(none)]>
select program_name, last_statement, user,attr_value 'client ip'
from performance_schema.session_connect_attrs
join sys.processlist on conn_id=processlist_id
where attr_name = '_client_ip';