公司内网Debian Server上的openvpn服务器搭建并通过SSH隧道转发到广域网

由于戴维营公司在长沙的学员,研发人员和北京的研发人员需要协同研发,故需要让北京的兄弟们加入到长沙办公室的内网,访问版本 管理服务器,于是采用在内网服务器上搭建一个OpenVPN服务,并把内网(铁道的宽带,木有分配动态的广域网ip给WAN,悲剧。)的OpenVPN服务端口通过ssh隧道转发到广域网上某个服务器上。

以下是记录过程:

OpenVPN服务软件包系统仓库里有现成的包,直接apt-get安装:

root@office.diveinedu.net:#apt-get -y install openvpn

复制openvpn的配置文件模板和生成证书的工具到 /etc/openvpn:

root@office.diveinedu.net:# cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

root@office.diveinedu.net:# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/

root@office.diveinedu.net:# cd /etc/openvpn

root@office.diveinedu.net:# gzip -d server.conf.gz

root@office.diveinedu.net:# cd easy-rsa/2.0/

 

下一步生成证书,先编辑vars文件设置证书配置信息,如果不需要指定证书的信息,可以跳过编辑vars文件的步骤:

root@office.diveinedu.net:# vim vars
root@office.diveinedu.net:# source ./vars
root@office.diveinedu.net:# ./clean-all

生成ca证书,这一步可以一路回车:

root@office.diveinedu.net:#./build-ca

下面是生成服务器和客户端的证书,每次命令到最后有2个关于是否签名证书和提交,都必须回答y,

才能生成有效证书,如果一路按回车,到最后可能发现一个空证书:

root@office.diveinedu.net:# ./build-key-server server
root@office.diveinedu.net:# ./build-key client1

再生成一个DH PARAMETERS,OpenVPN的服务器端需要这个:

root@office.diveinedu.net:# ./build-dh

就这样,OpenVPN服务端和客户端所需要的key就都生成好了.

把服务端需要的证书文件复制到目标目录:

root@office.diveinedu.net:# cd keys
root@office.diveinedu.net:# cp ca.crt dh1024.pem server.crt server.key /etc/openvpn/

把客户端需要的证书下载或传输到客户端的配置目录下。

(可以直接用工具把/etc/openvpn/easy-rsa/2.0/目录下的ca.crt client1.crt client1.key文件保存到本地,客户端连接的时候要用)

 

下一步就是配置OpenVPN的服务端 配置文件:

用vim命令修改服务器端的/etc/openvpn/server.conf

port 1194#连接端口
proto tcp
;proto udp #连接方式
;dev tap
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key  # 这个文件千万别泄露
dh /etc/openvpn/dh1024.pem
server 10.8.0.0 255.255.255.0 #ip分配,不能跟本地冲突
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp" #让客户端设置默认路由经过vpn链路
push "dhcp-option DNS 8.8.8.8" #dns
push "dhcp-option DNS 8.8.4.4"
duplicate-cn #如果你要多人共用一个证书的话,请开启本项。
keepalive 10 120 #连接测试,意思是10秒ping一次,120秒没有返回就断开重连
comp-lzo #开启压缩传输
persist-key
persist-tun
status openvpn-status.log
log-append  openvpn.log
verb 3

然后需要在服务器端设置iptables,当前我内网的服务器ip是192.168.1.254

root@office.diveinedu.net:# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.168.1.254
root@office.diveinedu.net:#  iptables -A INPUT -p tcp --dport 1194 -j ACCEPT
root@office.diveinedu.net:#  iptables -A OUTPUT -p tcp --sport 1194 -j ACCEPT

 

然后启动OpenVPN服务:

root@office.diveinedu.net:#  /etc/init.d/openvpn start

 

接下来就是客户端的配置文件设置了,大部分信息和Server端对应,编辑一个客户端配置文件:

vim client.ovpn

client
;dev tap
dev tun
proto tcp
;proto udp
remote  desktop.diveinedu.net 1194 #连接ip/域名 端口  (这里不是192.168.1.254是因为我后面会把内网端口监听转发到这域名的ip上)
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
comp-lzo
verb 3

 

 

接下来就是用ssh客户端把本地监听的1194端口通过ssh隧道转发到广域网上的ip和端口,而且要求开机自动启动和断线后自动重连,

采用简单的Shell脚本来实现。

vim  /root/sshtunnel4openvpn.sh

#!/bin/bash
while true;
do
echo "connecting to server."
sshpass -p 'password' ssh -vv -oStrictHostKeyChecking=no -N  -R 0.0.0.0:1194:192.168.1.254:1194 user@desktop.diveinedu.net;

echo "connection closed.";
done

(以上脚本里的自动密码登录方法是有安全风险的,sshpass参数会记录密码。不建议采有密码认证,应该采用证书登录,我这是特殊情况,呵呵。)

脚本写好了。但是iptables规则没有保存和重启后自动启用规则。

先保存当前规则到文件:

root@office.diveinedu.net:# iptables-save > /etc/iptables.up.rules

然后在/etc/rc.local最后一行exit 0之前加入脚本运行和和规则自动启动的命令:

# By default this script does nothing.

nohup /root/sshtunnel4openvpn.sh > /dev/null 2>&1 &
iptables-restore /etc/iptables.up.rules 

exit 0

 

这样,重启服务器后,他就会自动启动openvn服务并自动把内网端口通过隧道转发到广域网主机desktop.diveinedu.net的端口上,

这样,北京那边的研发人员就可以通过openvpn客户端登录到内网来了。

 

然后,下载客户端并安装配置
如果用的是windows的客户端,安装完毕后如果安装目录下没有config和log目录,要手动建立它们
将刚刚保存的ca.crt client1.crt client1.key client.ovpn这几个文件复制到config目录下,运行桌面上的OpenVPN GUI就可以连接了.

 

这样的方法非常适用于企业内部网络的WAN接入端都没分配公网IP,而是分配的私有地址,连花生壳这样的动态DNS都用不了的环境。

除了电信接入可以得到广域网ip地址,联通铁通都是分配的A类私有地址,IPV4地址耗尽,估计都被电信独占,啥时候可以普及IPV6阿。

 

长沙 戴维营教育 iOS培训 iOS开发,苹果开发,Linux开发,Unix/Linux  C/C++培训

长沙 戴维营教育原创文章, 版权所有,如被转载,请务必注名出处。

 

文章分类 Linux服务器开发

发表评论