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:

  • 相关阅读:
    numpy 基础 —— np.linalg
    图像旋转后显示不完全
    opencv ---getRotationMatrix2D函数
    PS1--cannot be loaded because the execution of scripts is disabled on this system
    打开jnlp Faild to validate certificate, the application will not be executed.
    BATCH(BAT批处理命令语法)
    oracle vm virtualbox 如何让虚拟机可以上网
    merge 实现
    Windows batch,echo到文件不成功,只打印出ECHO is on.
    python2.7.6 , setuptools pip install, 报错:UnicodeDecodeError:'ascii' codec can't decode byte
  • 原文地址:https://www.cnblogs.com/jjzd/p/6503020.html
Copyright © 2011-2022 走看看