Linux无疑是非常强大的。我们现在来考虑这么一个网路情况,顺便学习下linux强大的网络功能。
情况是这样的,我们有3个网络环境:
1: 平时工作的地方,网络是192.168.5.0/24。
2:另外一个部门,在另外一个楼里边,网络是:192.168.8/0/24。
3:有一个对外的机房,机房的内网地址是:192.168.4.0/24。
现在.4和.8之间已经通过点对点VPN链接起来了。而.5跟.8也通过VPN链接起来了。问题是IT忘记了在.4和.5之间配置VPN了。倒起数据那个辛苦啊。
有人会说了,不辛苦啊,用ssh port forward吧,好主意。也是一个好工具。如果只是.5和.8之间某两台服务器之间传输数据,这种方法无疑是非常简单方便的。但是机房里边有好多机器要访问啊。还是麻烦。
回头看看,既然.5和.8之间已经有了VPN,我们是不是可以通过ipip来把.5和.8放到同一个逻辑上在一个子网内呢?
答案是肯定的。我们可以通过ipip来实现。
假定,我们.5的ip是:192.168.5.31,.8服务器的ip是192.168.8.31。
在.8上,我们运行如下命令:
modprobe ipip
modprobe ip_gre
ip tunnel add tun0 mode gre remote 192.168.5.31 local 192.168.8.31
ip link set tun0 up
ip addr add 10.0.0.1 peer 10.0.0.2 dev tun0
ip route add 10.0.0.0/24 dev tun0
iptables -F
在.5上,我们同样运行类似的命令:
modprobe ipip
modprobe ip_gre
ip tunnel add tun0 mode gre remote 192.168.8.31 local 192.168.5.31
ip link set tun0 up
ip addr add 10.0.0.2 peer 10.0.0.1 dev tun0
ip route add 10.0.0.0/24 dev tun0
iptables -F
我们可以看出,.5和.8现在互相可以通过ping 10.0.0.X网络了。
但是我们的问题还是没有解决,如何在.5上访问到.4网络呢?
我们试着在.5上增加一条路由表:
route add -net 192.168.4.0/24 gw 10.0.0.1 dev tun0
发现还是不行。为啥不行,在8.31上抓包看到.8上已经收到.5.31上发出来的数据包了。但是由于系统缺省是不做转发的,所以,系统把这个数据包给扔掉了。
看到这里,就简单了。还需要两个步骤就能收工了。
第一步:打开转发。
echo 1 > /proc/sys/net/ipv4/ip_forward
或者通过sysctl来控制。
第二步,做SNAT
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o br0 -j MASQUERADE
这里的br0是因为.8上使用了网桥,如果没有网桥,可以把包转到你希望的对外链接设备上,比如eth0。
到此,在5.31上就可以透明的访问到.4网段了。