iptables进行DNAT(目标地址转换)

本文介绍了一种通过iptables配置DNAT的方式,实现将公网流量转发到内网服务器的具体步骤。使用VM环境模拟了真实场景,包括宿主机访问内网服务器的过程,并验证了配置的有效性。

前言:对于Linux服务器而言,一般服务器不会直接提供公网地址给用户访问,服务器在企业防火墙后面,通常只是暴露一个公网给用户,下面已80端口进行实现。

演示环境:VM

(1)host:

  172.16.100.6(假设是互联网用户)

(2)提供公网的服务器netfilter:

  192.168.31.168 80端口暴露给用户

(3)后端服务器realserver:

  192.168.31.167 8080端口提供服务,nginx作为服务器

 

1、首先我们用我们的宿主机访问8080,验证服务是否正常

服务OK;

2、netfilter添加DSAT转换规则:

iptables -t nat -A PREROUTING -d 192.168.31.168 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.31.167:8080

 3.host访问192.168.31.168 80端口,验证是否OK

 

OK,访问正常。

nginx后端日志可以看到host的访问记录:

很简单的实现了DNAT。

那么我们的宿主机能不能直接访问192.168.31.168:80呢,答案是不可以,这个可以自己下去思考。

 

总结:防火墙可以实现内部主机对外服务,DNAT:iptables -t nat -A PREROUTING -d 192.168.31.168 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.31.167:8080;

  我们可以称他为地址映射,端口转换。

 

<think>我们之前讨论了Netfilter框架,其中prerouting阶段发生在路由决策之前。DNAT目标地址转换)在prerouting阶段执行的原因主要与路由决策的时机有关。 理由: 1. 路由决策需要基于数据包的目标IP地址来确定数据包的流向(是发给本机、转发还是其他)。 2. 如果我们需要改变数据包的目标地址(比如端口转发,将访问公网IP的数据包转发到内网服务器),那么必须在路由决策之前修改目标地址,这样路由决策才能根据新的目标地址做出正确的路径选择。 例如,假设我们有一个公网IP 203.0.113.1,我们希望将访问该IP的80端口的数据包转发到内网服务器192.168.1.100的80端口。那么当数据包到达时,其目标IP是203.0.113.1,但我们需要在路由决策前将其目标IP改为192.168.1.100。这样,系统在路由决策时就会根据新的目标IP(192.168.1.100)判断该数据包应该转发到哪个接口(比如内网接口eth1),而不是按照原来的目标IP(203.0.113.1)可能会被当作发给本机的数据包处理(因为203.0.113.1是本机的公网IP,如果不做DNAT,系统会认为这个包是发给自己的,从而进入INPUT链,而不是FORWARD链)。 因此,DNAT必须在prerouting阶段完成,以确保路由决策基于修改后的目标地址。 另外,SNAT(地址转换)则必须在postrouting阶段进行,因为SNAT需要知道数据包要从哪个接口出去(即路由决策已经完成),然后才能根据出口接口的IP修改地址。而且,在路由决策之前,我们可能还不知道数据包会从哪个接口出去,所以无法确定SNAT的地址。 总结:DNAT在prerouting阶段执行是为了影响后续的路由决策;而SNAT在postrouting阶段执行是因为它依赖于路由决策的结果(出口接口)。 现在,根据规则,我们需要在回答后提出3-5个相关问题。</think>### DNAT必须在Prerouting阶段执行的原因 在Netfilter框架中,**DNAT目标地址转换)必须在Prerouting阶段执行**的核心原因在于**路由决策的依赖性**。以下是关键机制: 1. **路由决策依赖目标地址** - 路由引擎(如Linux内核的路由表)**完全依赖目标IP地址**决定数据包去向(本地处理/转发/丢弃)。 - 若DNAT不在路由前完成,系统将基于**原始目标IP**做出错误路由: - 本应转发的包可能被误判为本地处理(进入`INPUT`链) - 或需转发的目标子网未被正确识别 2. **DNAT的本质需求** - DNAT的典型场景:端口转发、负载均衡、公网服务映射到内网服务器 - **示例**:将访问 `公网IP:80` 的请求重定向到内网服务器 `192.168.1.100:80` ```bash iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100 ``` - **若在Postrouting执行DNAT**:路由引擎仍看到原始目标IP `203.0.113.1`,误认为需本地处理,导致转发失败 3. **与SNAT的对比逻辑** | **转换类型** | **依赖对象** | **执行阶段** | **原因** | |-------------|-------------------|--------------|-----------------------------| | **DNAT** | 目标IP(影响路由) | Prerouting | 路由决策需基于修改后的目标IP | | **SNAT** | 出口接口(路由结果)| Postrouting | 转换需知道最终出口接口的IP | 4. **技术流程验证** ```mermaid graph LR A[数据包进入] --> B(Prerouting阶段) B --> C{DNAT修改目标IP} C --> D[路由决策] D --> E[根据新目标IP选择路径] E --> F[转发或本地处理] ``` - **关键点**:路由模块读取的是DNAT修改**后**的目标IP > **典型案例**:防火墙将公网请求转发到内网Web服务器。若DNAT延迟到Postrouting,数据包会因目标IP仍是公网地址而被错误提交给本地系统(而非转发),导致服务不可用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值