Linux设置openvpn使外网访问内网的共享文件夹
关于网上说的很多,几个小时里吧,为了实现这个功能我看了好些文章,不过基本上没有找到让我满意的,觉得很多都写的不清楚,或者关键的地方 就没写,最终我瞎猫撞死耗子,看网上的文章东拼西凑乱试一通,还是给试出来了,以下做个记录,免得自己忘了,并且希望这个记录也能对和我一样的新手和菜鸟 们有所帮助。
先说下我的整个网络环境,
服务端:我是自己家里一个小的局域网,一台台式机,操作系统应该是red hat el 5吧,这个我是从oralce那边下来的oracle专用的linux,应该是el 5.4,一个无线路由器,一台笔记本,操作系统是windows2003,通过无线路由连adsl上internet。
客户端:帮我测试的朋友家也跟我的整个网络环境是一样的,也是一本子,一无线路由,一台式机,通过无线路由连adsl上internet。
最后要实现的功能是通过在linux上架设openvpn服务器,然后从外网(找了个外省的网上的朋友帮忙安了个openvpn客户端,从 internet上来我笔记本上的共享文件夹)。确实没办法,我没有其他的途径上外网了,所以只能找别人来帮忙了,这也给我测试带来不少麻烦,毕竟不 如全都由自己来的痛快,不然用不了一天应该也就能搞完了的说。
说下openvpn吧,关于这个软件我就不废话了,网上介绍的多的是,再不行去它的官网openvpn.net看,简单说就是个不错的架vpn的软件,还 不要钱。这个我用的是openvpn版本是2.0.9,现在最新的版本是2.1.1了。这个网上有很多说怎么装的,基本上说的挺详细的,如果想从源码来安 可以直接去来 下载。我还是说说我的吧,之所以要说下我的安装,毕竟这是我第一次用yum,也做个记录,说实话我也不知道为什么对这种软件仓库心里总没有底。我的那个 linux好像默认就没有软件仓库。我装的那个cent os推荐的rpmforge,这个去这 里就可以下它的rpm安装,上面还有一篇文档讲关于它怎么用,其实主要是讲yum-priority这个插件来仓库优先权,其实就是不设好像也没问 题,因为我本身好像没有yum的软件仓库,反正我按它说的那个用yum命令装不了yum-priority,这个可以去网上搜一下,有这个插件的rpm安 装包,直接装上照着rpmforge的指导设也行。装好rpmforge后,就可以直接执行yum install openvpn,就能自动将openvpn以及它需要的一个软件包一起自动装上。这样openvpn服务端就安装好了。
下面就该进入正题了,先说openvpn的服务端怎么配。
1copy样本配置文件,执行如下两条命令。
cp -r /usr/share/doc/openvpn-2.0.9/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/2.0
2更脚本改执行权限,这个是因为2.0.9版本的一个设置的bug,有些脚本没有设置执行权限。执行如下的命令:
chmod +x build-* clean-all inherit-inter list-crl pkitool revoke-full sign-req whichopensslcnf
3设置vars文件中的一些变量。
export KEY_COUNTRY="CH"
export KEY_PROVINCE="ZJ"
export KEY_CITY="HangZhou"
export KEY_ORG="OpenVPN"
export KEY_EMAIL="[email protected]"
以上这些随便填就行了。
还有一些用默认值其实也就可以了,像export KEY_SIZE=1024设置密钥的大小,export KEY_EXPIRE=3650设置证书的过期时间等等,上面都有注释,按着注释说明来就行了,如果不想改用默认就可以。
4设置变量,执行如下命令:
source ./vars
5准备创建新的密钥,执行如下命令来清理KEY_DIR变量目录中的密钥文件,默认就是keys目录。
./clean-all
6创建根证书授权证书和密钥
./build-ca
执行这个命令后,会提一些问题,就是刚才配置变量里设的一些值,什么国家啊,省啊,组织啊等等的,回车确认或者打.空掉就行了,有具体提示,按着命令提示 的来就行了。执完这个命令后会在keys目录中,含有私钥的ca.key和根据刚才的keys值产生的新的证书文件ca.crt key.
7为ssl/tls创建参数
./build-dh
执行完之后,应该在keys目录中产生dh1024.pem文件。
8创建server的密钥和证书,命令中的server1改成服务器的名字或者其他的随便什么名字了。
./build-key-server server1
执行这个命令后,会问些问题了,什么challenge password,这个随便输个密码就行了,还有其他两个,回答y就行了
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n] y
执行完这个命令后,会在keys目录中产生server1.crt, server1.csr, 和server1.key这几个文件(server1用你自己输入的服务器名来代替),其中server.key要保持它的安全性。
9创建客户端的证书和秘钥。client01用自己起的名字来替换。
./build-key client01
执行这个命令,也会问跟创建server的key和证书时同样的问题,密码随便输一个就行,不用跟一步的相同,其他的两个问题也仍然回答y
执行完这个命令,会在keys目录中产生client01.crt, client01.csr,和client01.key三个文件,这三个文件是需要考到客户端去的。
接下来就要创建服务器端的配置文件,可以执行如下命令考一个样板配置文件过去进行修改。
cd /usr/share/doc/openvpn-2.0.9/sample-config-files
cp server.conf /etc/openvpn/
在配置文件中有这些项需要配
port 5555 #这是openvpn服务使用的端口号,默认的是1194,这里设成了5555
proto tcp#这是设置openvpn连接使用的协议,可以选tcp和udp,这里设的是tcp
dev tun #具体的参见配置文件中的注释吧,深了其实我也不太懂,大概就是说vpn服务器可以把信息路由到局域网里或者进行桥接,我看的资料上说一般路由比桥接要更 好,因为路由的方式更容易设置和提供了对特定客户端的特色更多的控制。选tun就使用的是路由方式,如果选tap则是桥接的方式。
server 10.8.0.0 255.255.255.0#这项表示openvpn服务器分配的子网地址是10.8.0.x,这个一般不用修改,除非openvpn服务器也所在的局域 网也是这个网段的,那就改一个别的吧
#下面这几行就没什么多说的了,就是把设置好刚才生成的证书密钥
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server1.crt
key /etc/openvpn/easy-rsa/2.0/keys/server1.key #This file should be kept secret
#这个也是一样了,刚才生成的参数文件,配上就行了
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
#以下这些具体的意义参见注释就是了,没启用的就把项前面的;去了启用这些项就行了,值用默认的就行
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
配好以上这些,最后,我之所以要放到最后是这个比较重要吧,至少我自己是这么觉得的,因为开始配的时候我自己在这里就不太懂。如果想让openvpn的客 户端访问到它所在的局域网,必须开启以下这个配置:
push "route 192.168.5.0 255.255.255.0" #这项是当与客户端建立连接后,openvpn服务器会把这个配置发送(推送)到客户端以使客户端知道,客户端访问局域网192.168.5.x由 openvpn服务器来负责处理,这样就能访问openvpn所在的局域网了。
最后还有一件事要做,这个可能也是很容易被遗忘的,就是修改linux防火墙的设置,打开openvpn的端口,在这个具体实例中,端口是5555,不太 会用iptables命令行的话,简单的操作办法就是去系统-管理-安全级别和防火墙里(或者在终端窗口中输入system-config- securitylevel直接调出那个图形窗口)在其他端口中添加上5555端口,协议选择在配置文件中选择的协议就行了,这样就打开了openvpn 服务器的端口了。
或者用iptables的命令行,执行如下命令也行:
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 5555 -j ACCEPT (这命令是从iptables-save出来的文件中抄的)
服务器端的事情就没有问题了,接下来说客户端怎么配。
这里客户端的系统使用的是windows,要去下载 装上,安装过程中会有个什么提示,别管它继续就行了。
然后在安装目录里创建keys目录,把刚才在linux中生成的ca.crt,client01.crt,client01.key三个文件考到这个 keys目录中。然后再把样板配置文件目录中的示范配置文件client.ovpn考到安装目录中的config目录中,然后进行配置。主要有这么几项需 要改:
#这两项没什么说的,得跟服务端选一样的
dev tun
proto tcp
remote 123.116.222.130 5555#这项也没什么说的,得告诉客户端openvpn服务器的ip地址和端口
#这三项不用多说了吧,得把证书密钥都配上
ca "E:\\Program Files\\OpenVPN\\key\\ca.crt"
cert "E:\\Program Files\\OpenVPN\\key\\client01.crt"
key "E:\\Program Files\\OpenVPN\\key\\client01.key"
#其他的几项就照着来就行了不需要改什么了,没开启的开开就行了
resolv-retry infinite
persist-key
persist-tun
ns-cert-type server
nobind
comp-lzo
verb 3
这样客户端的配置文件也就配好了。然后在bin目录中运行gui(具体名字记不清了)程序,运行起来以后,在右下角的任务栏里的openvpn的小图标 上,右键菜单,然后选connect命令,正常的话就肯定能连接到了,连接成功了以后,右下角的小图标会弹出一个openvpn分配的ip地址,跟在服务 端server.conf文件中server项配的是一个网段的。
在这里我说两句我自己的情况,因为我的网是通过无线路由连的internet,所以外网要连到我内网的台式机,我在路由器上做了一个端口映射,把我的 internet的ip地址的5555端口映射到我的台式机的5555端口,这样外网就能访问到我的台式机了。另外我前面说了,我朋友的网络环境跟我的网 络环境是一样的,本来我们两个人的内网都是处于同一网段192.168.1.X,所以为了帮我测试的朋友能访问我的内网,我在无线路由上把我的网段改到 192.168.5.X,只有我跟朋友的内网不处在同一网段,她才能访问到我的内网。
到此为止openvpn已经算是连通了,但是openvpn现在还是访问不到openvpn所在的服务器的内网,比如ping 我的内网的笔记本,ping 192.168.5.2什么的,就ping不通。这个问题我看的网上的文章里就没觉得有说清楚明白的,虽然也有人提到了,但说的反正我是没看太明白 ,最后瞎猜的解决了这个问题。之所以ping不通,这是因为我内网的192.168.5.2这台笔记本的默认路由是无线路由器,在没有做设置的情况下,无 线路由器和笔记本都不知道把跟10.8.0.X网段相关的信息路由到台式机也就是openvpn服务器来处理,所以就导致ping不到内网的机器,也就更 不用谈连到内网的机器访问它的共享文件夹了。其实这个问题在openvpn服务端的配置文件的push段的注释中有说,只是我水平低,当时看的不是很明 白:
# Push routes to the client to allow it
# to reach other private subnets behind
# the server. Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
push "route 192.168.5.0 255.255.255.0"
Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
这句话指的应该就是这个问题。要解决这个问题有多种方案:
1 可以把openvpn服务器也设成路由器,并使openvpn服务器作为这些需要被访问的内网机器的路由器,这样路由器和openvpn在同一台机器上就 ok了。当然如果像我这样,路由器和openvpn不在同一台机器上,这个方法比较麻烦,还需要做其他的设置。
2 如果内网中有多台机器可能需要被访问,针对我这种情况,可以在无线路由器上设置静态路由表,设置10.8.0.x网段的信息路由到openvpn服务器, 具体设置参看自己的路由器的设置页面吧。如果是计算机作路由器,那就使用route add 10.8.0.0 mask 255.255.255.0 192.168.5.3(openvpn服务器的ip),这样只需要改一个地方就ok了,就不需要修改每台内网的机器了。
3 如果改不了路由器,或者内网需要修改的机器不多的话,也可以直接在内网要被访问的机器上,执行route add 10.8.0.0 mask 255.255.255.0 192.168.5.3(openvpn服务器的ip)命令(我的情况是操作系统是windows,命令就是那个了),来直接给内网的机器添加路由,这样 当碰到10.8.0.x网段的信息,它就知道直接路由到openvpn服务器,而不会走无线路由器这条路了。
至此,基本的设置就全部完成了,如果openvpn服务器的防火墙做了正确的设置或者没有开启的话(当然还有内网要被访问的机器的防火墙),在我的这个特 例中是iptables,就应该肯定能够从客户端ping到内网的机器了。如果防火墙不开启的话,也肯定能通过在开始-运行里输 入\\192.168.5.2来访问到我本子上的共享文件夹了。
反正我的那个iptables用的设置就是安装linux时候的默认值,我试了一下,就是不按网上说的加上转发规则,一样能够从外网ping进来。当然按 网上大家说的,在这种情况下,一般还会对openvpn服务器的iptales加一些转发规则,如:
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
等等的,这里的tun0只是针对我自己的设置情况,具体值根据不同情况而定。可能还需要加其他的一些规则,这些网上有很多了,而且具体情况不同设置可能也 不同。
针对我要达到的目标,能够让外网的朋友通过\\192.168.5.2来访问到我内网的共享文件夹,如果开启了iptables,光做以上的一些转发设置 很可能还是无法访问的。因为用\\192.168.5.2这种方式访问共享文件夹使用了smb协议,需要为iptables开启smb协议。简单的开启方 法,还是去安全级别和防火墙,然后在信任的服务中勾选Samba选项,确定就行了。或者执行以下的iptables命令行:
iptables -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 138 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT
这几行在网上有的人有说,但基本上就是那样一列,具体是干吗的没人做说明,应该还是我水平低,大家可能觉得这个几行的目的都是显而易见无需废话,所以我这 菜鸟就是看见了这几行也不知道是为了开启samba,这样就能访问局域网的windows的共享文件夹了。
我之所以现在知道这几行是干这个用的,我是通过关了iptables,在朋友能够访问我的时候,用wireshark抓包,发现她的那个ip地址访问我的 本子的ip的包用到了smb协议,才想到要开启samba,然后用iptables-save,得到了开启samba需要执行那四行命令,不然我就还得在 这个问题上耗呢!头天弄的时候,就是到了这步,关了防火墙就没问题,一开iptables就访问不进来了。好在今天是上天庇佑让我这瞎猫撞上答案了,解决 了这个问题不用再跟这个问题较劲了。
至此就实现了从外网通过openvpn来访问内网,这篇记录主要考虑的还是实现访问共享文件夹的功能,所以iptables的设置还是很薄弱的。不过最主 要的还是知道了要访问共享文件夹要开启iptables的samba,其他的加强设置就根据具体情况而定了。
- 最新评论
