Forward Proxy

L'esercizio è simile a quello del Forward Proxy di Apache.

Creazione della directory di esercizio:

cd ~/ex
mkdir 03net2-ccli-cproxy-cweb
cd 03net2-ccli-cproxy-cweb

Creazione dello scaffolding:

mkdir ccli cproxy cweb
touch ccli/Dockerfile docker-compose.yml
tree

Il client ccli rimane quello del precedente esercizio:

vim ccli/Dockerfile
FROM alpine:3.7
MAINTAINER John Smith <john@stormforce.ac>

RUN apk --update add --no-cache openssh tcpdump curl

CMD ["/bin/sleep","1000000"]

Il cproxy sarà un'immagine nginx:alpine. Il server web target rimane un'immagine httpd:2.4-alpine, come in precedenza.

Creaiamo un volume docker per la persistenza della configurazione:

docker volume create ngproxy-conf

Il docker-compose.yml è:

vim docker-compose.yml
version: '3.6'

services:
  one:
    build: ccli
    image: ccli
    container_name: one
    hostname: one
    cap_add:
      - ALL
    networks:
      net1:
        ipv4_address: 192.168.101.11
  two:
    image: nginx:alpine
    container_name: two
    hostname: two
    cap_add:
      - ALL
    volumes:
      - ngproxy-conf:/etc/apache2
    networks:
      net1:
        ipv4_address: 192.168.101.10
      net2:
        ipv4_address: 192.168.102.10
  three:
    image: httpd:2.4-alpine
    container_name: three
    hostname: three
    cap_add:
      - ALL
    networks:
      net2:
        ipv4_address: 192.168.102.12
networks:
  net1:
    name: net1
    ipam:
      driver: default
      config:
        - subnet: 192.168.101.0/24
  net2:
    name: net2
    ipam:
      driver: default
      config:
        - subnet: 192.168.102.0/24
volumes:
  ngproxy-conf:
    external: true

Partenza del progetto:

docker compose up -d

Collegamento al server nginx:

docker exec -ti two sh

Nella directory di configurazione:

cd /etc/nginx

Modifichiamo il file di configurazione di default:

vi conf.d/default.conf
server {                                                       
    listen       8080;
    server_name  localhost;

    location / {
        proxy_pass http://$http_host$uri$is_args$args;
    }

}

La direttiva proxy_pass abilita il server come Forward Proxy.

La stringa http://$http_host$uri$is_args$args invia al server downstream la stessa URI che ha ricevuto dal client.

I componenti sono:

  • $http_host - URL della richiesta originale
  • $uri - path della richiesta originale
  • $is_args - query string della richiesta originale
  • $args - altri argomenti della richiesta orinale

Testare la configurazione col comando:

nginx -t

Restartare il server col comando:

nginx -s reload

Uscire:

exit

Connettersi a one e provare se il proxy funziona:

docker exec -ti one sh
export http_proxy=http://192.168.101.10:8080
curl http://192.168.102.12