先打预防针:还没有仔细阅读 Arch Linux Wiki 的 iptables 页面( xd
情况是这样的,有 A (代理)和 B (主机)两个 VPS,A 挂在 DNS 进行代理,通过 iptables dnat/snat 把指定端口的入战流量转发到 B 的端口上。目前使用的命令如图所示:(好吧没有图)
$ iptables -t nat -A PREROUTING -d <B IP> -p tcp --dport <B port> -j DNAT --to-destination <A IP>:<A Port>
$ iptables -t nat -A POSTROUTING -d <A IP> -p tcp --dport <B port> -j SNAT --to-source <B IP>
目前的问题是,B 里面通过 Nginx 反代的后端程式拿到的客户端 IP 永远是 的 IP,而不是真实的客户端 IP。请问 V2 各位诸神难呢个否提供点思路呢?多谢。
1
LGA1150 2019-03-16 00:17:58 +08:00 via Android
SNAT 之后源 IP 自然就是 A 的地址了
隧道了解一下 |
3
nfroot 2019-03-16 00:40:11 +08:00 1
@Trumeet
协议层是这样的 A 直接向 C 发送数据,数据包里有 A 的 IP,因为数据传输是互相的,没有来源对方不知道怎么和你回数据包。 A 通过 B 向 C 发送数据,数据包里的来源 IP 会改为 B 的,C 根本不知道 A 是谁,需要回传数据的时候会把数据往 B 的 IP 发送,全程只有 AB 知道 ABC,C 只知道 B。这个技术就叫 NAT 但是如果 ABC 都属于公网 IP 并且可以互访,理论上 A 可以从 B 转发数据,并保留源 IP,就是不做 NAT,只通过路由把数据包指向 C。 |
4
nfroot 2019-03-16 00:43:38 +08:00
如果是 HTTP 协议,可以考虑在 B 上面把 HTTP 请求包加上 A 的 IP。
|
5
LGA1150 2019-03-16 00:45:03 +08:00 via Android
@Trumeet 可以看成 VPN
A B 之间建立一个 IPIP 隧道 A 的 iptables DNAT 到 B 的隧道端 IP,不要做 SNAT B 上设置策略路由,使从隧道来的数据,从隧道回 鉴于对新手不友好,你可以在 A 上也运行个 nginx 反向代理 |
6
LGA1150 2019-03-16 00:56:50 +08:00 via Android
@nfroot #3 “理论上 A 可以从 B 转发数据,并保留源 IP ”
不用隧道的话,要 A B 在同一个广播域才可以,否则在公网转就是 IP spoofing 会被反向路由策略丢弃 |
7
electric 2019-03-16 12:16:05 +08:00
客户端拿 IP 是通过 nginx 的 http 协议键值对拿到的,前台 real-ip 请求头配置,后端读取。
|