有时候我们会在一个已有网络(10.10.10.0/24)内组建一个实验网络(192.168.1.0/24),网络结构如上图所示。

假设我们不能控制(修改)A网络内除D主机以外的系统配置,但可以完全控制网络B内的主机。

此时Server D实际上要承担一个路由的角色(它有两张网卡分别在两个网络A,B内)

所以先打开其上的内核路由转发功能,修改/etc/sysctl.conf中的如下配置

net.ipv4.ip_forward = 1

保存后应用查看

# sysctl -p
net.ipv4.ip_forward = 1

另外需要保证Server D上的路由表配置正确,这里我们假设D上10.10.10.103所在的接口为eth0, 而192.168.1.1所在的接口为eth1

最后将网络B内的主机的默认网关都设置为Server D的192.168.1.1地址,到此准备工作已经完成。下面可以采用不同的方法来使得网络B和网络A中的主机实现不同程度的互联。

SNAT

如果想让B网络内的所有主机单向访问A网络内的资源可以在Server D上做一个NAT(SNAT):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这种方法就是最常用的NAT,内部网络B中的主机可以主动发起请求访问的外网A中的资源,实现内外网主机通信,但是外网A内的主机无法主动与内网主机建立连接。内网B中的主机没有A网内的独立IP。

如果只想让某台B网中的主机访问A网,则可以限定来源IP,具体可以参考iptables手册:

iptables -t nat -A POSTROUTING -s 192.168.100.100 -o eth0 -j MASQUERADE

SNAT + DNAT + ARP代理 = 浮动IP

如果我们想为网络B内的Server E分配一个IP如10.10.10.104,使得网络A内的主机可以直接访问主机E

此时我们可以在Server D上先做一个SNAT:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to-source 10.10.10.104

这样网络A网络收到Server E发出的包时,看到的IP就是10.10.10.104,其响应也会回发给这个地址

然后我们在Server D上做一个DNAT:

 iptables -t nat -A PREROUTING -i eth0 -d 10.10.10.104 -j DNAT --to-destination 192.168.1.100

这样Server D收到目的IP为10.10.10.104的包时就会修改目的IP为网络B内的Server E的IP(192.168.1.100),自然的按照Server D上的路由规则这个包会从接口eth1出去,经过交换机B,到达Server E。

现在还存在一个问题,我们不能修改网络A内的主机配置,怎么做才能让IP为10.10.10.104的包发到Server D来(因为主机D自己的IP是10.10.10.103)。如果我们自Server D上再插入一张网卡,让后将其地址设为10.10.10.104就可以,不过我们没有必要这么做。我们在主机D的eth0接口上加入一个次级地址即可

ip addr add 10.10.10.104/24 dev eth0

这样网络A内的主机在使用ARP协议查询10.10.10.104所对应的MAC地址时,Server D就能做出响应,发送一个虚拟的MAC地址,于是发往10.10.10.104的包就会到达主机D,在进行上述的DNAT步骤,两边就可以互通了。

服务端口映射 SNAT + DNAT

浮动IP的方案需要占用一个网络A的IP,且会完全暴露主机E,有时可以通过端口映射向外部网络A暴露网络B内的服务,如将Server D上的2222端口与Server E上的22端口建立映射,这样网络A内的主机访问10.10.10.103:2222实际就是访问网络B内的主机192.168.100:22。

Linux ARP代理 与 NAT的更多相关文章

  1. Linux ARP缓存配置和状态查看命令

    查看Linux ARP缓存老化时间 cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time同目录下还有一个文件gc_stale_time,官方解释如 ...

  2. Linux配置代理IP

    Linux配置代理IP: vim /etc/profile http_proxy=http://username:password@ip:port/ https_proxy=http://userna ...

  3. Linux网络配置:Nat和桥接模式详解

    Linux网络配置:Nat和桥接模式详解 一.我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机: VMnet1:用于 ...

  4. ARP/代理ARP

    1.ARP首先讲到ARP,ARP是地址解析协议,它的作用是在以太网环境下,通过3层的IP地址来找寻2层的MAC地址,得到一张ARP缓存表.转发数据的时候根据ARP缓存表来进行传输.下图详细说明数据传输 ...

  5. Linux iptables用法与NAT

    1.相关概念 2.iptables相关用法 3.NAT(DNAT与SNAT) 相关概念 防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP ...

  6. ARP 地址分类 NAT技术

    第1章 OSI回顾 1.1 TCP/IP协议族组成 应用层 主机到主机层   互联网层   网络接入层 1.2 总结应用层掌握的协议与端口号对应关系 http(80) telnet(23) ftp(2 ...

  7. linux 做gw(nat)详细配置

                          linux 做企业网关gw(nat)详细配置   最近因为公司的路由器老化导致上网时断时续,上半小时网就断一次网,为此我头疼不已,本着为公司节约成本的宗旨, ...

  8. linux cntlm代理的配置

    在linux下需要配置代理上网,如yum, wget等.如果直接配置windows下的代理,如下: export http_proxy=http://<proxyIP>:<port& ...

  9. linux ARP攻击处理

    今天部门受到arp攻击 多说机器无法正常联网了,windows下的绑定下mac地址或者打开360arp防火墙就就ok了.我讲讲linux下的arp攻击的发现和处理吧.边学边讲,说的不对的欢迎大家指出, ...

随机推荐

  1. 数据解析之xpath

    一.环境安装 下载lxml pip install lxml 二.使用 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取 ...

  2. count failed: not master{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at src/mongo/shell/query.js:191在SECONDARY节点无法show dbs

    count failed: not master{ "note" : "from execCommand", "ok" : 0, " ...

  3. 在 MVC 中使用 ninject Lazy Load的一个想法

    这这里先声明一下,引用了一个 (http://www.edcourtenay.co.uk/musings-of-an-idiot/2012/11/23/lazy-binding-with-ninjec ...

  4. 阻止datagrid填充已经获取到的远程数据

    时光流逝,弹指挥间,不经意的一年又如路上一个动人的靓影悄然消失在视线里.我们往往都是先问自己,我们收获了什么,然后才想到我们付出了什么,很少有人先问自己这一年付出了什么,然后再去看所得.话不多说了,祝 ...

  5. 按钮重复点击问题 UIbutton

    .h #import <UIKit/UIKit.h> #import <objc/runtime.h> @interface UIControl (XY) @property ...

  6. SpringBoot中 application.yml /application.properties常用配置介绍

    # Tomcat server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 port: 10444 ser ...

  7. 在 Domoticz 中添加插座开关

    前言 继上一篇的折腾,将 WiFi 插座刷为 ESPEasy,这次介绍一下在 Domoticz 中启用该插座的方法 步骤 在 Domoticz 控制台,设置 → 硬件中添加 Dummy,名称为&quo ...

  8. C++_类和动态内存分配6-复习各种技术及队列模拟

    知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...

  9. 找出数组中的最小值(es5/es6)

    1.命令式编程,只需要迭代数组,检查当前最小值是否大于数组元素,如果是更新最小值即可. var s = [2,3,4,5,6,7,8]; for(var i=0,m=s.length;i<m;i ...

  10. ansys14.0 从入门到精通

    凌桂龙 李战分 2013.2 清华大学 FLUENT流体计算应用教程 索书号:TB126-39 ZW2.1     单元 结点 和 自由度 载荷 与 边界条件 : 关系 就是约束 , 边界条件是 结构 ...