Ssh

haproxy 背後的 SSHD real-ip

  • March 9, 2020

我正在嘗試使用 haproxy 通過 https 連接設置 ssh。

我目前正在尋找一種 SSHD 從 haproxy 獲取源 ip 的方法,類似於讀取X-Forwarded-ForX-Real-IP標頭。

客戶端配置;

~$ cat ~/.stunnel/stunnel.conf
pid=
client=yes
foreground=yes
[ssh]
accept=4444
connect=ssh.example.com:443

客戶端輸出;

~$ ssh -v -p 4444 user@localhost
OpenSSH_6.6.1, OpenSSL 1.0.1i 6 Aug 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to localhost [::1] port 4444.
debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH_6.6.1* compat 0x04000000
.....
debug1: SSH2_MSG_KEXINIT sent
Bad packet length 1349676916.
Disconnecting: Packet corrupt

伺服器配置;

~$ cat /etc/haproxy/haproxy.cfg
frontend public
       mode tcp

       bind :80
       redirect scheme https code 301 if !{ ssl_fc }

       bind :443 ssl crt example.pem no-tls-tickets

       tcp-request inspect-delay 5s
       tcp-request content accept if HTTP

       # ....
       use_backend ssh if { ssl_fc_sni ssh.example.com }


backend ssh
       mode tcp
       server ssh 127.0.0.1:22 send-proxy
       timeout server 2h

伺服器輸出;

~$ tail -f /var/log/haproxy.log
Aug 15 23:31:57 localhost haproxy[50379]: 115.000.000.000:51924 [15/Aug/2014:23:31:57.907] public~ ssh/ssh 2/0/8 60 SD 0/0/0/0/0 0/0

~$ tail -f /var/log/auth.log
Aug 15 23:31:57 localhost sshd[50757]: debug1: inetd sockets after dupping: 3, 3
Aug 15 23:31:57 localhost sshd[50757]: Connection from 127.0.0.1 port 36333 on 127.0.0.1 port 22
Aug 15 23:31:57 localhost sshd[50757]: Bad protocol version identification 'PROXY TCP4 115.000.000.000 192.168.000.000 51924 443' from 127.0.0.1 port 36333

haproxy.cfg 中的send-proxy行導致Bad protocol version identification

我可以在刪除send-proxy時連接但是這個連接127.0.0.1會不斷地附加到/etc/hosts.deny

Aug 15 23:55:22 localhost sshd[55997]: debug1: rexec start in 5 out 5 newsock 5 pipe 7 sock 8
Aug 15 23:55:22 localhost sshd[55997]: debug1: inetd sockets after dupping: 3, 3
Aug 15 23:55:22 localhost sshd[55997]: debug1: Connection refused by tcp wrapper
Aug 15 23:55:22 localhost sshd[55997]: refused connect from localhost (127.0.0.1)

我希望 ssh 知道源 IP。

mode tcp中,您需要tproxy將原始客戶端 IP 傳遞給後面的伺服器haproxy

連結的文章有很多技術背景,其中大部分不再是問題 - Linux 的最新版本,haproxy很可能支持開箱即用的 tproxy。

TL; DR 在後端部分,嘗試

source 0.0.0.0 usesrc clientip

恐怕這是不可能的。與 HTTP 不同,SSH 協議無法讓代理告訴您原始源 IP 是什麼。

引用自:https://serverfault.com/questions/620703