智能机器人(05):虚拟网络配置

一、需求
二、证书体系
三、模块安装
四、一些准备
六、—CA证书制作
七、—Server证书制作
八、—Client证书制作
九、—Server端典型配置
十、—Client端典型配置

  • 一、需求

机器人走出去之后,连接的可能是商场的无线wifi,也可能是厂区的无线热点,这些都是局域网,凡是属于下三个subnet的地址都是局域网,公网寻不到:
10.0.0.0 10.255.255.255 (10/8 prefix)
172.16.0.0 172.31.255.255 (172.16/12 prefix)
192.168.0.0 192.168.255.255 (192.168/16 prefix)
那么如何从茫茫机海中定位机器。为了实现目的需要在局域网上再假设一层专有网络。

1.1、例如场景:
1、服务器srv1处于香港某位置;
2、机器人rbt、rbt2…处于某个超市局域网内,ip地址是172.16.1.111,172.16.1.111…;
3、管理后台pc1、pc2…位于某个科技公司局域网内,ip地址192.168.1.66和192.168.1.88…;
4、那么此时通过srv1新建一虚拟网络VPN,使得rbt1、rbt2、pc1、pc2的虚拟网络为10.8.1.100/ 111/ 122/ 133,这样这台机器就位于同一网络了,不管物理空间上位于何处都可以通过node访问rostopic,或者ssh等常规管理。

1.2、服务器的配置文件为:客户机的配置文件为:
rbt1和rbt2上要合适配置/etc/hosts,并运行roscore。
pc1和pc2上要合适配置/etc/hosts,并export ROS_MASTER_URI=http://rbt:11311。
完成后可以测试:
$ rosnode ping /somenode

  • 二、证书体系

openVPN提供了多种身份验证方式,包括:预享私钥,第三方证书,用户名/密码组合。
openVPN大量使用openSSL加密库中的SSLv3/TLSv1协议函数库,例如x509。
x509证书链一般用到三类文件,key,csr,crt:
key是私用密钥,openssl格式,通常是rsa算法,爱咋用咋用。
csr是证书请求文件,用于申请证书。在申请的时候必须使用自己的私钥来签署申请,还可以设定密钥。
crt是证书文件是签署人用自己的key签署的凭证。通常签名证书时候需要一个序列号避免两个证书重复。

2.1、具体到本应用证书包括:
ca证书,服务器的Server证书,客户机的Client证书。

2.3、各文件的用途
文件名———-位置———-目的———–私密性
ca.crt—–server + all clients—–Root CA certificate—–NO
ca.key—-key signing machine only—–Root CA key—–yes

ta.key—–server + all clients—-antin DDOS—–yes
dh{nnn}.pem—-server only—–Diffie Hellman parameters—–NO

server1.crt—-server only—–Server Certificate—–NO
server1.key—–server only—–Server Key—–yes

client1.crt—–client1 only—–Client1 Certificate—–NO
client1.key—–client1 only—–Client1 Key—–yes

client2.crt—–client2 only—–Client2 Certificate—–NO
client2.key—–client2 only—–Client2 Key—–yes

… …

  • 三、模块安装

3.1、vpn安装
$ sudo apt-get install openvpn
3.2、easy-rsa安装
$ sudo apt-get install easy-rsa

  • 四、一些准备

通过easy-rsa制作三个证书。
首先单纯是为了方便考虑,在/etc/openvpn/目录下创建easy-rsa文件夹
$ sudo mkdir /etc/openvpn/easy-rsa/
然后把/usr/share/easy-rsa/目录下的所有文件全部复制到/etc/openvpn/easy-rsa/下
$ sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
当然也可以直接在/usr/share/easy-rsa/下制作证书,为了管理证书把easy-rsa放在openvpn下。

  • 六、—CA证书制作

6.1、编辑vars文件,设置证书组织信息:
$ sudo vi /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY=”CN”
export KEY_PROVINCE=”ZJ”
export KEY_CITY=”HZ”
export KEY_ORG=”HDhello”
export KEY_EMAIL=”HD@most.in”
export KEY_OU=”WestLake”
export KEY_NAME=”Server1”
!!! 其中export KEY_NAME=”Server1”这个要记住统一,制作Server端证书时用到。
6.2、切换到root用户:
$ sudo su
使其生效:
$ source vars
执行clean-all删除当前目录下的keys文件夹:
$ ./clean-all
6.3、制作CA证书:
./build-ca
6.4、常见错误
如果:
140224783447712:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 198
line 198 of openssl-1.0.0.cnf reads:
subjectAltName=$ENV::KEY_ALTNAMES
这是因为 vars文件里面缺少一行, 在vars文件最后添加这一行:
export KEY_ALTNAMES=”something”
尽管这不是原本vars文件中有的但是还是把它加到文件的尾部,负责不能避免build-ca脚本失败。

这样查看keys目录看到已经生成ca.crt和ca.key两个文件,如此CA证书制作完成。
为了方便把该CA证书ca.crt文件复制到openvpn的启动目录/etc/openvpn下
$ cp keys/ca.crt /etc/openvpn/

  • 七、—Server证书制作

$ ./build-key-server Server1
!!!!! 注意上述 Server1,就是前面vars文件中设置的KEY_NAME。
这样可以查看生成的Server证书, 已经生成 Server1.crt、Server1.key和Server1.csr三个文件。

再为服务器生成加密交换时需要的Diffie-Hellman文件
$ ./build-dh
可以查看生成的文件,已经生成了dh2048.pem这个文件

再生成防止DDoS攻击的ta.key
$ openvpn –genkey –secret keys/ta.key

然后把 Server1.crt、Server1.key、dh2048.pem、ta.key复制到/etc/openvpn/目录下
$ cp keys/Server1.crt keys/Server1.key keys/dh2048.pem keys/ta.key /etc/openvpn/

  • 八、—Client证书制作

$ ./build-key Client001
!!!!! 注意上述 Client001是客户端的名称,这个可以自己定义。
这样可以看出已经生成 Client001.csr、Client001.crt和 Client001.key这个三个文件。
根据需要部署的客户机的数量,可以继续添加:
$ ./build-key Client002
… …
NOTE:
next time after several days i fu want to re-build some client files rember to sudo su first.

  • 九、—Server端典型配置

首先从openvpn自带默认模版复制Server端所需的配置文件:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ cd /etc/openvpn/
$ gzip -d server.conf.gz
!!! 注意在修改server.conf文件时候需要绝对路径
$ vi server.conf

port 22105 —指定端口号
proto tcp —指定协议
dev tun —指定非briage

ca ca.crt
cert Server1.crt
key Server1.key
dh dh2048.pem

tls-auth ta.key 0 # This file is secret

server 10.10.0.0 255.255.248.0 —The server will take 10.10.0.1 for itself, the rest will be made available to clients
ifconfig-pool-persist ipp.txt —Maintain a record of client virtual IP address associations in this file.

cipher BF-CBC # Blowfish (default)
auth SHA512 —Message Authentication
comp-lzo —Message Authentication
push “route 10.10.0.0 255.255.248.0”
persist-key
persist-tun
tun-mtu 1500
tun-mtu-extra 32

然后可以开启openvpn服务:
$ /etc/init.d/openvpn start
$ netstat
$ netstat -tunlp | grep 22105
可以看出openvpn已经在此启动,而且确实使用TCP协议22105端口而非默认的1194。

  • 十、—Client端典型配置

客户端所需的证书包括CA证书和Client证书。需要网络下载或者USB拷贝到客户机上。注意各个文件的权限。
CA证书主要使用crt结尾的文件,Client证书主要使用crt和key结尾的两个文件:
$ cp /media/ClientPC/UUI/ca.crt Client001.crt Client001.key /home/ClientPC/myvpn
修改以上几个文件的用户属性
$ chown dehaou1404:dehaou1404 ca.crt
$ chown dehaou1404:dehaou1404 Client001.*
把几个私钥文件降低权限:
$ chmod 600 ta.key Client001.key

然后使用openvpn默认的模板制作Client端配置文件:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /home/dehaou1404/myvpn
$ chown dehaou1404:dehaou1404 client.conf
$ nano client.conf

client —指定当前VPN是客户端
dev tun —指定非briage
proto tcp —与服务器端的保持一致

remote 192.168.1.3 22105 —指定远程服务器的实际public IP地址 和端口号
ca ca.crt
cert Client001.crt
key Client001.key
tls-client —使用TLS加密传输,server端为Server,client端为tls-client
tls-auth ta.key 1 —和Server配置一致 注意最后参数是1
#如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;未设置则注释掉这一行;

# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPNServer
ns-cert-type server
# 指定采用服务器校验方式 注意easy-rsa的默认脚本中是没有ns-cert-type server的设定,
# *千万不要*在配置中加上这个设定。否则会导致TLS handshark failed。

persist-key —通过keepalive检测超时后重新启动VPN,不重新读取keys保留第一次使用的keys
persist-tun —通过keepalive检测超时后重新启动VPN,一直保持tun或者tap设备是linkup的

comp-lzo —与服务器保持一致 对数据进行压缩,
auth SHA512 —指对于数据通道的加密方法。
cipher BF-CBC —在交换密钥时用到的加密方法,真正影响传输性能。根据速度选择合适加密算法,
# 在服务器和客户端openvpn配置中用cipher BF-CBC或cipher AES-128-CBC指明,服务器+客户配置都更改。

tun-mtu 1500 —为了兼容,1500依然是诸多以太网卡的默认MTU设置,
# 但是厂商对如今1G/10G等高端网卡以及超五类/六类双绞线以及光纤的高大上特性又不能视而不见
tun-mtu-extra 32 —openvpn如果使用TCP协议,MTU一般不用修改;如果是用UDP协议,可以设置tun-mtu 1450会改善网络.
! mssfix 1450
ping-restart 60 —设置成120秒,尽可能和ping拉开距离,
# 这两个参数保证不会因为ping-restart导致断开,这样就将问题全部集中在控制通道了
ping 10 —设置为5秒,尽可能短,但不要太短

然后客户机可以加入虚拟网:
$ sudo openvpn –config client.conf
如果开机启动后台运行的话把命令写入/etc/rc.local文件中, 添加到语句:exit 0 前面:
/usr/sbin/openvpn –config /home/ClientPC/myvpn/client.ovpn > /dev/null &
注意:&符号不能省略避免阻塞系统启动。
***注意***:证书文件如果没有存放在/etc/openvpn/目录下,在.conf文件中要填写该文件的绝对位置路径。

  • 附、参考高级配置

https://help.ubuntu.com/lts/serverguide/openvpn.html
http://answers.ros.org/question/11045/how-to-set-up-vpn-between-ros-machines/

https://github.com/Nishida-Lab/TC2015/wiki/OpenVPN_ROS_client
http://www.lxway.com/4442182692.htm

0 回复

发表评论

Want to join the discussion?
Feel free to contribute!

发表评论