为什么 HAProxy tcp-request content do-resolve 不起作用

为什么 HAProxy tcp-request content do-resolve 不起作用

我结合使用 HAProxy(docker image v2.3.2)和 Hashicorp Consul(v1.9.1)来使用 SSH 访问 haproxy 后面的虚拟机(我遵循https://www.haproxy.com/fr/blog/route-ssh-connections-with-haproxy/

  1. 我的虚拟机已在 consul 中注册
  2. 我使用 consul 的 dns 服务,它监听 53/tcp 和 53/udp 端口​​,将节点(vm)名称映射到它的 ip 地址
# the following command works just fine (it gives the ip address of registered node)
dig @<consul_server_ip> -p 53 <node_name>.node.<mydomain> +noall +answer
  1. 我使用以下 haproxy.cfg 文件启动了连接到主机网络的 haproxy 容器
global
  log stdout format raw local0

defaults
  log global
  timeout client 60s
  timeout server 20s
  timeout connect 20s

resolvers consul
  accepted_payload_size 8192
  nameserver dns1 <consul_server_ip>:53
  resolve_retries      3
  timeout resolve      1s
  timeout retry        1s
  hold other           30s
  hold refused         30s
  hold nx              30s
  hold timeout         30s
  hold valid           10s
  hold obsolete        30s

frontend fe_ssh
  bind *:2222 ssl crt <path/to/ssl.pem>
  mode tcp
  log-format "%ci:%cp [%t] %ft %b/%s %Tw/%Tc/%Tt %B %ts %ac/%fc/%bc/%sc/%rc %sq/%bq dstName:%[var(sess.dstName)] dstIP:%[var(sess.dstIP)]"
  tcp-request content do-resolve(sess.dstIP,consul,ipv4) ssl_fc_sni
  tcp-request content set-var(sess.dstName) ssl_fc_sni
  default_backend be_ssh-servers

backend be_ssh-servers
  mode tcp
  tcp-request content set-dst var(sess.dstIP)
  server ssh-srv 0.0.0.0:22

现在,当我尝试使用以下命令连接到 haproxy 后面的一台虚拟机时

ssh -i ~/.ssh/<mynode-priv-key.pem> -o ProxyCommand="openssl s_client -quiet -connect haproxy.mydomain:2222 -servername <node_name>.node.<mydomain>" <user>@<node_name>.node.<mydomain>

ssh 命令尝试连接到运行 haproxy 的虚拟机(haproxy.mydomain),而不是指定的虚拟机

-servername <node_name>.node.<mydomain>

haproxy 日志给了我这个

source_ip:port [date/time] fe_ssh~ be_ssh-servers/ssh-srv 60/1/3546 3037 -- 1/1/0/0/0 0/0 dstName:<node_name>.node.<mydomain> dstIP:-

因此,正如您在日志中看到的,haproxy 打印了我的节点的正确名称

dstName=<node_name>.node.<mydomain>

而不是 haproxy.mydomain (运行 haproxy 的虚拟机)的,

我认为,由于解析器问题,我尝试使用 SSH 连接到我的虚拟机 (<node_name>.node. ) 时没有关联的 ip (dstIP) 地址

任何有关如何调试此问题的帮助和想法(因为我对 haproxy 和 consul 还不熟悉)都将不胜感激。提前谢谢大家。

注意:我已经使用了 consul-template 来获得我想要的东西,但我想让它在不使用它的情况下工作

答案1

您需要将其添加到您的配置中

tcp-request inspect-delay 5s

在您的配置的前面部分。

遇到了同样的问题并问了同样的问题: https://discourse.haproxy.org/t/do-resolve-not-working/6504

相关内容