zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    大名鼎鼎的红黑树,你get了么?2-3树 绝对平衡 右旋转 左旋转 颜色反转
    django 数据库连接模块解析及简单长连接改造
    django settings最佳配置
    Django 多数据库联用
    初步了解Shuttle ESB
    linux 线程切换效率与进程切换效率相差究竟有多大?
    进行mysql压力測试须要注意的几点
    POJ 2762 Going from u to v or from v to u?(强联通,拓扑排序)
    linux中O(1)调度算法与全然公平(CFS)调度算法
    LeetCode 121 Best Time to Buy and Sell Stock
  • 原文地址:https://www.cnblogs.com/jjzd/p/6503020.html
Copyright © 2011-2022 走看看