前言:Linux主机可以作为路由器使用,利用路由转发功能实现不同网络内的主机能够相互通信,利用iptables的SNAT功能来实现企业内网主机访问互联网,下面做个小的实验。

实验环境:VM

(1)路由器Linux主机router:

一般来说需要两块网卡:eth0 192.168.31.168  eth1 172.16.100.1  其中eth0使用桥接,eth1使用仅主机模式,这里我想你有必要了解VM三种网络模式的区别。

(2)企业内网主机host1:

仅主机模式,eth0 172.16.100.6

(3)其他网段主机host2:

桥接模式:eth0 192.168.31.167

(4)真正能够访问互联网的路由器MI_router,地址:192.168.31.1和一个拨号得来的公网地址xxx.xxx.xxx.xxx。

1、首先实现hosts1和host2能够互相访问

(1)host1添加默认路由:

# route add default gw 172.16.100.1

使其指向router eth1

(2)host2添加默认路由:

# route add default gw 192.168.31.168

使其指向router eth0,方法同上

(3)router打开路由转发功能:

查看路由转发功能是否打开:# cat /proc/sys/net/ipv4/ip_forward  结果是0,则没有打开

临时打开方法:echo 1 > /proc/sys/net/ipv4/ip_forward

永久打开方法:修改/etc/sysctl.conf文件,net.ipv4.ip_forward = 1,然后执行sysctl -p

(4)检验是否能够互相访问:

这里我们就实现了内部不同网络内主机的通信。

2、实现host1访问互联网:

因为实验环境router默认网关指向了MI_router 192.168.31.1,所以router可以访问互联网,host2本身是桥接模式,网关指向router,router打开了路由转发功能,所以host2也可以访问互联网。

虽然host1网关也指向router,可以访问到MI_router网关,但是host1确无法访问互联网;

host1的请求能出去,但是不能接收到报文,MI_router无法将互联网返回的报文送达host1,原因如下:

  源地址172.16.100.6经过router转发,到达MI_router,MI_router进行SNAT,使得请求报文能够在互联网传送;

  被请求主机返回数据,MI_router再自动进行DNAT,发现源地址是172.16.100.6,MI_router就蒙圈了,他找不到这台主机;

  所以要解决的问题是怎么让MI_router返回数据给host1;

(1)MI_router我们无法修改其网关使其指向router,但MI_router能访问router这台主机,那能不能让MI_router认为源地址请求是从router发出的呢,答案是可以的;

   这就涉及到我们真正看的见得SNAT,当然,MI_router本身就已经实现了SNAT,这里我们自己手动实现,将host1的请求转化为router的请求,发送给MI_router

(2)在router上添加一条规则就可以搞定:

# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to 192.168.31.168

在nat表的POSTROUTING链上添加规则,所有来自172.16.0.0/16网络的主机请求,地址都被转换为192.168.31.168,192.168.31.168能访问互联网,数据报文返回到router时,它会自动进行DNAT,最终将数据返回给host1主机。

其实这个环境内,host1访问互联网经过了两次SNAT,到这里我们就实现了:内网地址通过SNAT实现访问互联网。

但是,你会发现,host1访问host2也会进行源地址转换,这不是我们想要的,ping请求为例:

host1:ping 192.168.31.167

在host2抓包会发现,是192.168.31.168在进行ICMP请求:

那么怎么调整呢,修改我们的SNAT规则即可:

# iptables -t nat -R POSTROUTING 1 -s 172.16.0.0/16 ! -d 192.168.31.0/24 -j SNAT --to 192.168.31.168

再次ping,抓包,OK,正常。

我们可以根据自己的需求更加精准的进行SNAT。

总结:Linux主机实现路由器部分功能

  (1)路由转发:需打开路由转发功能/proc/sys/net/ipv4/ip_forward为1

  (2)SNAT(源网络地址转换):iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to 192.168.31.168:

Linux作为路由器(一)的更多相关文章

  1. 将LINUX变成路由器

    将LINUX变成路由器 2009-06-04 22:38:45 标签:LINUX 路由器 休闲 职场 版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任.     LINUX系统是一个强大 ...

  2. DHCP服务原理与搭建(Linux系统+路由器,二选一方案)

    大家都知道上网的最基本前提是要在终端上设置IP.子网掩码.网关.DNS等地址信息,在家里或者在办公室很多时候打开电脑后发现就可以上网,并没有手动设置IP.掩码.DNS地址也能上网,这是什么原因呢?其实 ...

  3. Linux下使用Quagga(Zebra)搭建路由器记录(转)

    写在前面 从22号中午开始琢磨zebra/quagga的用法,一直到晚上11点多都没有什么头绪.各种Google,百度,几近崩溃.由于网上关于zebra/quagga的配置方法都是在真实的若干台电脑上 ...

  4. 用Zebra打造Linux下小型路由器

    用Zebra打造Linux下小型路由器 现在的Internet网络相当庞大,不可能在不同的网络之间建立直接的连接,所以这时就必须用路由器为不同网络之间的通信提供路径选择.Linux下搭建路由器价格非常 ...

  5. linux默认网关的设置

    linux装系统设IP,这应该是系统管理员的基本功,可是不同的网络结构有不同的ip设法,您知道吗? 1.一块网卡的情况   这个没啥好说的,估计地球人都知道:address,netmask,gatew ...

  6. Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)

    补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...

  7. Linux转发性能评估与优化(转发瓶颈分析与解决方式)

    线速问题 非常多人对这个线速概念存在误解. 觉得所谓线速能力就是路由器/交换机就像一根网线一样. 而这,是不可能的.应该考虑到的一个概念就是延迟. 数据包进入路由器或者交换机,存在一个核心延迟操作,这 ...

  8. LInux Zebra

    本文章摘自linux公社 https://www.linuxidc.com/Linux/2015-07/120224p1.htm   写在前面 从22号中午开始琢磨zebra/quagga的用法,一直 ...

  9. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

随机推荐

  1. C#时间戳转换[转发]

    http://www.cnblogs.com/qingliuyu/p/3835858.html 以下是C#下的日期与unix时间戳的相互转换: /// <summary> /// 日期转换 ...

  2. JavaScript中的数组与伪数组的区别

    在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function). 基本数据类型:String,boolean,Number,Undefined, Null 引用数 ...

  3. 深入PHP内核之array_multisort

    这个函数是我第一次看手册的时候,没看明白是怎么回事,所以有必要记录一下 用法 bool array_multisort ( array &$arr [, mixed $arg = SORT_A ...

  4. xml 引入约束文件

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  5. wubi.exe的工作原理

    wubi.exe的工作原理 Wubi没有修改系统分区,在一个Windows分区中安装了一个完整的Ubuntu系统.初看起来,这简直是不可能完成的任务.但是Wubi的确做到了.而我们要关心的是Wubi是 ...

  6. HDUOJ----(1084)What Is Your Grade?

    关键是自己没有读懂题目而已,不过还好,终于给做出来了...... What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  7. Linux下su与su -命令的本质区别

    大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -.前天我在使用us ...

  8. Python练习笔记——采用生成器函数实现两数之间的偶数计算

    题目:编写一个生成器函数myeven(start, end),采用迭代器逐次实现[start, end)范围内的偶数计算2 4 6 8. ... def myeven(start, end): whi ...

  9. python练习笔记——模拟双色球随机输出情况

    编写Python函数:完成一个双色球彩票的模拟生成过程, 其中前六个为蓝色球,数字范围1-33,不可重复.最后一个为红色球 1-16. 使用random完成,最后将7个数进行排列放到列表中 # 引入r ...

  10. JMeter学习笔记--使用URL回写来处理用户会话

    如果测试的Web应用系统使用URL回写而非Cookie来保存会话信息,那么测试人员需要做一些额外的工作来测试web站点 为了正确回应URL回写,JMeter需要解析从服务器收到的HTML,并得到唯一的 ...