局域网有一台主机A,没有公网的IP, 也就是没有办法直接连到互联网上下载东西,同时内网有另外一台主机B,有公网接入。这个时候为了让A连接到互联网,我把B设置成NAT主机,A的网关指向B。
准确的来说,现在的相当于SNAT模式。分析一下数据包流向:

IP信息如下:
A: eth0: 10.122.70.74
B: eth1:10.122.70.65 / eth0:220.220.220.65

发送数据包:

A发送数据包时,B也就是NAT主机,分析数据包表头,将此数据包转到可以连接公网的Public IP上去。由于私有IP与公有IP不能互通,B会通过iptables的NAT table内的Postrounting链将数据包表头伪装成B的公网IP,并且将这两个不同来源的数据包对应关系写入暂存内存中,然后将数据包传送出去。此时传到互联网的这个数据包,已经表现为来自公网IP,而非来自局域网。

接收响应包:

当从互联网把数据响应给A时,会首先进入NAT主机B,B分析数据包的序号,对比刚刚记录到内存中的数据,由于发现该数据包为后端主机之前传送出去的,因此在NAT Prerouting链中,会将目标IP修改成为后端主机,即A的IP,然后发现目标已经不是本机公网IP,开始通过路由分析,将数据包传送到B的局域网接口,再传送到最终目标10.122.70.74上去。

B的设置如下:

#允许接受局域网网卡的数据包,
iptables -I INPUT -i eth1 -j ACCEPT

#开启路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward

#伪装数据包
iptables -t nat -A POSTROUTING -s 10.122.70.74 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.122.70.74 -j MASQUERADE

或者用SNAT直接修改IP数据包的表头来源IP
iptables -t nat -A POSTROUTING -o eth1 -j SNAT –to 10.122.70.74
如果支持多个IP
iptables -t nat -A POSTROUTING -o eth1 -j SNAT –to 10.122.70.74-10.122.70.100

A设置:
vi /etc/sysconfig/network-scripts/ifcfg-eth0

# Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.122.70.74
NETMASK=255.255.0.0
GATEWAY=10.122.70.65

===============================================
查看nat表链规则
iptables -t nat -L -n

删除POSTROUTING第一条规则
iptables -t nat -D POSTROUTING 1

参考:http://www.cellmean.com/linux%E4%B8%8B%E9%85%8D%E7%BD%AEsnat%E4%B8%8A%E7%BD%91

Linux下配置SNAT上网的更多相关文章

  1. 【转】 linux下配置squid 服务器,最简单使用方式

    linux下配置squid 1.什么是squid Squid cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器.Squid有广泛的用途,从作为网 ...

  2. Linux下配置一个VNC服务器

    在Linux下配置一个VNC服务器,并设置2个用户,要求其中一个用户登录时不需要输入密码. 然后在客户端使用ssh+vncview的方式访问. 1确认vnc安装 2配置vncserver 3测试vnc ...

  3. linux下配置mysql默认编码utf8

    linux下配置mysql默认编码utf8 下面是需要在对应地方加入的配置 [client] default-character-set=utf8 [mysqld] character-set-ser ...

  4. Linux下配置Lamp

    linux下配置lamp步骤: 一.快速安装Apache+PHP5+MySql 先更新: # yum update 然后安装LAMP环境:(163的yum源上只有php5.1.6 mysql 5.0. ...

  5. Linux下配置PHP开发环境

    转载于: http://www.uxtribe.com/php/405.html 该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件 ...

  6. 一步一步教你如何在linux下配置apache+tomcat(转)

    一步一步教你如何在linux下配置apache+tomcat   一.安装前准备. 1.   所有组件都安装到/usr/local/e789目录下 2.   解压缩命令:tar —vxzf 文件名(. ...

  7. Linux下配置Tomcat服务器

    Linux下配置Tomcat服务器和Windows下其实差不多,可以去官网下载安装包释放或者在线下载,只是当时下载的windows.zip文件,现在下载.tar.gz格式的即可,下面使用命令行的方式安 ...

  8. Linux下配置JDK

    下面以CentOS为例,详细说一下Linux下配置JDK的过程 首先按照约定俗成的习惯,将jdk放在/usr/local/java下,首先进入/usr/local然后新建一个目录java 然后我们需要 ...

  9. Linux下配置Node环境变量及问题详解

    这是之前在Linux下配置Node环境变量时踩过的坑,今天又有小伙伴询问这个问题,因此记录下来,不仅是给新童鞋们一些参考,也方便日后查阅 在这之前,相信都已经安装好了,没安装的可以查看博主另一篇文章 ...

随机推荐

  1. php ueditor 后台配置项返回格式出错,上传功能将不能正常使用!

    解决常见的有两种 1,可能是时区设置问题,有系统区分大小写. date_default_timezone_set("Asia/chongqing");改为 date_default ...

  2. -pie can only be used when targeting iOS 4.2 or later错误解决

    在工程的build setting里,把IPHONEOS_DEPLOYMENT_TARGET改成4.2或以上就行了

  3. CCF系列之有趣的数(201312-4)

    题目链接: http://115.28.138.223:81/view.page?opid=4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个 ...

  4. PreparedStatement和Statement区别

    在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement 一.代码的可读性和可维护性. 虽 ...

  5. asm文件开头的assume意义

    body, table{font-family: Consolas; font-size: 13.5pt} table{border-collapse: collapse; border: solid ...

  6. java中String的.trim()方法

    该方法去除两边的空白符 原理: 看看源码实现 public String trim() { int len = value.length; ; char[] val = value; /* avoid ...

  7. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  8. 深入理解Java虚拟机读书笔记(一)- java内存区域和垃圾收集

    jvm内存模型如下图 垃圾回收: 方法区: 这部分的垃圾回收性价比低,一般不要求回收,暂认为是永久代 heap:新生代和永久代之分.永久代主要回收废弃常量和无用的类. 垃圾回收算法: 1. 标记-清除 ...

  9. JavaScript this浅析

    在做聊天室的过程中,我遇到了一个小问题,在javascrip中,有没有和c语言中的静态变量类似的对象呢? 答案就在闭包之中. 而说到闭包,又得说说那个我视之如地雷的this.this搞明白了,闭包这东 ...

  10. HTTP请求和MIME介绍

    HTTP请求和MIME介绍 HTTP请求由三部分组成,分别是: 请求行,消息报头,请求正文. 请求行(格式): Method Request-URI HTTP-Version CRLF Method: ...