haproxy limits, blocklist, trustlist
This commit is contained in:
		
							parent
							
								
									2a2d09be7d
								
							
						
					
					
						commit
						7a140b2518
					
				
							
								
								
									
										3
									
								
								docker/haproxy/config/blocklist.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docker/haproxy/config/blocklist.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					# Blocked subnets and IPs. Use CIDR or IP by one per line
 | 
				
			||||||
 | 
					5.136.0.0/13
 | 
				
			||||||
 | 
					217.199.254.1
 | 
				
			||||||
@ -41,6 +41,15 @@ listen stats
 | 
				
			|||||||
listen mqtt-in
 | 
					listen mqtt-in
 | 
				
			||||||
 bind *:${MQTT_PORT}
 | 
					 bind *:${MQTT_PORT}
 | 
				
			||||||
 mode tcp
 | 
					 mode tcp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 stick-table type ip size 60k expire 60s store conn_cur
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 acl trustlist src -f /config/trustlist.txt
 | 
				
			||||||
 | 
					 acl blocklist src -f /config/blocklist.txt
 | 
				
			||||||
 | 
					 tcp-request connection accept if trustlist
 | 
				
			||||||
 | 
					 tcp-request connection reject if blocklist or { src_conn_cur ge 50 }
 | 
				
			||||||
 | 
					 tcp-request connection track-sc1 src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 option clitcpka # For TCP keep-alive
 | 
					 option clitcpka # For TCP keep-alive
 | 
				
			||||||
 timeout client 3h
 | 
					 timeout client 3h
 | 
				
			||||||
 timeout server 3h
 | 
					 timeout server 3h
 | 
				
			||||||
@ -52,6 +61,15 @@ listen mqtt-in
 | 
				
			|||||||
listen edges-rpc-in
 | 
					listen edges-rpc-in
 | 
				
			||||||
 bind *:${EDGES_RPC_PORT}
 | 
					 bind *:${EDGES_RPC_PORT}
 | 
				
			||||||
 mode tcp
 | 
					 mode tcp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 stick-table type ip size 60k expire 60s store conn_cur
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 acl trustlist src -f /config/trustlist.txt
 | 
				
			||||||
 | 
					 acl blocklist src -f /config/blocklist.txt
 | 
				
			||||||
 | 
					 tcp-request connection accept if trustlist
 | 
				
			||||||
 | 
					 tcp-request connection reject if blocklist or { src_conn_cur ge 5 }
 | 
				
			||||||
 | 
					 tcp-request connection track-sc1 src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 option clitcpka # For TCP keep-alive
 | 
					 option clitcpka # For TCP keep-alive
 | 
				
			||||||
 timeout client 3h
 | 
					 timeout client 3h
 | 
				
			||||||
 timeout server 3h
 | 
					 timeout server 3h
 | 
				
			||||||
@ -63,18 +81,28 @@ listen edges-rpc-in
 | 
				
			|||||||
frontend http-in
 | 
					frontend http-in
 | 
				
			||||||
 bind *:${HTTP_PORT} alpn h2,http/1.1
 | 
					 bind *:${HTTP_PORT} alpn h2,http/1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 stick-table type ip size 60k expire 60s store conn_cur
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 acl trustlist src -f /config/trustlist.txt
 | 
				
			||||||
 | 
					 acl blocklist src -f /config/blocklist.txt
 | 
				
			||||||
 | 
					 tcp-request connection accept if trustlist
 | 
				
			||||||
 | 
					 tcp-request connection reject if blocklist or { src_conn_cur ge 50 }
 | 
				
			||||||
 | 
					 tcp-request connection track-sc1 src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 option forwardfor
 | 
					 option forwardfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 http-request add-header "X-Forwarded-Proto" "http"
 | 
					 http-request add-header "X-Forwarded-Proto" "http"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 acl transport_http_acl path_beg /api/v1/
 | 
					 acl transport_http_acl path_beg /api/v1/
 | 
				
			||||||
 acl letsencrypt_http_acl path_beg /.well-known/acme-challenge/
 | 
					 acl letsencrypt_http_acl path_beg /.well-known/acme-challenge/
 | 
				
			||||||
 | 
					 acl tb_images_api_acl path_beg /api/images/
 | 
				
			||||||
 acl tb_api_acl path_beg /api/ /swagger /webjars /v2/ /v3/ /static/rulenode/ /oauth2/ /login/oauth2/ /static/widgets/
 | 
					 acl tb_api_acl path_beg /api/ /swagger /webjars /v2/ /v3/ /static/rulenode/ /oauth2/ /login/oauth2/ /static/widgets/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 redirect scheme https if !letsencrypt_http_acl !transport_http_acl { env(FORCE_HTTPS_REDIRECT) -m str true }
 | 
					 redirect scheme https if !letsencrypt_http_acl !transport_http_acl { env(FORCE_HTTPS_REDIRECT) -m str true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 use_backend letsencrypt_http if letsencrypt_http_acl
 | 
					 use_backend letsencrypt_http if letsencrypt_http_acl
 | 
				
			||||||
 use_backend tb-http-backend if transport_http_acl
 | 
					 use_backend tb-http-backend if transport_http_acl
 | 
				
			||||||
 | 
					 use_backend tb-images-api-backend if tb_images_api_acl
 | 
				
			||||||
 use_backend tb-api-backend if tb_api_acl
 | 
					 use_backend tb-api-backend if tb_api_acl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 default_backend tb-web-backend
 | 
					 default_backend tb-web-backend
 | 
				
			||||||
@ -82,14 +110,24 @@ frontend http-in
 | 
				
			|||||||
frontend https_in
 | 
					frontend https_in
 | 
				
			||||||
  bind *:${HTTPS_PORT} ssl crt /usr/local/etc/haproxy/default.pem crt /usr/local/etc/haproxy/certs.d ciphers ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM alpn h2,http/1.1
 | 
					  bind *:${HTTPS_PORT} ssl crt /usr/local/etc/haproxy/default.pem crt /usr/local/etc/haproxy/certs.d ciphers ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM alpn h2,http/1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  stick-table type ip size 60k expire 60s store conn_cur
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  acl trustlist src -f /config/trustlist.txt
 | 
				
			||||||
 | 
					  acl blocklist src -f /config/blocklist.txt
 | 
				
			||||||
 | 
					  tcp-request connection accept if trustlist
 | 
				
			||||||
 | 
					  tcp-request connection reject if blocklist or { src_conn_cur ge 50 }
 | 
				
			||||||
 | 
					  tcp-request connection track-sc1 src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  option forwardfor
 | 
					  option forwardfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  http-request add-header "X-Forwarded-Proto" "https"
 | 
					  http-request add-header "X-Forwarded-Proto" "https"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  acl transport_http_acl path_beg /api/v1/
 | 
					  acl transport_http_acl path_beg /api/v1/
 | 
				
			||||||
 | 
					  acl tb_images_api_acl path_beg /api/images/
 | 
				
			||||||
  acl tb_api_acl path_beg /api/ /swagger /webjars /v2/ /v3/ /static/rulenode/ /oauth2/ /login/oauth2/ /static/widgets/
 | 
					  acl tb_api_acl path_beg /api/ /swagger /webjars /v2/ /v3/ /static/rulenode/ /oauth2/ /login/oauth2/ /static/widgets/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  use_backend tb-http-backend if transport_http_acl
 | 
					  use_backend tb-http-backend if transport_http_acl
 | 
				
			||||||
 | 
					  use_backend tb-images-api-backend if tb_images_api_acl
 | 
				
			||||||
  use_backend tb-api-backend if tb_api_acl
 | 
					  use_backend tb-api-backend if tb_api_acl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  default_backend tb-web-backend
 | 
					  default_backend tb-web-backend
 | 
				
			||||||
@ -98,24 +136,76 @@ backend letsencrypt_http
 | 
				
			|||||||
  server letsencrypt_http_srv 127.0.0.1:8080
 | 
					  server letsencrypt_http_srv 127.0.0.1:8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
backend tb-web-backend
 | 
					backend tb-web-backend
 | 
				
			||||||
 | 
					  timeout queue 60s
 | 
				
			||||||
  balance leastconn
 | 
					  balance leastconn
 | 
				
			||||||
  option tcp-check
 | 
					  option tcp-check
 | 
				
			||||||
  option log-health-checks
 | 
					  option log-health-checks
 | 
				
			||||||
  server tbWeb1 tb-web-ui1:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4
 | 
					  server tbWeb1 tb-web-ui1:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
  server tbWeb2 tb-web-ui2:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4
 | 
					  server tbWeb2 tb-web-ui2:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
  http-request set-header X-Forwarded-Port %[dst_port]
 | 
					  http-request set-header X-Forwarded-Port %[dst_port]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
backend tb-http-backend
 | 
					backend tb-http-backend
 | 
				
			||||||
 | 
					  timeout queue 60s
 | 
				
			||||||
  balance leastconn
 | 
					  balance leastconn
 | 
				
			||||||
  option tcp-check
 | 
					  option tcp-check
 | 
				
			||||||
  option log-health-checks
 | 
					  option log-health-checks
 | 
				
			||||||
  server tbHttp1 tb-http-transport1:8081 check inter 5s resolvers docker_resolver resolve-prefer ipv4
 | 
					  server tbHttp1 tb-http-transport1:8081 check inter 5s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
  server tbHttp2 tb-http-transport2:8081 check inter 5s resolvers docker_resolver resolve-prefer ipv4
 | 
					  server tbHttp2 tb-http-transport2:8081 check inter 5s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dummy backends for a stick-table purpose only.
 | 
				
			||||||
 | 
					# There is only one stick-table per proxy. At the moment of writing this doc,
 | 
				
			||||||
 | 
					# it does not seem useful to have multiple tables per proxy. If this happens
 | 
				
			||||||
 | 
					# to be required, simply create a dummy backend with a stick-table in it and
 | 
				
			||||||
 | 
					# reference it
 | 
				
			||||||
 | 
					# https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#stick-table
 | 
				
			||||||
 | 
					backend st_src_rate10s
 | 
				
			||||||
 | 
					    stick-table type ip size 60k expire 10s store http_req_rate(10s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					backend st_src_rate1m
 | 
				
			||||||
 | 
					    stick-table type ip size 60k expire 1m store http_req_rate(1m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
backend tb-api-backend
 | 
					backend tb-api-backend
 | 
				
			||||||
 | 
					  timeout queue 60s
 | 
				
			||||||
  balance source
 | 
					  balance source
 | 
				
			||||||
  option tcp-check
 | 
					  option tcp-check
 | 
				
			||||||
  option log-health-checks
 | 
					  option log-health-checks
 | 
				
			||||||
  server tbApi1 tb-core1:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4
 | 
					
 | 
				
			||||||
  server tbApi2 tb-core2:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4
 | 
					  http-request track-sc0 src table st_src_rate10s
 | 
				
			||||||
 | 
					  http-request track-sc1 src table st_src_rate1m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  acl trustlist src -f /config/trustlist.txt
 | 
				
			||||||
 | 
					  http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 } !trustlist
 | 
				
			||||||
 | 
					  http-request deny deny_status 429 if { sc_http_req_rate(1) gt 300 } !trustlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  http-request set-header X-Forwarded-Port %[dst_port]
 | 
					  http-request set-header X-Forwarded-Port %[dst_port]
 | 
				
			||||||
 | 
					  server tbApi1 tb-core1:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
 | 
					  server tbApi2 tb-core2:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dummy backends for a stick-table purpose only.
 | 
				
			||||||
 | 
					# There is only one stick-table per proxy. At the moment of writing this doc,
 | 
				
			||||||
 | 
					# it does not seem useful to have multiple tables per proxy. If this happens
 | 
				
			||||||
 | 
					# to be required, simply create a dummy backend with a stick-table in it and
 | 
				
			||||||
 | 
					# reference it
 | 
				
			||||||
 | 
					# https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#stick-table
 | 
				
			||||||
 | 
					backend st_images_src_rate10s
 | 
				
			||||||
 | 
					    stick-table type ip size 60k expire 10s store http_req_rate(10s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					backend st_images_src_rate1m
 | 
				
			||||||
 | 
					    stick-table type ip size 60k expire 1m store http_req_rate(1m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					backend tb-images-api-backend
 | 
				
			||||||
 | 
					  timeout queue 60s
 | 
				
			||||||
 | 
					  balance source
 | 
				
			||||||
 | 
					  option tcp-check
 | 
				
			||||||
 | 
					  option log-health-checks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  http-request track-sc0 src table st_images_src_rate10s
 | 
				
			||||||
 | 
					  http-request track-sc1 src table st_images_src_rate1m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  acl trustlist src -f /config/trustlist.txt
 | 
				
			||||||
 | 
					  http-request deny deny_status 429 if { sc_http_req_rate(0) gt 1000 } !trustlist
 | 
				
			||||||
 | 
					  http-request deny deny_status 429 if { sc_http_req_rate(1) gt 3000 } !trustlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  http-request set-header X-Forwarded-Port %[dst_port]
 | 
				
			||||||
 | 
					  server tbImagesApi1 tb-core1:8080 check inter 10s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
 | 
					  server tbImagesApi2 tb-core2:8080 check inter 10s resolvers docker_resolver resolve-prefer ipv4 maxconn 50
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								docker/haproxy/config/trustlist.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								docker/haproxy/config/trustlist.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					# Trusted list is intended to do not apply any limitations for trustees
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Private subnet example
 | 
				
			||||||
 | 
					# 10.0.0.0/8
 | 
				
			||||||
 | 
					# Docker-compose subnet
 | 
				
			||||||
 | 
					172.16.0.0/12
 | 
				
			||||||
 | 
					# Local network subnet
 | 
				
			||||||
 | 
					192.168.0.0/16
 | 
				
			||||||
 | 
					# Allow loopback interface
 | 
				
			||||||
 | 
					127.0.0.1
 | 
				
			||||||
 | 
					::1
 | 
				
			||||||
 | 
					# Allow trusted IPs or CIDRs below
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user