热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iptablesnat

NAT一般情况下分为SNAT,DNAT和PNAT此篇主要讲述的是使用iptables配置NAT,所以这3种NAT的区别和应用场景就简单的说明一下SNAT


NAT一般情况下分为SNAT,DNAT和PNAT

此篇主要讲述的是使用iptables配置NAT,所以这3种NAT的区别和应用场景就简单的说明一下

 

SNAT:源地址转换

目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机

目前大多都是解决内网用户用同一个公网地址上网的情况

DNAT:目标地址转换

和SNAT相反,源地址不变,重新修改目标地址,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机

在DNAT的基础上,可以根据请求数据包的端口做PNAT(端口转换,也称为端口映射),可以更句请求数据包不同的端口改写不同的目标地址,从而发送给不同的主机

这在用一个公网地址做不同服务时用的比较多,而且相对来说,用NAT的方式可以隐藏后端服务器的真实地址,更加的安全

 

在使用iptables实现nat之前,再来回头说说iptables的基础原理

wps_clip_image-8909

在这个模型中,完成nat的实现,数据要经过prerouting—forword--postrouting这3个链

 

分析SNAT的数据流向过程

首先进入prerouting,发现不是本网段的地址,而后开始查找路由表(查找路由的过程在prerouting和forword之间),于是经过forword链进行转发,在通过postrouting时进行NAT转换。

在这个流程中,NAT转换的步骤在postrouting链上实现,之所以不再prerouting上做nat是因为数据包在进来之前,还不知道是本网段地址还是外网地址

 

再分析DNAT的数据流向过程

在DNAT中,NAT要在prerouting链上做。之前提到过,在数据进入主机后,路由选择过程是在prerouting和forword之间的,所以应该先做地址转换之后,再进行路由选择,而后经过forword,最后从postrouting出去

 

理论说了一堆,接下来用实验环境来验证下(用dia画的图,比较搓。。。在ubuntu下将就用下了。)

wps_clip_image-5955

其中pc1是我本机,系统是ubuntu12.04,NAT和PC2是vmware虚拟机

 

nat主机网络配置

wps_clip_image-30602

 

SNAT

在做nat之前,要先把路由功能打开,不然数据包连forword都过不了

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

 

添加nat表项

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.16.93.0/24  -j SNAT --to-source 10.0.0.1

表示在postrouting链上,将源地址为172.16.93.0/24网段的数据包的源地址都转换为10.0.0.1

 

查看下表项

wps_clip_image-21165

 

验证效果:

先看下本机的网络配置

wps_clip_image-28305

添加一条去往10.0.0.0/24网段的静态路由

lust@host:~$ sudo route add -net 10.0.0.0/24 gw 172.16.93.129

 

然后在主机上对vmnet1网段进行抓包

lust@host:~$ sudo tcpdump -i vmnet1 –v

 

在主机上ping 10.0.0.2,观察抓到的包

wps_clip_image-28528

通过抓包可以发现,去往10.0.0.2的源地址为10.0.0.1,说明nat成功的将源地址改写

  
 
以上是实验验证部分
 
 
 
这里再介绍一个SNAT的常用选项:MASQUERADE
 
此选项可以用在动态获取IP地址的主机,常用在家庭adsl拨号上
 
iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -o eth1 -j MASQUEREADE
 
在这里最好使用-o 接口来明确指定从哪个接口出去,MASQUEREADE会调用该接口的地址作为源地址出去(不指定接口也可以,不过在主机上有多个IP地址的情况下最好配置一下)
 
 DNAT
 
对于DNAT就不再做实验验证了,和SNAT是差不多的,这里介绍下常用的几种用法
 
 
 
在DNAT中,要把规则定义在PREROUTING链中
 
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1
 
此条规则将请求IP为10.0.0.1的数据包转发到后端172.16.93.1主机上
 
 
 
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1
 
此条规则将请求IP为10.0.0.1并且端口为80的数据包转发到后端的172.16.93.1主机上,通过定义不同的端口,就可以实现PNAT,将同一个IP不同的端口请求转发到后端不同的主机
 
 
 
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1:8080
 
此条规则在上条规则的基础上,发往后端的数据包的目标端口改为8080,在后端主机的web服务器上使用8080端口接收访问, 这样能更好的保护后端主机
 
 
 
 
iptables系列NAT部分就写到这里,有什么不明白的可以留言探讨。下一篇将会讲述使用iptables的7lay实现7层的访问控制,也就是在第一篇中所说的网关代理型防火墙,可以实现控制qq,bt等应用程序的网络访问


推荐阅读
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
author-avatar
葬宝御用小奶瓶2004
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有