在计算机网络中,网络地址转换(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. Java的反射和代理以及注解

    最近接触到java的反射和代理(接触的有点迟了...),还是有必要总结下 1. Java的反射 有的时候我们需要在程序运行的时候获取类.方法等信息用于动态运行,这个时候反射就能够帮我们找到类.方法.成 ...

  2. Django的模板语言介绍

    模板语言: 1.我们先看下在命令行中渲染模板 先导入模块对象 2.渲染一个变量 <p>当前时间:{{ time }}</p> return render(request,&qu ...

  3. 自定义 tableviewheader 高度显示不正常

    BUG : 自定义的Xib View, 设置为tableview分区头的时候  tableview 如果是plain 模式, 设置 sectionHeader,  sectionHeader会成为悬浮 ...

  4. vue-cli启动本地服务,局域网下通过ip访问不到的原因

    1.问题描述: 新开发了一个vue-cli项目,想通过手机查看效果,发现访问不到,ip地址和端口号都没错但是手机访问不到,在本机电脑浏览器输入ip端口号一样访问不到,只能通过localhost:808 ...

  5. Python发送邮件不需要发件人密码认证

    #!/usr/bin/python # coding: UTF-8 import smtplib from email.mime.text import MIMEText receivers_list ...

  6. Python高级用法篇——笔记

    1.Python3字典中items()和python2.x中iteritems()的区别 在Python2.x中,items( )用于 返回一个字典的拷贝列表[Returns a copy of th ...

  7. js和jquery获取span里面的值

    JQ和Js获取span标签的内容 html: 1 <span id="content">‘我是span标签的内容’</span> javascript获取: ...

  8. Codeforces 701C. They Are Everywhere 思路题

    C. They Are Everywhere time limit per test: 2 seconds memory limit per test:256 megabytes input: sta ...

  9. 【UML】UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的 ...

  10. 通过命令更新git for windows

    git update-git-for-windows 参考: https://github.com/PanJiaChen/vue-element-admin/issues/24 https://sta ...