我结合使用 HAProxy(docker image v2.3.2)和 Hashicorp Consul(v1.9.1)来使用 SSH 访问 haproxy 后面的虚拟机(我遵循https://www.haproxy.com/fr/blog/route-ssh-connections-with-haproxy/)
- 我的虚拟机已在 consul 中注册
- 我使用 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
- 我使用以下 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