前言:Linux主机能够做为路由器使用,利用路由转发功能实现不一样网络内的主机可以相互通讯,利用iptables的SNAT功能来实现企业内网主机访问互联网,下面作个小的实验。bash
实验环境:VM网络
(1)路由器Linux主机router:3d
通常来讲须要两块网卡:eth0 192.168.31.168 eth1 172.16.100.1 其中eth0使用桥接,eth1使用仅主机模式,这里我想你有必要了解VM三种网络模式的区别。router
(2)企业内网主机host1:blog
仅主机模式,eth0 172.16.100.6ip
(3)其余网段主机host2:路由
桥接模式:eth0 192.168.31.167table
(4)真正可以访问互联网的路由器MI_router,地址:192.168.31.1和一个拨号得来的公网地址xxx.xxx.xxx.xxx。class
一、首先实现hosts1和host2可以互相访问route
(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)检验是否可以互相访问:
这里咱们就实现了内部不一样网络内主机的通讯。
二、实现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: