O 'problema' foi que o Django enviou um cabeçalho 'Vary: Cookie' o tempo todo . Eu acho que é por causa do plugin 'auth', mas eu não investiguei isso, apenas deletei o cabeçalho quando a resposta voltou do servidor.
Veja o que o documento de Varnish tem a dizer sobre "vary: cookie":
Another example of bad usage is when using only Vary: Cookie to differentiate a response. Again, there could be a very large number of cookies and hence a very large number of cached objects, which are going to be retrieved most likely only by their original requesters.
Fonte: link
Aqui está a aparência da minha configuração do VCL (removi a parte superior, que é simplesmente a configuração do servidor):
sub vcl_recv
{
# caching only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
}
sub vcl_backend_response
{
if (bereq.url == "/") {
unset beresp.http.Vary;
return(deliver);
}
}