在计算机网络中,网络地址转换(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. spring boot 启动方式

    一:IDE 运行Application这个类的main方法 二:在springboot的应用的根目录下运行mvn spring-boot:run 三:使用mvn install 生成jar后运行 先到 ...

  2. nat 类型及打洞原理

    nat 类型分4种 1.全锥形 full cone A 与 主机B交互,nat转换 A的内部地址及端口为  ip1 port1,ip1和port1为对外地址,任何机器能访问. 2.ip 受限制(对B而 ...

  3. Java List/HashSet/HashMap的排序

    在对Java无序类集合,如List(ArrayList/LinkedList).HashSet(TreeSet有序).HashMap等排序时,Java中一个公共的类Collections,提供了对Ja ...

  4. 网页中引用优酷视频去广告自动播放代码[xyytit]

    很多时候需要在网站中加入视频,可视频太大放自己服务器上太占空间,可以把视频上传到优酷网上,这样节省了空间,打开速度方面也会有不少提升.下面教大家如何引用自动播放的优酷视频.把下面的代码加在你网页适当位 ...

  5. iOS下JS与OC互相调用(八)--Cordova简单实战

    新建工程,添加Cordova 关键类 新建一个工程TestCordova 然后添加:confug.xml.Private 和 Public 两个文件夹里的所有文件 然后build 发现报错 为什么有会 ...

  6. springmvc中Controller方法的返回值

    1.1 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. 1.2 返回void 在controller方法形参 ...

  7. 并发编程(三)Promise, Future 和 Callback

    并发编程(三)Promise, Future 和 Callback 异步操作的有两个经典接口:Future 和 Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这 ...

  8. using directive 使用指令,与using declaration使用声明。

    使用指令是把名字空间中的所有名字引入到当前作用域,而使用声明是把名字空间的某个名字引入到当前作用域中 语法如下 //test.cpp #include<iostream> //using ...

  9. 二进制搭建kubernetes多master集群【开篇、集群环境和功能介绍】

    本文主要说明kubernetes集群使用组建的版本和功能介绍.. 一.组件版本 Kubernetes 1.12.3 Docker 18.06.1-ce Etcd 3.3.10 Flanneld 0.1 ...

  10. 说说wee sing(ZZ)

    我自己在当当上买过wee sing,也在网上下了wee sing 的DVD,也借过同事在淘宝上买的Wee sing 套装(9cd + 5DVD).所以对这套资料还是很熟悉的.      淘宝上的套装卖 ...