4层TCP转发后获得真实IP之proxy_protocol
目录
需求
后端TCP Server在经过TCP代理(nginx stream模块)后,程序不做任何调整获得用户真实IP。 了解到cloudflare的spectrum产品与我们这个需求一致,刚好有细节和源码分享,参考如下:
- https://blog.cloudflare.com/mmproxy-creative-way-of-preserving-client-ips-in-spectrum/
- https://github.com/cloudflare/mmproxy
有公司参考cloudflare的mmproxy,用golang实现了性能更优的版本。
部署
拓扑与cloudflare spectrum产品一样,示意图如下:
- go > 1.11
- as root or with
CAP_NET_RAW
capability to be able to setIP_TRANSPARENT
socket opt.
go get github.com/path-network/go-mmproxy
sudo setcap cap_net_raw=+ep $(readlink -f $(which go-mmproxy))
测试
- 启动
# go-mmproxy监听端口为25577,TCP后端端口为25578
ip rule add from 127.0.0.1/8 iif lo table 123
ip route add local 0.0.0.0/0 dev lo table 123
go-mmproxy -l 0.0.0.0:25577 -4 127.0.0.1:25578 -6 "[::1]:25578" -allowed-subnets ./path-prefixes.txt
- 停止
# 清理路由
ip rule del from 127.0.0.1/8 iif lo table 123
ip route del local 0.0.0.0/0 dev lo table 123
FAQ
- 目前无法做到多端口映射,一个端口就得启动一个进程