1.      目的

图1

如图1所示,有A,B两台计算机,其中A配置成普通PC,B是网关。实现由A向一个不存在的IP 发起tcp连接,并能向这个不存在的ip发送数据。 同时响应这个tcp连接的是B中的一个应用程序。

2.      环境搭建

图2

如图2所示,A为普通PC,系统为32位WIN7,内装WireShark,CM网络调试助手。

B也是普通PC,系统为32位 Ubuntu14.04,内置WireShark,mNetAssist 网络调试助手。

A,B使用普通网线直连,网络配置如图2。

3.      命令介绍

图3

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有效地管理Linux防火墙。

3.1 iptables具有Filter, NAT, Mangle, Raw四种内建表:

3.1.1. Filter表

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

  • INPUT链 – 处理来自外部的数据。
  • OUTPUT链 – 处理向外发送的数据。
  • FORWARD链 – 将数据转发到本机的其他网卡设备上。
3.1.2. NAT表

NAT表有三种内建链:

  • PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
  • POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
  • OUTPUT链 – 处理本机产生的数据包。
3.1.3. Mangle表

Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:

  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING
3.1.4. Raw表

Raw表用于处理异常,它具有2个内建链:

  • PREROUTING chain
  • OUTPUT chain
  • Rules包括一个条件和一个目标(target)
  • 如果满足条件,就执行目标(target)中的规则或者特定值。
  • 如果不满足条件,就判断下一条Rules。

3.2 IPTABLES 规则(Rules)

3.3 IPTABLES 部分命令介绍

iptables –list查看当前系统存在的规则

iptables –flush 或者iptables –F 删除现有的所有iptables规则

iptables -t NAT –F 删除 NAT表内的规则
3.3.1 iptables语法

-t   表示table,代表iptable的哪种内建表。 如iptables -t NAT(指操作NAT内建表)

-A   表示Append,代表新的规则将追加到链的名称, 如iptables -t nat -A PREROUTING(在NAT内建表中的PREROUTING链添加规则)

-d   表示Destination 标地址或者网络地址,如-d 192.168.2.3(ip数据报的目的地址是192.168.2.3的帧),-d 192.168.2.1/24(ip数据报的目标地址为192.168.2.X的所有帧)

-s    表示source 源地址或者网络地址 同-d配置一样

-p  表示protocol 议, 如-p udp(udp协议)

--dport  表示目标端口,只有使用了-p 才可以使用—dport或者—sport(源端口) 如

-p udp --sport 20008(upd协议的数据报并且 源端口是20008的帧)

--sport 源端口

-j 表示 jump to target 执行目标,-j之前都属于包的过滤条件,-j后是指对指定的数据报的操作,如-j SNAT(对过滤后的指定包 进行源地址替换)

--to 替换后的目标值  如-j SNAT --to 192.168.2.3:20008(把源地址的ip地址替换为192.168.2.3,端口替换为20008)-j DNAT --to 192.168.2.3(把过滤后的数据报的目的地址替换为192.168.2.3)

4.      实验

图4

4.1 DNAT实验

1,在B计算机的终端中 执行

sudo iptables -t nat -A PREROUTING -d 192.168.2.3  -j DNAT --to 192.168.1.1

(对所有目标地址是192.168.2.3的数据报的目标地址改为192.168.1.1) 也就是说 所有B计算机网卡收到的数据报中,有目标地址为192.168.2.3的ip数据报 全部变成了目标地址为192.168.1.1的ip数据报,然后再过路由。

2, 在A中打开CM网络调试助手,选择TCP Client ,目标地址为192.168.2.3,端口随便填,这里填写20003, 如图A-1。 在B中打开 mNetAssist 网络调试助手, 选择TCP服务器。如图B-1

3,在B中打开服务器,A中连接,并发送aaa。B中接收到后发送bbbb。

图A-1

图B-1

4,图A-1,B-1是实验结果图,在图B-1中我们可以看到 192.168.1.1确实收到了aaaaaa,同时wireshark中显示的是192.168.1.109向192.168.2.3发送的数据aaaa。 同时A中也可以接收到192.168.2.3回复的bbbb。 但是这个bbbb在程序的逻辑上是由192.168.1.1发出去的。

所以我猜想在做DNAT的实验的时候,192.168.1.1在回复数据时,必然被DNAT重新把ip改成了192.168.2.3。

4.2 SNAT实验

1,在B中终端执行

sudo iptables -t nat -A POSTROUTING -s 192.168.1.1  -j SNAT --to 192.168.2.3

(对所有源地址为192.168.1.1的ip数据包,使其源地址为192.168.2.3),也就是说从B从发出去的ip数据报,没有一帧的源地址为192.168.1.1

2,把B配置成tcp 客户端,目标地址192.168.1.109 端口为20004。把A机配置成TCP 服务器,端口为20004.

3,B机发送bbbb,可以在图A-2中发现A机收到了bbb ,但是收到的是192.168.2.3发过来的数据。同时A机向192.168.2.3发送aaaa,A机收到数据。

图A-2

图B-2

4.3 UDP 指定端口 SNAT实验

1,上面两个实验是针对对ip数据报。 这里我们对udp做SNAT。 在B机终端中执行

sudo iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --sport 20008   -j SNAT --to 192.168.2.3:20008(所有从B机发出去的源地址为192.168.1.1的upd数据报,并且发送数据的端口为20008, 发出去之前源地址被改成192.168.2.3 端口同样为20008)

2,A机配置成udp,本机ip地址192.168.1.109,端口20006。目标主机192.168.2.3,端口20008,B机配置成udp,本机ip地址192.168.1.1,端口20008。目标主机192.168.1.109,端口20006,

3,B机发送bbbb,A机接收到192.168.2.3 的bbbb,A机发送aaaa,B机同样可以接受到aaaa

图A-3

图B-3

4.4 UDP 指定端口 DNAT实验

1,在B机终端中执行

sudo iptables -t nat -A PREROUTING -d 192.168.2.3 -p udp --dport 20008 -j DNAT --to

192.168.1.1:20008

(所有发向B机的目的地址为192.168.2.3 并且端口为20008的upd,全部把目标地址改成192.168.1.1)

2,A机配置成udp,本机ip地址192.168.1.109,端口20006。目标主机192.168.2.3,端口20008,B机配置成udp,本机ip地址192.168.1.1,端口20008。目标主机192.168.1.109,端口20006,

3, A机发送aaaa,B机可以接受到192.168.2.3的aaaa。同样B机发送bbbb,A机也可以收到bbb。

图A-4

图B-4

5.      结论

Iptables的 DNAT,SNAT是既可以针对IP数据报,也可以针对udp协议(或者tcp协议)做NAT。功能非常强大,详细功能可以参考图3。但是要注意一点,SNAT,DNAT都是双向的。 也就是说你对B机做了SNAT,sudo iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --sport 20008   -j SNAT --to 192.168.2.3:20008。  如果这时你用A机向192.168.2.3:20008发送udp数据包时,B机收不到数据。  如果你先用B机的192.168.1.1:20008向192.168.1.109:20006发送udp,然后再用A机机向192.168.2.3:20008发送udp数据包 B机才可以接受到数据。  这是因为无论SNAT,还是DNAT,要先由一段把数据链路打通,另一端才可以沿着这个链路把数据返回。

6.      参考资料

http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html

ubuntu 中DNAT SNAT配置实验.的更多相关文章

  1. Ubuntu中安装和配置 Java JDK,并卸载自带OpenJDK(以Ubuntu 14.04为例)

    1.下载jdk-7u67-linux-x64.tar.gz 2.用ftp客户端工具filezilla上传到ubuntu的合适文件夹.如果如果不能上传到指定文件夹可能是文件夹权限不足,修改文件夹可执行权 ...

  2. 在ubuntu中安装与配置zsh与oh-my-zsh

    先补充点东西 1.ubuntu中默认安装了那些shell jiang@Linux:~$ cat /etc/shells # /etc/shells: valid login shells/bin/sh ...

  3. ubuntu中防火墙iptables配置

    特别说明:此文章完全转载于https://www.cnblogs.com/EasonJim/p/6851007.html 1.查看系统是否安装防火墙 root@localhost:/usr# whic ...

  4. iptables中DNAT的配置方法

    1.一对一流量完全DNAT 首先说一下网络环境,普通主机一台做防火墙用,网卡两块 eth0 192.168.0.1  内网 eth1 202.202.202.1 外网 内网中一台主机 192.168. ...

  5. ubuntu中为hive配置远程MYSQL database

    一.安装mysql $ sudo apt-get install mysql-server 启动守护进程 $ sudo service mysql start 二.配置mysql服务与连接器 1.安装 ...

  6. Ubuntu中FTP安装配置及基本概念(原创)

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/ftp-inst ...

  7. 在ubuntu中配置深度学习python图片分类实验环境

    1 安装numpy,scipy, matplotlib, sudo apt-get install python-numpy sudo apt-get install python-scipy sud ...

  8. ubuntu中VNC的安装配置笔记

    使用服务器时,利用远程桌面是非常方便的,否则需要跑到服务器机房操作非常的费事,或者需要远程操作机器是也可以使用,一般的操作系统都会带有远程桌面功能,但是不如第三方的的软件好用,对于linux系统常用的 ...

  9. Ubuntu中配置Java环境变量时,出现command not found问题解决记录

    百度出Ubuntu中配置Java环境变量时,在利用sudo gedit /etc/profile 对profile编辑后, 在terminal中输入 sudo source /etc/profile, ...

随机推荐

  1. Java Exceptions

    invalid end header( bad central directory size) 异常描述 java.util.zip.ZipException: invalid END header ...

  2. 使用btrace来找出执行慢的方法

    转载于:https://shaojun.name/2016/07/260 btrace script import static com.sun.btrace.BTraceUtils.name; im ...

  3. 怎样看待IT界业务,技术,管理的各自比重

    怎样看待IT界业务,技术,管理的各自比重   技术是根本,业务是个人能力的体现,管理一般随意,追求简单,眼光向IBM等有优秀管理经验的大公司看齐   重点从个人的喜好.性格方面来考虑分配比重,可以加上 ...

  4. 神文章1:去年(2011)一年干了些啥? -vivo神人

    评论: 来自豆瓣的vivo神人,之前不知道有着一号牛逼的人物,觉此人博学.有正义感,其中有一片文章述说了中国近代经济演变历史情况,于我感触很深.因时间关系,没通读,有时间一定读完(微博口水杂录简略看了 ...

  5. js跨域问题解释 使用jsonp或jQuery的解决方案

    js跨域及解决方案 1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说, ...

  6. Android 热修复 Tinker接入及源码浅析

    一.概述 放了一个大长假,happy,先祝大家2017年笑口常开. 假期中一行代码没写,但是想着马上要上班了,赶紧写篇博客回顾下技能,于是便有了本文. 热修复这项技术,基本上已经成为项目比较重要的模块 ...

  7. linux文件系统 - 初始化(二)

    加载initrd(上) 一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可 ...

  8. 使用JDBC改变Oracle的session參数 NLS_DATE_FORMAT

    近期项目除了一个问题,场景大概是这种,项目在国外开发.在项目开发过程中使用了大量的Oracle函数TO_DATE,可是开发者没有写第二个參数. 所以项目在国外的server上能够正常执行.但是在国内的 ...

  9. cassandra运行出现了Unable to gossip with any seeds,cqlsh链接不上,提示connection refused处理办法

    cassandra运行出现了Unable to gossip with any seeds,cqlsh链接不上,提示connection refused处理办法 问题描述 当启动了cassandra之 ...

  10. php把采集内容中图片地址下载并替换成本地地址

    把字符串中地址全部获取到一个数组我们利用preg_match_all函数 代码如下 复制代码 <?php$str='<p><img border="0" s ...