在计算机网络中,网络地址转换(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. Musle比对软件

    下载地址:http://www.drive5.com/muscle/downloads.htm 1)运行: win+R然后输入cmd,然后cd进入muscle目录 2) 比对: muscle3.8.3 ...

  2. Maven命令行使用 mvn clean package

    先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令:  mvn clean package 执行结果如下: [INFO] Scanning ...

  3. referer null

    Referer表示超链接源的URL!你想看到实验效果,要从a-->(能过<a href="b.jsp")b页面,然后在B里可以取得Refere参数! String ur ...

  4. new operator

    [new operator] When the code new Foo(...) is executed, the following things happen: A new object is ...

  5. intellij idea14 +svn配置

    说明:使用TortoiseSVN客户端,安装时必须选择client tools,否则不会有svn.exe,也就不能支持intellij idea的svn插件,因为intellij idea是使用命令行 ...

  6. 转-git 配置用户名和邮箱

    原址:http://www.cnblogs.com/fsong/p/5540840.html 在安装了git for windows之后,个人总是忘记配置git config的命令,以此记录一下: 配 ...

  7. Java中Generics的使用

    1.Java的Generics与C++的Template由于Java的Generics设计在C++的Template之后,因此Java的Generics设计吸取Template的很多经验和教训.首先, ...

  8. 各种replace待续

    http://blog.163.com/chenjie_8392/blog/static/439339842010513128139/

  9. 3sum, 3sum closest

    [抄题]: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...

  10. Notepad++正则表达式格式 Editplus使用正则表达式[转]

          使用正则表达式可以很好地完成很多繁琐耗时的工作,以下抄录editplus正则表达式的使用,同样适用于notepad++:表达式 说明 \t 制表符. \n 新行. . 匹配任意字符. | ...