Hi, we have recently activated multi threading in our haproxy (version 1.8.14) and stumbled over the following problem:
we balance ftp via haproxy and after enabling multi threading, trying to transfer very small files via ftp sometimes failed, with log entries like this: Oct 20 22:45:58 vptest02 haproxy[11753]: 127.0.0.1:56631 [20/Oct/2018:22:45:58.787] ftp ftp/ftp 1/-1/0 0 CC 2/2/1/1/0 0/0 I could narrow down the problem to the option abortonclose. If enabled and the frontend receives the complete data transfer before fully establishing a connection to the backend the backend connection gets reseted and the line above is logged. Attached is a test haproxy configuration were i was able to reproduce the problem and a tcpdump showing the problem. I'm not sure if this is a bug or the documentation of the abortonclose option should be expanded. From the documentation I first thought that the option abortonclose only works in conjunction with mode http, because only the http protocol is mentioned. In tcp mode the question in my opinion is: "When is a connection aborted?". Thinking about it I came to the conclusion that the abortonclose can make sense on mode tcp too as long as the protocol used on the connection requires an answer from the server. But if that is the case then the documentation of abortonclose should explicitly mentioning that there are tcp based protocols with which it will produce errors because they don't expect an answer from the server. Regarding why it only happens with multi threading enabled: Could it be that a single threaded haproxy always opens the backend connection fully prior to closing the frontend connection and therefore avoided the problem altogether? But I'm no haproxy expert so I can be completely wrong and the issue is something completely differently. Please let me know if further information is needed to investigate this issue. Regards Reinhard Vicinus
global
cpu-map auto:1/1-4 0-3
nbproc 1
nbthread 4
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
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
#
https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
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-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
option abortonclose
timeout connect 5000
timeout client 50000
timeout server 50000
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 ftp
bind 127.0.0.121:21
bind 127.0.0.121:10000-10250
default_backend ftp
mode tcp
backend ftp
fullconn 128
mode tcp
server ftp 10.138.3.245 check port 21
abortonclose.pcap
Description: application/vnd.tcpdump.pcap

