用IPTABLES的NAT表来实现数据转发
背景
项目中有台虚拟机,每天凌晨1:00 - 08:00 总会有几次莫名奇妙的超时,原因未知。虚拟机只部署了NGINX,用NG做转发请求到接口服务器上,为了验证下是不是NG用户态工作的时候哪个地方导致了卡顿,于是采用iptables的方案将NG收到的请求直接转到物理机上去。
主机清单
主机IP | 用途 | 类型 |
---|---|---|
192.168.1.1 | NGINX | 虚拟机 |
192.168.1.10 | NGINX | 物理机 |
详细需求
将主机192.168.1.1 的8080端口的TCP协议的请求,全部通过iptables的nat表转发给192.168.1.10 物理机的8080端口
规则如下
通过查阅相关资料和测试环境验证,需要在192.168.1.1 和192.168.1.2 主机上添加以下内核参数以及iptables规则
一、配置内核参数,重要,必须设置net.ipv4.ip_forward允许转发
sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sudo sysctl -p
二、添加iptables 规则
iptables -t nat -A PREROUTING --dst 192.168.1.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:8080
iptables -t nat -A POSTROUTING --dst 192.168.1.10 -p tcp --dport 8080 -j SNAT --to-source 192.168.1.1
验证
- 通过191.168.1.2 主机向192.168.1.1 主机的8080端口发起请求,可以发现,192.168.1.1主机上的NGINX并未记录任何访问日志。
- 同时,192.168.1.10主机的NGINX 记录对应请求(标明实际情况转发给物理机了),同时访问日志记录的remote_addr字段的值为192.168.1.1,对物理机上的NGINX来说,该请求被识别为 192.168.1.1主机来的,至此,验证结束,转发正常。