O valor de client.ip é 127.0.0.1 porque nginx é o cliente. Não faria sentido que o Varnish mascare esse valor - mesmo em situações como a sua em que o Verniz está sentado atrás de um proxy de front-end, muitas vezes você deseja basear as decisões no endereço IP da coisa que realmente faz a conexão com o Varnish.
O que você realmente quer fazer é ter nginx colocando o endereço IP do cliente remoto em um cabeçalho dedicado (que você já está fazendo com X-Real-IP ) e usá-lo para tomar decisões de conexão. Fazemos exatamente isso em nosso ambiente em que o Apache fornece conectividade SSL na frente de varnish e, em seguida, usamos esse cabeçalho para tomar decisões de acesso.
Não é tão bom quanto usar client.ip (você não pode igualar usando acl s), mas funciona. Nós fazemos algo assim:
if (! (
req.http.X-Real-IP ~ "^10\." ||
req.http.X-Real-IP ~ "^100\.100\." ||
req.http.X-Real-IP ~ "^200\.200\."
)) {
error 403 "Forbidden";
}
O Varnish não fornece um mecanismo nativo para substituir client.ip por um cabeçalho personalizado, mas é possível resolver o problema de qualquer forma porque você pode inserir código C arbitrário em sua configuração.
Aqui é um exemplo que é exatamente paralelo ao seu situação que inclui um exemplo de substituição de client.ip por outro valor para que possa ser usado em ACLs de Varnish.