前言: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. MVC5 的MicrosoftOwinSecurity扩展插件——微信,QQ登录第三方源码

    https://github.com/jxnkwlp/Microsoft.Owin.Security.QQ-WebChat

  2. TRIZ系列-创新原理-25-自服务原理

    自服务原理的详细表述例如以下:1)物体在实施辅助和维修操作时.必须能自我服务:2)利用废弃的材料和能量: 自服务原理的第1)个比較好理解,假设一个系统在执行过程中须要进行辅助和维护操作时,最好不要借助 ...

  3. 新浪微博api出现认证失败问题 (获取code字段值的问题)

    出现该提示的原因:`` - 说: (2015-10-30 18:06:14)回调地址不一致,`` - 说: (2015-10-30 18:07:38)请在编辑开发者信息中将网站地址和应用信息--高级信 ...

  4. C语言printf

    1.调用格式为  printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部 ...

  5. 同域名不同端口应用共享sessionid问题解决办法

    相同域名共享sessionid 如 www.abc.com www.abc.com/test www.abc.com:8080 www.abc.com:8989 这些地址由于是在相同的域名下,所以共享 ...

  6. 怎么将手动设定的IP变成固定的自动IP.

    怎么将手动设定的IP变成固定的自动IP. 基本原理是 是用的MAC 地址来绑定你的IP地址 方法1左下角 开始→运行→输入  cmd  回车→输入 ipconfig /all 用来查看你的MXC地址 ...

  7. 触发器学习笔记(:new,:old用法)

    触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序         用于保持数据的完整性或记录数据库操作信息方面         触发器不能够被直接调用,只能够 ...

  8. PHP-Open Flash Chart报表生成

    下载: http://www.cnblogs.com/huangcong/archive/2013/01/27/2878650.html 安装: 解压ZIP包, 将open-flash-chart.s ...

  9. .NET的多种事务处理

    Oracle 的事务操作,有时候想在批量操作数据集合的时候,执行一次失败,即为了避免数据异常,将所有的操作回滚..NET给我们提供了良好的事务操作,Oracle端也有事务操作,可以灵活使用,此处介绍. ...

  10. Foundations of Machine Learning: The Margin Explanation for Boosting's Effectiveness

    Foundations of Machine Learning: The Margin Explanation for Boosting's Effectiveness 在这一节,我们要回答的一个问题 ...