ΠΡΡΠ·ΡΡ, ΠΏΡΠΈΠ²Π΅Ρ!
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· Π΄ΠΎΠΌΠ° ΠΊ ΡΠ°Π±ΠΎΡΠ΅ΠΌΡ ΠΌΠ΅ΡΡΡ Π² ΠΎΡΠΈΡΠ΅. ΠΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ
β ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ 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.
ΠΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ: ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠ°ΡΡ Ρ Β«Π΄Π²Π° Π³ΠΈΠ³Π°, Π΄Π²Π° ΡΠ΄ΡΠ°, ΠΈΠ³ΡΠΎΠ²ΠΎΠΉ ΠΠΒ». Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ
Π‘ΡΡΠ»ΠΊΠΈ:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com