如何在通过iptables转发443端口后保留用户原始IP
嘿,我来帮你搞定这个问题!你现在遇到的情况是因为用了SNAT规则,它把用户的原始IP替换成了1serv的IP(99.99.99.99),所以2serv只能看到转发服务器的地址,而看不到真实的用户IP。要保留用户IP,我们需要调整iptables规则,同时确保路由配置正确。
问题根源
你之前添加的SNAT --to-source 99.99.99.99规则会修改出站请求的源IP,把用户的真实IP替换成转发服务器的IP。这就导致2serv收到的请求看起来都是来自1serv的,自然看不到用户的原始地址。
解决方案
我们需要去掉SNAT规则,转而依靠iptables的连接追踪功能,同时确保2serv的回程流量能通过1serv返回给用户。具体步骤如下:
1. 先清理旧的nat规则(可选,但能避免冲突)
iptables -t nat -F iptables -F
2. 确保IP转发功能开启
sysctl net.ipv4.ip_forward=1
如果需要永久生效(重启服务器后依然有效),编辑/etc/sysctl.conf文件,找到net.ipv4.ip_forward这一行,把值改成1,然后执行sysctl -p让配置生效。
3. 添加DNAT规则,将443流量转发到2serv
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -m state --state NEW -j DNAT --to-destination 111.111.111.111:443
这条规则会把进入ens3接口的新TCP 443连接,转发到2serv的443端口。
4. 允许转发已建立/相关的流量
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
这条规则允许已经建立的连接和相关的回程流量通过1serv,iptables会自动追踪连接状态,把回程流量正确转发回用户。
5. 允许转发到2serv的新443流量
iptables -A FORWARD -d 111.111.111.111 -p tcp --dport 443 -m state --state NEW -j ACCEPT
这条规则允许新的443请求转发到2serv。
关键配置:调整2serv的默认网关
你需要确保2serv的默认网关设置为1serv的IP(99.99.99.99),这样2serv的回程流量会先发送到1serv,再由1serv转发给用户。如果2serv和1serv不在同一个子网,可能还需要在1serv上添加静态路由,确保能到达2serv。
为什么这样能保留用户IP?
去掉SNAT规则后,用户的原始IP会被保留在请求的源地址中,2serv收到的请求源IP就是用户的真实地址。只要回程流量经过1serv,iptables的连接追踪机制会自动把回程流量的目的IP改回用户的IP,完成整个通信链路。
备注:内容来源于stack exchange,提问作者Sasha Kuperman

