Linux作为路由器(一)
前言: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作为路由器(一)的更多相关文章
- 将LINUX变成路由器
将LINUX变成路由器 2009-06-04 22:38:45 标签:LINUX 路由器 休闲 职场 版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. LINUX系统是一个强大 ...
- DHCP服务原理与搭建(Linux系统+路由器,二选一方案)
大家都知道上网的最基本前提是要在终端上设置IP.子网掩码.网关.DNS等地址信息,在家里或者在办公室很多时候打开电脑后发现就可以上网,并没有手动设置IP.掩码.DNS地址也能上网,这是什么原因呢?其实 ...
- Linux下使用Quagga(Zebra)搭建路由器记录(转)
写在前面 从22号中午开始琢磨zebra/quagga的用法,一直到晚上11点多都没有什么头绪.各种Google,百度,几近崩溃.由于网上关于zebra/quagga的配置方法都是在真实的若干台电脑上 ...
- 用Zebra打造Linux下小型路由器
用Zebra打造Linux下小型路由器 现在的Internet网络相当庞大,不可能在不同的网络之间建立直接的连接,所以这时就必须用路由器为不同网络之间的通信提供路径选择.Linux下搭建路由器价格非常 ...
- linux默认网关的设置
linux装系统设IP,这应该是系统管理员的基本功,可是不同的网络结构有不同的ip设法,您知道吗? 1.一块网卡的情况 这个没啥好说的,估计地球人都知道:address,netmask,gatew ...
- Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)
补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...
- Linux转发性能评估与优化(转发瓶颈分析与解决方式)
线速问题 非常多人对这个线速概念存在误解. 觉得所谓线速能力就是路由器/交换机就像一根网线一样. 而这,是不可能的.应该考虑到的一个概念就是延迟. 数据包进入路由器或者交换机,存在一个核心延迟操作,这 ...
- LInux Zebra
本文章摘自linux公社 https://www.linuxidc.com/Linux/2015-07/120224p1.htm 写在前面 从22号中午开始琢磨zebra/quagga的用法,一直 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
随机推荐
- poj 2195 Going Home(最小费最大流)
poj 2195 Going Home Description On a grid map there are n little men and n houses. In each unit time ...
- JDBC 实例--JDBC通过工具类DBUtil连接到数据库,让我们不再恐惧操作数据库
利用JDBC连接到数据库一般需要几个步骤: 1.装载驱动程序. 2.建立连接. 3.发送和执行SQL语句. 4.释放资源 首先建立一个数据库: 脚本如下: create database csdn; ...
- HTTP 协议中的 Transfer-Encoding
HTTP 协议中的 Transfer-Encoding 文章目录 Persistent Connection Content-Length Transfer-Encoding: chunked 本文作 ...
- ZooKeeper做独立server执行(上)
ZooKeeper做独立server执行(上) 作者:chszs.转载需注明.博客主页:http://blog.csdn.net/chszs 一.ZooKeeper安装及配置 版本号:ZooKeepe ...
- 更改npm全局模块和cache默认安装位置
来源于:http://blog.csdn.net/friendan/article/details/51736231 1.因为我安装的Node.js自带了npm,所以在nodejs文件夹里面新建以下两 ...
- iOS获取手机型号,Swift获取手机型号(类似iphone 7这种,检测机型具体型号)
获取手机设备信息,如name.model.version等, 但如果想获取具体的手机型号,如iphone5.5s这种,就需要如下这种(含Swift和OC两种写法) Swift建议添加到extensio ...
- window.postMessage实现网页间通信
window.postMessage() 方法可以安全地实现跨域通信.通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以 ...
- 【LeetCode】55. Jump Game
Jump Game Given an array of non-negative integers, you are initially positioned at the first index o ...
- su: user tomcat does not exist
http://www.cnblogs.com/allegro/p/5005352.html 问题在于 你的startup.sh 里面设置了 用户,你需要修改为root或者tomcat用户 这是开发 迁 ...
- 解决spring el表达式不起作用
el表达式不起作用,如下图所示 现象: 在显示页面中加入: <%@ page isELIgnored="false" %>就OK了 参考:http://bbs.csdn ...