搭建家用的OpenVPN服务器

2011年5月29日 | 分类: 乱七八糟 | 标签:

啥都不说了,贝壳最近搞了一个家用的OpenVPN服务器,任何机器,随时随地可以穿到家里来,很方便。用VPN干啥?这就多了。我可以用vpn操作 Windows上的vnc,使用Windows的共享文件服务,直接向Linux Server放文件(这样别人可以用http下载),查看摄像头(被网络公布了)。将来如果有其他网络设备(例如冰箱和空调),也可以一并管理。不过最直 观的——可以很方便的打游戏,我们根本就在一个网络里面。要点是,这些服务要分别开映射端口非常麻烦。而且有的服务从安全起见,根本不能开端口(例如臭名 昭著的Windows文件共享服务)。
具体原理上,贝壳有一台Windows,上面用Vmware搭建了一台Debian Linux,两者使用桥接模式。从概念上看,就是一台通向公网的路由器,里面放了一台Windows和一台Linux。现在,贝壳想通过某种方法,将外部 的一台机器接入内部的局域网中,就如同随身携带着一根通向家里路由器的网线一样。
下面直接上具体配置:
———–filename: /etc/network/interface——————-
auto lo
iface lo inet loopback
iface eth0 inet static
address 0.0.0.0
iface tap0 inet static
address 0.0.0.0
auto br0
iface br0 inet static
bridge_ports eth0 tap0
address 192.168.1.IP
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
dns-search home
————————————————————-
使用上述配置的原因是,vpn只能联通你机器上的逻辑网卡和服务器上的逻辑网卡。单就vpn自身而言,是无法让你连到服务器上的内网网卡的。因此,我们需要通过网桥的配置,将eth0和tap0配置成网桥。这样,你的服务器就如同一台交换机一般,联通了两个网段。
而后,我们设定服务器配置。
———–filename: /etc/openvpn/server.conf—————-
local 192.168.1.51
port 1194
proto udp
dev tap0

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem

server-bridge 192.168.1.IP 255.255.255.0 192.168.1.100 192.168.1.149
push “route 192.168.1.0 255.255.255.0”
keepalive 10 120

user nobody
group nogroup

persist-key
persist-tun

cipher DES-EDE3-CBC # Triple-DES
comp-lzo

verb 3
status /var/log/openvpn-status.log
;log openvpn.log
log-append openvpn.log
————————————————————-
其中的server-bridge是因为我们采用网桥的关系,100-149是向外部拨入分配的IP池。贝壳的2-100是内部固定IP保留,150-199是内部DHCP池,200-254保留。这个大家可以按照自己的情况配置。
需要特别注意的是,由于上文我们已经建立了tap0这个设备,因此才dev中必须指定tap0设备。如果你仅写tap,那有可能是新建一个设备出来。到时候就好玩大了…
上文中,我们使用了ca cert key dh四个密钥文件选项。下面我们说说如何产生这些密钥文件。
首先,你需要复制usr/share/doc/openvpn/examples/easy-rsa/2.0/到你的个人目录,并修改其中的vars文 件。将其中的一些东西修改为你需要的参数(很简单,我假定大多数人都会用,这个是基于SSL的),而后source vars,执行下述命令。
./clean-all
./build-ca
./build-key-server server
./build-dh
#需要�入密�的
./build-key-pass username
#不需要�入密�的
./build-key username
最后两个可以随便签署,想发多少密钥就给多少人签署。不过请注意,easy-rsa的默认脚本中,是没有ns-cert-type server的设定的,因此*千万不要*在配置中加上这个设定。否则会导致TLS handshark failed。
最后,启动vpn,并且修改你的防火墙和路由器映射,贝壳这里使用的是udp1194端口(默认)。再给客户分发配置和key,具体如下:
——————filename: home.ovpn———————–
remote shell909090.3322.org 1194
client
proto udp
dev tap

ca home.crt
cert shell.crt
key shell.key

resolv-retry infinite
persist-key
persist-tun

cipher DES-EDE3-CBC
comp-lzo

verb 3
————————————————————-
其中home.crt是服务器上的server.crt,shell.crt和shell.key是刚刚签署的用户密钥。如果有密码,需要设定密码,或在连接时提供。


与其相濡以沫,不如相忘于江湖

————————————————————-

————————————————————-

再论openvpn的搭建

从概念上说,openvpn类似于一根网线,或者一台交换机。你拨上vpn,差不多相当于给自己的机器装一个虚拟的网卡,从上面拉一根线到服务器的虚拟网卡上。所以,vpn的配置大概和网络配置差不多,分为几个大类。

一类是第一层交换,即虚拟网卡和真实网卡组成网桥。这样可以把虚拟网络上的设备引入真实网络,让虚拟网卡获得真实网络的地址,或者反之。坏处是配置复杂,稳定性差。
例如你家里是192.168.0.0/24网 络段,你决定用tap配置一个网桥,就需要新建一个br0设备,将eth0和tap0设备加入网桥。这样,一台IP为192.168.0.10的家庭机 器,在访问IP为192.168.0.110的远程机器的时候,所发出的ARP请求会被转发到远端,然后ARP响应转发到本地。通过这种方式,10就会直 接把MAC报文发送到中转机上,然后再转发远端。可以看出,由于ARP请求往来非常费时,在子网内机器多的时候,会消耗不少时间和带宽进行ARP转包,以 及各种链路级开销。所以通常除了两个安全封闭子网因为管理理由必须这么玩,并且两者间又都有服务器和高速链接的时候,其他时候我不推荐这种玩法。
更何况,在debian系统下配置网桥需要额外脚本,不如路由那样,可以使用默认脚本启动,然后动态修改路由表。

大部分是二层交换,即将服务器作为路由器使用。这又分为两种情况,网络地址转换,和网关互通。
网络地址转换是最常见的情况,这个又叫做NAT。网关在转发你的包的同时,会将地址转换成自己的地址。从而避免修改路由的行为。
同样是192.168.0.0/24举例,远程网络假如叫做192.168.1.0/24。当 你拨号上远程网络时,你就拥有了一个远程IP和一个本地IP。你可以配置路由表,让哪些IP从远程走(这就是地址段选择翻墙的原理)。大多数情况下,会被 配置为默认都从远程IP走,除了几个特定地址(例如VPN服务器地址,这个也走虚拟网络会引起循环的)。而远程的网关,假定是192.168.1.1,开 启了NAT。这时候你的所有网络流量就都从远程的VPN服务器上发出和接收了,如同你正坐在远程服务器后面的小网络内一样。

网关互通是更复杂的一类情况,通常是小型企业为了多个连通多个地点办公子网而设计的。理论上说大型企业也适用,但是大型企业有钱,IT部为了防范责任问 题,通常会直接采购Cisco之类大公司的产品直接使用。基本概念是将虚拟网络和真实网络配置成两个子网,两个子网可以互相访问。
还是192.168.0.0的例子,我们假定另外有一个子网叫做192.168.1.0/24。现在我们需要连通两个子网,或者,更进一步,多个子网。
我们首先配置一个虚拟子网叫做192.168.254.0,然后架设一台共用服务器。这是比较简单的模型。更复杂的可以将其中一个子网的某个服务器映射出 去作为核心,配置就更加复杂,不过可以依照同样原理推导。架设好共用服务器后,我们需要在每个子网的网关上下手,否则就无法做到透明路由。修改这个网关的 路由表,将192.168.0.0/16全 部转发到虚拟网关(即共用服务器的虚拟IP)上去(当然,除去本网段不转发)。在OpenVPN上面可以配置,当某条链路拨接上来后,就在服务器上加入一 条路由,将其后面的网段加入网关路由表。于是,当192.168.0.100的某台服务器希望直接访问192.168.1.100。首先这台主机会检查自 己的路由表,发现这个需要由网关192.168.0.1转发,就先转到了192.168.0.1。192.168.0.1检查路由表,发现 192.168.1.100需要被转发到虚拟网关,即192.168.254.1。于是通过虚拟网络,该网关做出转发。当192.168.254.1接收 到后,他会依照上面的路由表,检查到这条链路是否已经拨接上来,拨接上的话对应的虚拟IP是多少,然后转发过去。最后是目标网 关,192.168.1.1,转发给192.168.1.100的过程。整个过程复杂无比,不过实现起来都是自动化的。

在配置文件中,有ca cert key三项,这三项分别对应不同作用。cert和key是用于向客户端验证服务器身份的。客户端那里有一个ca.crt,服务器这里的cert和key必 须是那个ca.crt签署过的。这样,客户端就可以验证服务器是否是可信任的。而服务器这里的ca则是验证客户端身份的,客户端那里同样也有cert和 key,必须由服务器端的ca.crt签署过。通常,我们用同一套ca.key签署两个cert,分别部署在服务器端和客户端,就可以工作了。
另外一点需要注意的是,ns-cert-type server这个参数。在debian的默认系统中有这个参数,一旦指定,openvpn就会检验服务器证书上是否有server的选项。对于easy- rsa签署的证书,这个肯定是有的。但是如果自己用openssl签署,就要记得做ext,否则检验不通过会报错。

 

原文http://shell909090.blogspot.com/2009/09/openvpn.htmlhttp://shell909090.blogspot.com/2011/05/openvpn.html

  1. こんばんは~
    2011年5月29日21:24

    是不是可以參考一下這個教程:
    windows下利用OpenVPN搭建VPN服务器:
    http://huaidan.org/archives/1617.html