【转】将公司内网与云服务器内网打通
现在越来越多的互联网公司选择和使用云服务商的产品,方便便捷的同时也给运维工作增加了不小的挑战。办公网和云服务两个局域网(or任意两个不同局域网),相互隔离。但是在日常运维、研发过程中,需要在办公网访问云服务网络。如果都通过公网ip绕,既不方便,也不安全,但是拉专线到机房成本又非常高,这里我给大家推荐通过现有资源(云服务器)来实现这个目标。
这里有3种方案,一种是通过OpenVPN,一种是IPsecVPN,这两种方法都比较安全,这里不在赘述孰优孰劣。如果公司是固定公网IP的话其实也可以通过建立GRE隧道来实现,但是可能大部分公司都不太满足要求。
OpenVPN
简述
OpenVPN 是一个高级的开源 VPN 解决方案,由 “OpenVPN technologies” 支持,并且已经成为开源网络领域里的事实标准。OpenVPN 使用成熟的 SSL/TLS 加密协议。
架构
OpenVPN架构图
OpenVPN服务器配置
系统版本 Centos 6.5,配置要求不限。
安装VPN服务
我这边用yum安装,当然你也可以自己编译安装(从这个页面下载:http://openvpn.net/index.php/download.html)
# yum install -y openvpn easy-rsa
初始化VPN服务端
复制配置文件
# cp /usr/share/doc/openvpn-2.3.14/sample/sample-config-files/server.conf /etc/openvpn/
# cp -r /usr/share/easy-rsa/2.0/* /etc/openvpn/
注:openvpn-2.3.14需要改为你安装的OpenVPN版本
修改配置文件并修改权限
# cd /etc/openvpn/
# vi vars
将 "export KEY_SIZE=” 这行,根据情况把1024改成2048或者4096
# chmod +x vars
做ssl配置文件软链
ln -s openssl-1.0.0.cnf openssl.cnf
证书配置
生成证书
# source ./vars
注意:如果执行 ./clean-all, 会清除/etc/openvpn/keys下所有key文件.
清除旧key文件
# ./clean-all
生成服务端CA证书
# ./build-ca
命令行提示内容可以根据具体情况填写,也可以不填写,一路回车.
生成服务器证书
# ./build-key-server openvpn.example.com
生成服务器端密钥证书, 后面这个openvpn.example.com就是服务器名,可以自定义.
`
生成DH验证文件
# ./build-dh
生成diffie hellman参数,用于增强openvpn安全性(生成需要漫长等待),让服务器飞一会。
生成客户端Key证书
# ./build-key client1
# ./build-key client2
# ./build-key client3
(名字任意,建议写成你要发给的人的姓名,方便管理)
注:这里与生成服务端证书配置类似,中间一步提示输入服务端密码,其他按照提示填写或一路回车即可。
生成ta.key 文件
# openvpn --genkey --secret /etc/openvpn/keys/ta.key
修改配置文件
# vi /etc/openvpn/server.conf
# 设置监听IP,默认是监听所有IP
;local a.b.c.d
# 设置监听端口,必须要对应的在防火墙里面打开
port 1194
# 设置用TCP还是UDP协议?
;proto tcp
proto udp
# 设置创建tun的路由IP通道,还是创建tap的以太网通道,由于路由IP容易控制,所以推荐使用tunnel;
# 但如果如IPX等必须使用第二层才能通过的通讯,则可以用tap方式,tap也就是以太网桥接
;dev tap
dev tun
# 这里是重点,必须指定SSL/TLS root certificate (ca),
# certificate(cert), and private key (key)
# ca文件是服务端和客户端都必须使用的,但不需要ca.key
# 服务端和客户端指定各自的.crt和.key
# 请注意路径,可以使用以配置文件开始为根的相对路径,
# 也可以使用绝对路径
# 请小心存放.key密钥文件
ca keys/ca.crt
cert keys/openvpn.example.com.crt
key keys/openvpn.example.com.key
# 指定Diffie hellman parameters.
(默认是2048,如果生成ca的时候修改过dh参数“export KEY_SIZE”则改为对应的数字)
dh keys/dh2048.pem
# 配置VPN使用的网段,OpenVPN会自动提供基于该网段的DHCP服务,但不能和任何一方的局域网段重复,保证唯一
server 10.20.0.0 255.255.255.0
# 维持一个客户端和virtual IP的对应表,以方便客户端重新连接可以获得同样的IP
ifconfig-pool-persist ipp.txt
# 为客户端创建对应的路由,以另其通达公司网内部服务器
# 但记住,公司网内部服务器也需要有可用路由返回到客户端
;push "route 192.168.20.0 255.255.255.0"
push "route 10.X.0.0 255.255.0.0" (X按照机房网段修改)
# 若客户端希望所有的流量都通过VPN传输,则可以使用该语句
# 其会自动改变客户端的网关为VPN服务器,推荐关闭
# 一旦设置,请小心服务端的DHCP设置问题
# push "redirect-gateway def1 bypass-dhcp"
# 用OpenVPN的DHCP功能为客户端提供指定的DNS、WINS等
#push "dhcp-option DNS 208.67.222.222"
#push "dhcp-option DNS 208.67.220.220"
# 默认客户端之间是不能直接通讯的,除非把下面的语句注释掉
client-to-client
# 下面是一些对安全性增强的措施
# For extra security beyond that provided by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
# openvpn --genkey --secret ta.key
#
# The server and each client must have a copy of this key.
# The second parameter should be 0 on the server and 1 on the clients.
# tls-auth ta.key 0 # This file is secret
(这句要注释掉)
# 使用lzo压缩的通讯,服务端和客户端都必须配置
comp-lzo
# 输出短日志,每分钟刷新一次,以显示当前的客户端
status /var/log/openvpn/openvpn-status.log
# 缺省日志会记录在系统日志中,但也可以导向到其他地方
# 建议调试的使用先不要设置,调试完成后再定义
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
# 设置日志的级别
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3
创建日志目录
# mkdir -p /var/log/openvpn/
启动OpenVPN服务
启动服务
# service openvpn start
如果遭遇启动失败的情况,可以在配置文件中加上一行log-append openvpn.log
再尝试启动,然后到/var/log/openvpn/检查openvpn.log文件来查看错误发生原因。
设置开机自启动
# chkconfig openvpn on
开启路由转发功能
+ 开启路由转发功能
# vim /etc/sysctl.conf
找到net.ipv4.ip_forward 把0改成1
# sysctl -p
+设置IPtables
做DNAT,保障数据可以正常到达同内网其他主机
# iptables -t nat -A POSTROUTING -s X.X.0.0/24 -o eth0 -j MASQUERADE
(X按照机房网段修改)
# service iptables save
公司服务器配置
安装客户端
# yum install openvpn -y
将服务器端生成的key(ca.crt,client.crt,client.key,ta.key)下载到 /etc/openvpn/config
# cd /etc/openvpn/config
# vi client.ovpn
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
ca ca.crt
cert xxx.crt
key xxx.key
#tls-auth ta.key 0 (这句要注释掉)
comp-lzo
user nobody
group nobody
persist-key
persist-tun
启动服务
openvpn --daemon --config client.ovpn
这个时候这台服务器已经和云环境所有的服务器内网打通了~