在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。根据规范,路由器是不能这样工作的,但它的确是一个方便且得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致了通信效率的降低。

以上是维基百科对NAT技术的描述,我这里就不做过多的评价了。

目前两种常用NAT类型:

  • SNAT
  • DNAT

  NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的。网络地址转换在很多国家广泛使用。例如:我们家用路由器就是一种NAT技术,它可以将局域网的内部地址转换为公网地址使内部地址可以像有公网地址的服务器一样进行网络通信。

Linux 6/7防火墙变动:

  • 6

  防火墙使用iptables命令进行配置。

  • 7

  防火墙使用firewall-cmd命令进行配置。可以在7中安装iptables并通过iptables对防火墙策略进行管理。yum -y install iptables,直接yum安装 即可,因为很多人用iptables可能会比用firewall-cmd命令更熟悉,至于firewall-cmd我也只是会几条简单的命令,还没有研究过,这里就是欠下的账,迟早有一天是要还的。

PREROUTING、POSTROUTING与SNAT、DNAT的对应关系:

  从图上看可能更容易理解吧,首先这个路由器可以简单的理解为家用路由器,下面的服务器可以简单的理解为连接在路由器下面的手机或者PC,实际上我们可以将这个路由器理解为一个网关设备,数据从局域网到广域网会通过网关进行协商来实现。

  我们来从Linux防火墙的角度简单的分析下局域网设备访问公网流量是如何进行传输的。

1. 局域网访问互联网会先经过NAT table的PREROUTING链;
2. 经过路由时进行判断数据包是否要进入本机;
3. 再经过Filter table的FORWARD链;
4. 通过NAT table的POSTROUTING链传送到互联网

  NAT服务的重点在于上述流程的第1和第4步,也是NAT table中的两条重要的链:PREROUTING和POSTROUTING,如果想要了解这两个链与SNAT、DNAT的对应关系,就必须知道他们各自的作用。

  • POSTROUTING:目的在于修改来源IP地址(DNAT)。
  • PREROUTING:目的在于修改目标IP地址(SNAT)。

  那么就下来就好解释上面的流程了,PREROUTING修改目标IP地址是因为当前我们的局域网地址无法访问互联网,如果将目标地址修改为192.168.1.1那么路由器存在公网IP,我们就可以通过公网IP对互联网进行访问,POSTROUTING修改源地址我们就可以理解为我们访问互联网的地址时必须使用的是Public IP而不是局域网地址,这就是通过POSTROUTING链进行修改后的结果,也可以看成入流量会经过PREROUTING链,出流量会经过POSTROUTING链,相信这么解释后大家应该就可以差不多明白了,那接下来就上操作了。

操作案例

  无论做那个转发操作都需要我们将内核的路由转发功能打开,有一下两种方式:

第一种:

sysctl net.ipv4.ip_forward=1

第二种:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

通过NAT直接访问内网服务器

iptables -t nat -A PREROUTING -p tcp --dport 12345 -j DNAT --to-destination 192.168.1.2:22

iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.2 -j SNAT --to-source 192.168.1.1

  我们这里也是同时使用了SNAT和DNAT,原因上面已经解释过了,执行的第一条命令是将所有发送到ens160这个网卡的12345端口请求转发给192.168.1.2的22端口,第二条命令是将192.168.1.2上发送的所有请求都看作是192.168.1.1发送的。接下来就可以ssh PublicIP:12345端口进行测试是否可以连接到内网主机了。

通过SNAT实现代理上网

  要实现的功能与上述实例恰好大致相反,我们需要在网关服务器上配置如下操作:

iptables -t nat -A POSTROUTING -o ens192 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1

内网云主机上配置网关操作:

ip route add 192.168.1.0/24 via 192.168.1.1

  后续测试内网网卡是否可以 ping通公网地址即可。

Linux SNAT/DNAT简单理解与案例分析。的更多相关文章

  1. (转)linux top命令中各cpu占用率含义及案例分析

    原文:https://blog.csdn.net/ydyang1126/article/details/72820349 linux top命令中各cpu占用率含义 0 性能监控介绍 1 确定应用类型 ...

  2. 《深入理解Java虚拟机》-----第5章 jvm调优案例分析与实战

    案例分析 高性能硬件上的程序部署策略 例 如 ,一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新的硬件为4个CPU.16GB物理内存,操作系统为64位CentOS 5.4 , Resin ...

  3. 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析

    作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...

  4. 从Docker在Linux和Windows下的区别简单理解Docker的层次结构

    上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的W ...

  5. python爬虫--案例分析之针对简单的html文件

    python爬虫常用的库:Python 库(urllib.BeautifulSoup.requests.scrapy)实现网页爬虫 python爬虫最简单案例分析:  对一个html文件进行分解,获取 ...

  6. 简单理解Linux的Loopback接口

    Linu支持环回接口( Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通TCP/IP进行通信. A 类网络127就是为环回接口预留的 .根据惯例,大多数系统把I ...

  7. 【BUAA软工】软件案例分析

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程结对编程项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 个 ...

  8. CSS3-3D制作案例分析实战

    一.前言 上一节,介绍了基础的CSS3 3D动画原理实现,也举了一个小小的例子来演示,但是有朋友跟我私信说想看看一些关于CSS3 3D的实例,所以在这里为了满足一下大家的需求,同时也为了以后能够更好的 ...

  9. K米APP案例分析

    关于 K米 -- 的案例分析 产品 K米的APP (全国KTV点歌,手机直播,互动,交友,预订)的Android客户端 第一部分 调研,评测 评测: 软件的bug,功能评测,黑箱测试 • 下载并使用, ...

随机推荐

  1. samtools 的应用

    1)sam转bam samtools view -bS in.sam > in.bam -b 意思使输出使BAM format -S 意思使输入使SAM,如果@SQ 缺剩, 要写-t

  2. 关于“Durian”调查问卷的心得体会

    这周我们做了项目着手前的客户需求调查,主要以调查问卷的方式进行.其实做问卷调查并不是想象中的那么简单,首先要确定问卷调查的内容,每一个问题都要经过深思熟虑,字字斟酌,既要切合问卷主要目的,又要简洁扼要 ...

  3. Find Peak Element(ARRAY - Devide-and-Conquer)

    QUESTION A peak element is an element that is greater than its neighbors. Given an input array where ...

  4. 数据流滑动窗口平均值 · sliding window average from data stream

    [抄题]: 给出一串整数流和窗口大小,计算滑动窗口中所有整数的平均值. MovingAverage m = new MovingAverage(3); m.next(1) = 1 // 返回 1.00 ...

  5. Mybatis的分页插件PageHelp:Page对象中的pageSize等属性无法序列化,无法转换为json字符串

    Page<User> page = new Page<>();        User user = new User();        user.setAge(20);   ...

  6. linux 版本号的查看

    1.# uname -a   (Linux查看版本当前操作系统内核信息)   Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 E ...

  7. win2003上传文件限制

    Windows2003系统下,上传较大的文件时,会出现“Request 对象 错误 'ASP 0104 : 80004005'”错误或者出现空白页面的时候,此时,不要轻易的去找程序的问题,有可能是wi ...

  8. oracle查找特定表的引用

    select * from user_source t where upper(t.TEXT) like upper('%table1%') 第二种方法类似于eclipse中的file search ...

  9. geoserver 通过代码实现发布地图服务

    GeoServer:代码实现批量发布地图服务 利用GeoServer发布WCS服务,那么如果我有很多数据需要进行发布,这样利用GeoServer提供的UI界面进行操作显然很不显示.那能不能利用GeoS ...

  10. 02 请求库之 selenium模块

      selenium模块   一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动 ...