can't setup nginx as transparent proxy server

Peng Xie paul_xie at riversecurity.com
Tue Aug 9 05:20:46 UTC 2016


Hi,

I am relatively new to nginx.  I would like to setup nginx as a
transparent reverse proxy.

Here is the topology of my network.
,----
| +------------------------+
| |                        |
| |   192.168.56.109:80    | <-- upstream which is the real http server on port 80
| |                        |
| +------------------------+
|            ^
|            |
|            |
| +------------------------+
| |                        |
| |   192.168.56.108:800   | <-- proxy_server which run nginx as a reverse proxy server on port 800
| |                        |
| +------------------------+
|            ^
|            |
|            |
| +------------------------+
| |                        |
| |     192.168.56.1       | <-- client
| |                        |
| +------------------------+
`----

Here is my nginx.conf.
,----
| server {
|        listen       800;
|        server_name  localhost;
| 
|        location / {
|                 proxy_pass       http://192.168.56.109:80;
|                 proxy_bind $remote_addr  transparent;
| }
`----

If not use proxy_bind, Cient can access upstream through
192.168.56.108:800. Of course, the proxy is not transparent in this
situation.

To make the proxy_server transparent, I read these documents: doc1)
[http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_bind]

doc2) [https://www.kernel.org/doc/Documentation/networking/tproxy.tx]

Add proxy_bind into nginx.conf according to doc1. Reload nginx:
,----
| nginx -s reload
`----

According to doc2, I write a shell-script as follow:
,----
| #!/bin/bash
| set -x
| sudo iptables -F
| sudo iptables -X
| 
| sudo iptables -t mangle -N DIVERT;
| sudo iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT;
| sudo iptables -t mangle -A DIVERT -j MARK --set-mark 1;
| sudo iptables -t mangle -A DIVERT -j ACCEPT;
| sudo ip rule add fwmark 1 lookup 100;
| sudo ip route add local 0.0.0.0/0 dev lo table 100;
| sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY  --tproxy-mark 0x1/0x1 --on-port 800;
`----

Now, I access proxy on client:
,----
| ➜  ~ curl -v http://192.168.56.108:800
| * Rebuilt URL to: http://192.168.56.108:800/
| *   Trying 192.168.56.108...
| * Connected to 192.168.56.108 (192.168.56.108) port 800 (#0)
| > GET / HTTP/1.1
| > Host: 192.168.56.108:800
| > User-Agent: curl/7.43.0
| > Accept: */*
| >
`----

And then I try port 80:
,----
| ➜  ~ curl -v http://192.168.56.108:80
| * Rebuilt URL to: http://192.168.56.108:80/
| *   Trying 192.168.56.108...
`----

Client can't access the upstream now!

Use proxy_bind to set a transparent proxy server may be a new feature on
nginx. I've searched for a long time. Does anybody have a suggestion?

Thanks Peng Xie




More information about the nginx mailing list