2016年4月14日星期四

Tinc,Route Mode


目标:搭建一个反向vpn服务。

工具:tinc

工作模式:route

所需权限:Host1(root),Route/Firewall(root)

网络结构如下:
    当前权限位于Route/Firewall内的LAN中,网段为:192.168.1.0/24, 主机为192.168.1.121(下面图有错。)
    VPN所在的虚拟网段为10.0.0.0/8
    希望在Host1与vps server之间开一条隧道,通过vps server连入192.168.1.0/24。



配置可以参考官网给的windows下的配置:http://tinc-vpn.org/examples/windows-install/

Host1上的配置文件:
%TINC_HOME%/to_vps/tinc.conf
    Name = local_host
    ConnectTO = vps
    Interface = vpn


%TINC_HOME%/to_vps/hosts/local_host
    Subnet = 10.0.0.3/32
    Subnet = 192.168.1.0/24

附加Key后拷贝到vps server上的 %TINC_HOME%/vps/hosts/ 目录下

Host1上的网卡配置:

vps server上的配置文件
%TINC_HOME%/vps/tinc.conf
    Name = vps
    Interface = vpn


%TINC_HOME%/vps/hosts/vps
    Subnet = 10.0.0.2/32
 
附加Key后拷贝到Host1上的 %TINC_HOME%/to_vps/hosts/ 目录下

vps server上的网卡配置








配置好之后两台机器可以互通

 
 


现在需要增加配置,让vps server可以访问目标的192.168.1.0/24网段。
tinc启动后,vps server上的路由表是这样的

里面并没有到192.168.1.0/24的路由,需要手工添加。
Route add 192.168.1.0 mask 255.255.255.0 10.0.0.3 metric 1 if 14
解释一下这条路由:
目标网络
    192.168.1.0 mask 255.255.255.0 对应的就是192.168.1.0/24
网关
    10.0.0.3,对应的就是Host1那台主机
接口
    这里14是tinc所使用的虚拟网卡的网卡ID


刚开始以为只要配置了这条路由之后,就能访问内部的192.168.1.0/24网络了。
但是ping的时候却出问题了。




然后我就想这是什么毛病。。。想了很久想不明白,什么书都翻出来看了也没头绪,头都要炸了。算了干脆tcpdump抓个包看看。
这不是有东西么。。

在看看目标网络上的包情况。

这不是响应了么。。。
但是我在vps server为什么收不到?

看下包的详细信息吧。

下面那条192.168.1.111 > 10.0.0.2,响应的
在看看Host1上的arp table。
arp源地址 (ac:xx:xx:xx:xx:xx)对应的是192.168.1.111,这条没错。
arp 目标地址(50:xx:xx:xx:xx:xx)对应的是192.168.1.1 ,这尼玛是目标网段(192.168.1.0/24)的网关啊。

ICMP Reply没往Host1(192.168.1.121)上发,再由经tinc转回vps server,而是发到网关去了,难怪收不到。
怎么办?如果我在192.168.1.111上加一条arp记录,直接指定10.0.0.2的位置行不行?


看来不行 =,=

那加一条路由记录指定一下10.0.0.0/8网段的路由是不是就ok了?
往路由表里塞一条记录试试看。

加上了!!回去ping一下看看!

卧槽!通了。
抓包看看!

还是下面那条 192.168.1.111 > 10.0.0.2
arp源地址 (ac:xx:xx:xx:xx:xx)对应的是192.168.1.111,这条没错。
arp 目标地址(00:xx:xx:xx:xx:xx)对应的是Host1(192.168.1.121) ,这是Host1的mac地址,这下没错了。

那我现在要让192.168.1.0/24的所有机器都能和vps server互通,是不是要一台台机器去加路由=,=。
这不科学。。。

然后我就想,既然10.0.0.2被路由到了192.168.1.1。那我直接在192.168.1.1上加个路由是不是就ok了?
先把192.168.1.111的路由删了,然后上192.168.1.1去试试。


删了。然后不通了。。。

上192.168.1.1去加



加上了




好激动。。在回去ping试试看。



都通了!!

这里有几个概念没搞明白,导致问题折腾这么久。
首先vpn所处的网段10.0.0.0/8和目标网段192.168.1.0/24是不同的网段。
需要路由的介入两个网段才能完成通信。
虽然在vps server上添加了到达192.168.1.0/24的路由记录。
数据包从vps server上的tinc服务到达Host1上的tinc服务,并由Host1送达目标网络上的主机流程如下。
Ping 192.168.1.111后
ICMP Echo数据包首先通过vps server上的路由记录

送达tinc所管理的虚拟网卡(10.0.0.2)上,vps server上的tinc服务将该数据包转发给Host1上的tinc服务
因为目标地址192.168.1.111与Host1(192.168.1.121)处在相同网络,通过路由表+arp表。

可以找到192.168.1.111的位置。(Host1开启了ip转发功能)
(
Windows上同样需要开启IP转发功能



比较蛋疼,需要重启
)
接下来ICMP Echo数据包会到达192.168.1.111。
此时数据包的源地址为10.0.0.2。
问题就出在这!192.168.1.111在回应ICMP Reply数据包的时候会检查自己的路由表,查找10.0.0.2这个IP地址的下一站在哪。

而没有经过配置的192.168.1.111的路由表是没有10.0.0.0/8这个网络下一条的地址的。
于是ICMP Reply被送往默认网关(路由表中的第一条记录)

很明显,网关也没经过配置,自然也不知道10.0.0.0/8的下一跳在哪,所以将该ICMP Reply丢弃。
这就导致了在vps server虽然有了通往192.168.1.0/24网段的路由,但是却无法ping通192.168.1.111的问题。
网络间的互通不仅需要路由的介入,还需要每台主机上的路由表介入。
这下192.168.1.0/24上的主机,也能直接与10.0.0.2通信了。


没有评论:

发表评论