MS Remote Desktop Gateway, HAProxy ΠΈ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ пароля

Π”Ρ€ΡƒΠ·ΡŒΡ, ΠΏΡ€ΠΈΠ²Π΅Ρ‚!

БущСствуСт мноТСство способов ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· Π΄ΠΎΠΌΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ мСсту Π² офисС. Один ΠΈΠ· Π½ΠΈΡ… β€” это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Microsoft Remote Desktop Gateway. Π­Ρ‚ΠΎ RDP ΠΏΠΎΠ²Π΅Ρ€Ρ… HTTP. Π― Π½Π΅ Ρ…ΠΎΡ‡Ρƒ здСсь Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Ρ‚ΡŒ настройку самого RDGW, Π½Π΅ Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ Ρ…ΠΎΡ€ΠΎΡˆ ΠΈΠ»ΠΈ ΠΏΠ»ΠΎΡ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ отнСсёмся ΠΊ Π½Π΅ΠΌΡƒ, ΠΊΠ°ΠΊ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· инструмСнтов ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ доступа. Π― Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π΅ вашСго RDGW сСрвСра ΠΎΡ‚ Π·Π»ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°. Когда я настроил RDGW сСрвСра, я Ρ‚ΡƒΡ‚ ΠΆΠ΅ озаботился Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ, особСнно Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° пароля. МСня ΡƒΠ΄ΠΈΠ²ΠΈΠ»ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π΅ Π½Π°ΡˆΡ‘Π» Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°Ρ… статСй ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Ну Ρ‡Ρ‚ΠΎ ΠΆ, придётся Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π‘Π°ΠΌ ΠΏΠΎ сСбС RDGW Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π°Ρ‰ΠΈΡ‚. Π”Π°, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³ΠΎΠ»ΠΎΠΉ ΠΆ интСрфСйсом Π² Π±Π΅Π»ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Но ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ администратору ΠΈΠ»ΠΈ Π˜Π‘’ΡˆΠ½ΠΈΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ этого нСспокойно. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ситуации блокирования ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записи, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ€Π°Π΄ΠΈΠ²Ρ‹ΠΉ сотрудник Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ» ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π½Π° домашнСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ смСнил свой ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… рСсурсов ΠΎΡ‚ внСшнСй срСды β€” это Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ прокси, систСмы ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ WAF. Вспомним, Ρ‡Ρ‚ΠΎ RDGW это всё Ρ‚Π°ΠΊΠΈ http, Ρ‚ΠΎΠ³Π΄Π° прям Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π²ΠΎΡ‚ΠΊΠ½ΡƒΡ‚ΡŒ спСциализированноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ сСрвСрами ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ΠΎΠΌ.

Π― знаю, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅ F5, A10, Netscaler(ADC). Как администратор ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих систСм, скаТу, Ρ‡Ρ‚ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π½Π° этих систСмах Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. И Π΄Π°, эти систСмы ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ защитят вас ΠΎΡ‚ всякого syn Ρ„Π»ΡƒΠ΄Π°.

Но Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ каТдая компания ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС приобрСсти ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (ΠΈ Π½Π°ΠΉΡ‚ΠΈ администратора Ρ‚Π°ΠΊΠΎΠΉ систСмы :), Π° ΠΎ бСзопасности, ΠΏΡ€ΠΈ этом, ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΌΠΎΠΆΠ΅Ρ‚!

Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π΅ΡΠΏΠ»Π°Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ HAProxy Π½Π° бСсплатной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. Π― тСстировал Π½Π° Debian 10, Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚Π°Ρ€ΠΈΠΈ вСрсия haproxy 1.8.19. Π’Π°ΠΊ ΠΆΠ΅ провСрял Π½Π° вСрсии 2.0.Ρ…Ρ… ΠΈΠ· testing рСпозитария.

Настройку самого debian оставим Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ. ΠšΡ€Π°Ρ‚ΠΊΠΎ: Π½Π° Π±Π΅Π»ΠΎΠΌ интСрфСйсС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ всё, ΠΊΡ€ΠΎΠΌΠ΅ 443 ΠΏΠΎΡ€Ρ‚Π°, Π½Π° сСром интСрфСйсС β€” согласно вашСй ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ всё, ΠΊΡ€ΠΎΠΌΠ΅ 22 ΠΏΠΎΡ€Ρ‚Π°. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ (VRRP Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ip).

ΠŸΠ΅Ρ€Π²ΠΎ-Π½Π°ΠΏΠ΅Ρ€Π²ΠΎ настроил haproxy Π½Π° SSL bridging mode (ΠΎΠ½ ΠΆΠ΅ mode http) ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ RDP Ρ…ΠΎΠ΄ΠΈΡ‚. Π’Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Π²Π»Π΅Π· посСрСдинС. Π’Π°ΠΊ Π²ΠΎΡ‚, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π²ΠΎ «всСх» ΡΡ‚Π°Ρ‚ΡŒΡΡ… ΠΏΠΎ настройкС RDGateway ΠΏΡƒΡ‚ΡŒ /RDWeb отсутствуСт. Всё, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ, это /rpc/rpcproxy.dll ΠΈ /remoteDesktopGateway/. ΠŸΡ€ΠΈ этом Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ стандартныС GET/POST запросы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ свой Ρ‚ΠΈΠΏ запроса RDG_IN_DATA, RDG_OUT_DATA.

НС ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ Ρ…ΠΎΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ mstsc, ΠΈΠ΄Ρƒ Π½Π° сСрвСр, Π² Π»ΠΎΠ³Π°Ρ… Π²ΠΈΠΆΡƒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ошибки 401 (unauthorized), Π·Π°Ρ‚Π΅ΠΌ Π²Π²ΠΎΠΆΡƒ Π»ΠΎΠ³ΠΈΠ½/ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ Π²ΠΈΠΆΡƒ ΠΎΡ‚Π²Π΅Ρ‚ 200.

ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽ, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ Π·Π°Π½ΠΎΠ²ΠΎ, Π² Π»ΠΎΠ³Π°Ρ… Π²ΠΈΠΆΡƒ Ρ‚Π΅ ΠΆΠ΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ошибки 401. Π’Π²ΠΎΠΆΡƒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ Π»ΠΎΠ³ΠΈΠ½/ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ Π²ΠΈΠΆΡƒ снова Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ошибки 401. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ. Π­Ρ‚ΠΎ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ login url Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, ΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ я Π½Π΅ знаю, ΠΊΠ°ΠΊ Π² haproxy ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡˆΠΈΠ±ΠΊΡƒ 401, Ρ‚ΠΎ Π±ΡƒΠ΄Ρƒ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ (Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ, Π° ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ) всС ошибки 4xx. Π’ΠΎΠΆΠ΅ устроит для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π‘ΡƒΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ»-Π²ΠΎ ошибок 4xx (Π½Π° backend) Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Ссли ΠΎΠ½ΠΎ прСвысит ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π΅Π», Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒ (Π½Π° frontend) всС дальнСйшиС соСдинСния с этого ip Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ВСхничСски, это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° пароля, это Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ ошибок 4xx. НапримСр, Ссли часто Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ url (404), Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π° Ρ‚Π°ΠΊ ΠΆΠ΅ сработаСт.

Π‘Π°ΠΌΡ‹ΠΉ простой ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ способ β€” это Π½Π° backend ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚Π±ΠΈΡ‚ΡŒ, Ссли Ρ‡Π΅Π³ΠΎ лишнСго появилось:

frontend fe_rdp_tsc
    bind *:443 ssl crt /etc/haproxy/cert/desktop.example.com.pem
    mode http
    ...
    default_backend be_rdp_tsc


backend be_rdp_tsc
    ...
    mode http
    ...

    #ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ, 1000 элСмСнтов, ΠΏΡ€ΠΎΡ‚ΡƒΡ…Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· 15 сСк, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ»-Π²ΠΎ ошибок Π·Π° послСдниС 10 сСк
    stick-table type string len 128 size 1k expire 15s store http_err_rate(10s)
    #Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ip
    http-request track-sc0 src
    #Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ с http ошибкой 429, Ссли Π·Π° послСдниС 10 сСк большС 4 ошибок
    http-request deny deny_status 429 if { sc_http_err_rate(0) gt 4 }
	
	...
    server rdgw01 192.168.1.33:443 maxconn 1000 weight 10 ssl check cookie rdgw01
    server rdgw02 192.168.2.33:443 maxconn 1000 weight 10 ssl check cookie rdgw02

НС самый Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, услоТним. Π‘Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±ΡƒΠ΄Π΅ΠΌ Π½Π° backend, Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° frontend.

Π‘ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΌ поступим Π³Ρ€ΡƒΠ±ΠΎ, Π±ΡƒΠ΄Π΅ΠΌ ΡΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ Π΅ΠΌΡƒ tcp соСдинСниС.

frontend fe_rdp_tsc
    bind *:443 ssl crt /etc/haproxy/cert/ertelecom_ru_2020_06_11.pem
    mode http
    ...
    #ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ip адрСсов, 1000 элСмСнтов, ΠΏΡ€ΠΎΡ‚ΡƒΡ…Π½Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· 15 сСк, ΡΠΎΡ…Ρ€ΡΠ½ΡΡ‚ΡŒ ΠΈΠ· глобального счётчика
    stick-table type ip size 1k expire 15s store gpc0
    #Π²Π·ΡΡ‚ΡŒ источник
    tcp-request connection track-sc0 src
    #ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ tcp соСдинСниС, Ссли Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ счётчик >0
    tcp-request connection reject if { sc0_get_gpc0 gt 0 }
	
    ...
    default_backend be_rdp_tsc


backend be_rdp_tsc
    ...
    mode http
    ...
	
    #ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ip адрСсов, 1000 элСмСнтов, ΠΏΡ€ΠΎΡ‚ΡƒΡ…Π½Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· 15 сСк, ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΊΠΎΠ»-Π²ΠΎ ошибок Π·Π° 10 сСк
    stick-table type ip size 1k expire 15s store http_err_rate(10s)
    #ΠΌΠ½ΠΎΠ³ΠΎ ошибок, Ссли ΠΊΠΎΠ»-Π²ΠΎ ошибок Π·Π° 10 сСк прСвысило 8
    acl errors_too_fast sc1_http_err_rate gt 8
    #ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π°Ρ‚Π°ΠΊΡƒ Π² глобальном счётчикС (ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ счётчик)
    acl mark_as_abuser sc0_inc_gpc0(fe_rdp_tsc) gt 0
    #ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ счётчик
    acl clear_as_abuser sc0_clr_gpc0(fe_rdp_tsc) ge 0
    #Π²Π·ΡΡ‚ΡŒ источник
    tcp-request content track-sc1 src
    #ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π°Ρ‚Π°ΠΊΠ°
    tcp-request content reject if errors_too_fast mark_as_abuser
    #Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Ρ„Π»Π°ΠΆΠΎΠΊ Π°Ρ‚Π°ΠΊΠΈ
    tcp-request content accept if !errors_too_fast clear_as_abuser
	
    ...
    server rdgw01 192.168.1.33:443 maxconn 1000 weight 10 ssl check cookie rdgw01
    server rdgw02 192.168.2.33:443 maxconn 1000 weight 10 ssl check cookie rdgw02

Ρ‚ΠΎΠΆΠ΅ ΠΆΠ΅ самоС, Π½ΠΎ Π²Π΅ΠΆΠ»ΠΈΠ²ΠΎ, Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ http 429 (Too Many Requests)

frontend fe_rdp_tsc
    ...
    stick-table type ip size 1k expire 15s store gpc0
    http-request track-sc0 src
    http-request deny deny_status 429 if { sc0_get_gpc0 gt 0 }
    ...
    default_backend be_rdp_tsc

backend be_rdp_tsc
    ...
    stick-table type ip size 1k expire 15s store http_err_rate(10s)
    acl errors_too_fast sc1_http_err_rate gt 8
    acl mark_as_abuser sc0_inc_gpc0(fe_rdp_tsc) gt 0
    acl clear_as_abuser sc0_clr_gpc0(fe_rdp_tsc) ge 0
    http-request track-sc1 src
    http-request allow if !errors_too_fast clear_as_abuser
    http-request deny deny_status 429 if errors_too_fast mark_as_abuser
    ...

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ: Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ mstsc ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ бСспорядочно Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ. ПослС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π·Π° 10 сСк мСня ΠΎΡ‚ΠΏΠΈΠ½Ρ‹Π²Π°Π΅Ρ‚, Π° mstsc Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π§Ρ‚ΠΎ ΠΈ Π²ΠΈΠ΄Π½ΠΎ Π² Π»ΠΎΠ³Π°Ρ….

ПояснСния. Π― Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ мастСр haproxy. Π― Π½Π΅ понимаю, ΠΏΠΎΡ‡Π΅ΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€
http-request deny deny_status 429 if { sc_http_err_rate(0) gt 4 }
позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 10 ошибок, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ сработаСт.

Π― ΠΏΡƒΡ‚Π°ΡŽΡΡŒ Π² Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ счётчиков. ΠœΠ°ΡΡ‚Π΅Ρ€Π° haproxy, Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄, Ссли Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ мСня, ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚Π΅, сдСлаСтС Π»ΡƒΡ‡ΡˆΠ΅.

Π’ коммСнтариях ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΊΠΈΠ΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… способов Π·Π°Ρ‰ΠΈΡ‚Ρ‹ RD Gateway, Π±ΡƒΠ΄Π΅Ρ‚ интСрСсно ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ.

ΠšΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола Windows (mstsc), стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ TLS1.2 (Π²ΠΎ всяком случаС Π² Windows 7), поэтому ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ TLS1; Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ cipher, поэтому Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ старыС.

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ понял Ρ‚ΠΎΠ»ΡŒΠΊΠΎ учится, ΠΈ ΡƒΠΆΠ΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ вСсь ΠΊΠΎΠ½Ρ„ΠΈΠ³.

haproxy.conf

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        #ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE
-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        #ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
        ssl-default-bind-options no-sslv3
        ssl-server-verify none


defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  15m
        timeout server  15m
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http


frontend fe_rdp_tsc
    bind *:443 ssl crt /etc/haproxy/cert/dektop.example.com.pem
    mode http
    capture request header Host len 32
    log global
    option httplog
    timeout client 300s
    maxconn 1000

    stick-table type ip size 1k expire 15s store gpc0
    tcp-request connection track-sc0 src
    tcp-request connection reject if { sc0_get_gpc0 gt 0 }

    acl rdweb_domain hdr(host) -i beg dektop.example.com
    http-request deny deny_status 400 if !rdweb_domain
    default_backend be_rdp_tsc


backend be_rdp_tsc
    balance source
    mode http
    log global

    stick-table type ip size 1k expire 15s store http_err_rate(10s)
    acl errors_too_fast sc1_http_err_rate gt 8
    acl mark_as_abuser sc0_inc_gpc0(fe_rdp_tsc) gt 0
    acl clear_as_abuser sc0_clr_gpc0(fe_rdp_tsc) ge 0
    tcp-request content track-sc1 src
    tcp-request content reject if errors_too_fast mark_as_abuser
    tcp-request content accept if !errors_too_fast clear_as_abuser

    option forwardfor
    http-request add-header X-CLIENT-IP %[src]

    option httpchk GET /
    cookie RDPWEB insert nocache
    default-server inter 3s    rise 2  fall 3
    server rdgw01 192.168.1.33:443 maxconn 1000 weight 10 ssl check cookie rdgw01
    server rdgw02 192.168.2.33:443 maxconn 1000 weight 10 ssl check cookie rdgw02


frontend fe_stats
    mode http
    bind *:8080
    acl ip_allow_admin src 192.168.66.66
    stats enable
    stats uri /stats
    stats refresh 30s
    #stats admin if LOCALHOST
    stats admin if ip_allow_admin

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π΄Π²Π° сСрвСра Π½Π° backend? ΠŸΠΎΡ‚ΠΎΠΌΡƒΡ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ. Haproxy Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π²Π° с ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠΌ Π±Π΅Π»Ρ‹ΠΌ ip.

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы: ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Β«Π΄Π²Π° Π³ΠΈΠ³Π°, Π΄Π²Π° ядра, ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ПК». Богласно Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ этого Π±ΡƒΠ΄Π΅Ρ‚ достаточно с запасом.

Бсылки:

Настройка rdp-gateway ΠΎΡ‚ HAProxy
ЕдинствСнная найдСнная мною ΡΡ‚Π°Ρ‚ΡŒΡ, Π³Π΄Π΅ ΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ пароля

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com