用IPTABLES的NAT表来实现数据转发

Iptables NAT转发实战

用IPTABLES的NAT表来实现数据转发

背景

项目中有台虚拟机,每天凌晨1:00 - 08:00 总会有几次莫名奇妙的超时,原因未知。虚拟机只部署了NGINX,用NG做转发请求到接口服务器上,为了验证下是不是NG用户态工作的时候哪个地方导致了卡顿,于是采用iptables的方案将NG收到的请求直接转到物理机上去。

主机清单

主机IP用途类型
192.168.1.1NGINX虚拟机
192.168.1.10NGINX物理机

详细需求
将主机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主机来的,至此,验证结束,转发正常。
### 使用iptables配置NAT转发规则 为了使网络地址转换(NAT)正常工作,必须先启用内核的IP转发功能。这可以通过编辑`/etc/sysctl.conf`文件并设置`net.ipv4.ip_forward = 1`来完成[^4]。 #### 配置内核参数 ```bash sudo vim /etc/sysctl.conf ``` 在该文件中加入或修改如下行: ``` net.ipv4.ip_forward = 1 ``` 保存更改后运行命令应用新的配置: ```bash sudo sysctl -p ``` #### 添加iptables NAT规则 对于源NAT(SNAT),当内部网络中的设备访问外部互联网时,其私有IP地址会被替换为公共网卡上的合法外网IP地址。下面的例子展示了如何将来自特定子网的数据包源地址更改为指定的公网IP: 针对整个子网进行SNAT操作可以这样写入命令: ```bash iptables -t nat -I POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 3x.112.x.xxx ``` 如果只需要对某个具体的TCP连接做SNAT,则可加上协议和目的端口条件: ```bash iptables -t nat -I POSTROUTING -p tcp -d 172.16.44.210 --dport 80 -j SNAT --to 172.16.44.1 ``` 而对于目标NAT(DNAT),则是改变进入的数据包包头的目的地址字段,通常用于把对外的服务请求重定向到实际提供服务的服务器上去。例如,要将到达某台机器8080端口HTTP流量转向另一台主机相同端口,应该这样做: ```bash iptables -t nat -A PREROUTING --dst 192.168.1.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:8080 ``` 最后还需要确保POSTROUTING链中有相应的MASQUERADE或者SNAT规则以便回应报文能够正确返回给客户端: ```bash iptables -t nat -A POSTROUTING --dst 192.168.1.10 -p tcp --dport 8080 -j SNAT --to-source 192.168.1.1 ``` 以上就是使用iptables配置基本NAT转发的方法概述。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值