https://www.simaek.com/archives/275/
此前一直使用CentOS运行OpenVPN多客户端程序,并在RouterOS将远程子网路由到此机器上,配置上有点复杂,也可能存在性能问题。
因此,这次打算直接在我所使用的网关RouterOS上配置。
0、简述环境
简单描述一下网络坏境,假设现在有两个网段,一个为家庭内网,一个为公司内网。
家庭网络拥有网关权限,所以可以将OpenVPN服务端部署在家庭网关上。这也是这次主要调整的地方。
在此之前,服务端部署在家庭内网中的一台CentOS中,和客户端模式一致。这需要在网关配置路由,将OpenVPN的流量路由到CentOS,多了几次跳转。
而公司内网因为没有网关的配置权限,所以仍然延续此前的模式。
网络拓扑说明,懒得画图,将就一下,自行脑部出画面就好。
192.168.88.0/24 家庭网络
内网卡:lan1,外网卡:wan1
运行服务端
服务运在网关:192.168.88.1
隧道地址:10.10.10.1
路由:192.168.1.0/24 -> 10.10.10.1
192.168.1.0/24 公司网络
内网卡:eth0
运行客户端
服务运行在非网关:192.168.1.110
隧道地址:10.10.10.2
路由:192.168.88.0/24 -> 10.10.10.1
1、连接RouterOS
本篇采用RouterOS的命令行工具进行操作,可以通过telnet亦或ssh连接到你的网关。
如果使用WinBox,也可以在左侧菜单中点击New Terminal打开终端进行操作。
使用终端操作的好处的命令便于复制,无需截图。喜欢用RouterOS的朋友们相对都有一些网络基础,应该习惯使用终端操作。
2、使用RouterOS内置证书管理工具创建证书
为了便于操作,首先切换到/certificate
上下文,创建证书大部分操作都在这里,如果不特别说明,此步骤的命令均在此上下文进行操作。
下面的命令依次创建CA根证书,OpenVPN的Server端证书,一个OpenVPN的客户端证书。
如果有多个客户端,重复第三条命令,注意须保证每个客户端证书的common-name唯一。
接下来给证书进行签名。
如果有多个客户端,重复第三条指令对每个客户端的证书进行签名。后续步骤凡涉及多客户端的,均需要类似操作,不再赘述。
2、为OpenVPN分配IP地址池
创建一个IP地址池用于为客户端分配IP,需要给服务端预留地址,服务端地址不能在此范围内。
3、创建OpenVPN配置文件
创建一个配置文件,服务器地址为10.10.10.1,远程分配地址为刚刚创建的地址池。dns-server可以设置也可以忽略。
创建一个密码,用于OpenVPN用户验证,name表示用户名,password为密码,profile为上一步创建的配置文件,service选择ovpn。
4、配置OpenVPN接口
配置OpenVPN接口,默认配置文件使用上一步创建的,证书选择第一步创建的服务端证书,启用客户端证书验证,验证方法选择sha1,加密算法全部选上。
5、配置防火墙
在防火墙input链中增加一条过滤规则,放行OpenVPN的数据。需要关注protocol选项,取决你使用tcp或者udp模式。
6、导出CA证书和客户端证书
将第1步签名后的证书导出到文件,export-passphrase
可以为证书设置密码,为了方便,此处CA证书设置为空表示不需要密码。客户端使用密码,否则后续无法提取密钥key。
导出的文件在Files菜单中,需要使用Winbox下载到本地电脑。
7、去除客户端证书密码(可选)
考虑到在客户端作为服务自动运行,启动需要密码不太方便,此处可以去掉密码.
这一部需要使用到Linux或者类Unix系统,使用大部分系统都会自带的openssl进行操作。
对于Windows系统,可以通过终端模拟器来完成,例如Cygwin、GitBash。
在出现提示后,输入上一步导出key时设置的密码,即可得到不需要密码的key了。
8、编写客户端配置文件
使用如下脚本将证书导入配置文件,客户端证书使用无密码的证书。
使用此配置文件启动客户端,测试网络连通性,在客户端ping服务端。
在服务端(RouterOS)ping客户端。此时还没有配置固定IP,所以可能会有出入,根据实际客户端获取到的IP来测试。
同时在RouterOS的/interface
列表中也能看到当前连接的用户。
9、子网间路由
用户接口绑定
OpenVPN连接之后,生成的接口名称是动态的,不利于配置。可以在此设置接口绑定,这在配置防火墙、路由规则的时候非常有用。
这会添加添加一个名为company的接口,表示到公司的隧道,绑定到用户simaek的连接上,然后在防火墙等需要配置接口的地方,便可以使用company作为接口进行配置。即使更改了用户,只需要在绑定记录上更新用户名,其他配置都不需要进行变更了。
服务端子网路由
配置OpenVPN最佳用途是连接两个子网,RouterOS无法通过cdd那样的方式来给客户端配置静态IP,推送路由信息。但好在RouterOS也是支持固定IP分配的,通过用户名密码配置指定远端(相对于服务端来说就是客户端)的IP地址,以及此用户路由的网段。
在出现的交互式文本编辑器中,输入指定的IP,例如:10.10.10.2,以及指定路由的网段,例如:192.168.1.0/24。
默认情况下,当成功建立连接一条OpenVPN隧道时,RouterOS会自动生成动态路由,例如按照上述的配置来说,simaek用户获得的IP时10.10.10.2,查看RouterOS路由表,会有一条10.10.10.2/32 -> <ovpn-simaek>
的路由,和一条我们指定网段的路由192.168.1.0/24 -> <ovpn-simaek>
。
当然如果设置了接口绑定,那么此处显示为绑定的接口名称:10.10.10.2/32 -> <tun-company>
。
为了便于客户端访问服务端局域网内主机,需要对tun-company出口的数据,以及lan出口的数据进行源地址伪装。
可在客户端OpenVPN实例上ping服务端内网IP,测试连通性。例如:
客户端子网路由
由于无法从客户端获取到路由,所以在客户端需要额外做两件事情。以CentOS为例。
将服务端网段(可以是任何需要路由的网段)路由到OpenVPN网关地址。可以在客户端配置文件中写明路由的网段。这样服务启停会自动添加删除路由信息。无需手动配置。可以配置多条路由,另起一行即可。
给客户端lan接口以及OpenVPN的tun接口配置源地址伪装,便于访问局域网内主机。以iptables为例。
由于没有网关访问权限,所以客户端内网如果想要访问服务端内网,需要将客户端内网机器的网关改为部署了OpenVPN的那台机器的地址。
最终效果
服务端任意主机上ping通客户端任意主机。
客户端手动配置为OpenVPN客户端IP的机器,可以ping通服务端任意主机。
10、结语
RouterOS内置的OpenvpnVPN支持的特性不是很全,一些新特性不支持,不过足够稳定使用了。
后续打算在客户端也运行RouterOS,使用内置的OpenVPN客户端进行连接。
客户端ROS对接配置