1. 服务器设置
1) 安装OpenVPN,以及相关准备工作
这里假设openssl已经默认随ubuntu安装了,否则sudo apt-get install openssl
1 |
sudo ?apt-get? install ?openvpn |
然后把随安装包一起提供的配置模板拷贝出来
1 |
cd ?/usr/share/doc/openvpn/examples |
2 |
sudo ?cp ?./sample-config-files/server.conf.gz /etc/openvpn |
3 |
sudo ?cp ?-r ./easy-rsa/2.0 /etc/openvpn |
5 |
sudo ?mv ?2.0 easy-rsa??? #这是生成数字证书的工具包 |
6 |
gzip ?-d server.conf.gz? #配置模板 |
2) 生成数字证书
首先修改生成证书所需的基本信息
1 |
cd ?/etc/openvpn/easy-rsa |
# These are the default values for fields # which will be placed in the certificate. # Don’t leave any of these fields blank. export KEY_COUNTRY=”US” export KEY_PROVINCE=”CA” export KEY_CITY=”SanFrancisco” export KEY_ORG=”Fort-Funston” export KEY_EMAIL=”me@myhost.mydomain” 这些都可以自己修改成认为有意义的内容,当然随便填填也无所谓。
然后更改默认目录权限,生成CA根证书
1 |
cd ?/etc/openvpn/easy-rsa/? ## move to the easy-rsa directory |
2 |
sudo ?chown ?-R root:admin? ## 假设当前用户也是admin这个Group的 |
3 |
sudo ?chmod ?g+w? ## 让Group成员都有写权限,否则./clean-all无法建立所需目录 |
5 |
./clean-all? ##主要是生成存放证书和密钥的目录 |
在生成服务器的证书和密钥,这其中会问道密码,好像设不设都无所谓,但如果设置了,注意保留记录
有可能的化, 选择2048位的RSA key, 基本对性能没有影响, 比默认的1024位好
1 |
./build-key-server server |
生成客户端需要的证书和密钥,也会问密码,处理原则同上。
其他内容都可以随便填写,但是common name最好是唯一的,这样每个用户只能同时登入一次,
除非在server.conf中设置了duplicate-cn,才可以由一个证书多次登陆
如果以后要创建其他用户的key,之前都要source ./vars一下
接下来在创建Diffie Hellman参数,这部可能要花几分钟时间生成随机数
把服务器证书复制到配置文件夹下
1 |
cp ?ca.crt server.crt server.key dh1024.pem /etc/openvpn |
再把ca.crt, client1.crt和client1.key通过ftp或者scp的方式,下载到客户端。
可选的额外认证步骤:
1 |
openvpn --genkey --secret ta.key |
将ta.key分别放到/etc/openvpn下和安全拷贝到客户端中
tls-auth ta.key 0 #服务器的配置
tls-auth ta.key 1 #客户端的配置
这是为了添加额外的HMAC数字签名, 便于快速审查和丢弃不合法的数据包, (因为完整的SSL/TLS验证比较费时间)
- UDP Flood
- 端口扫描
- SSL/TLS缓存区溢出的可能
3 )然后就可以sudo vi /etc/openvpn/server.conf 编辑配置文件了
01 |
port 1194 # change this to whatever you need it to be |
03 |
# tcp or udp, never use both in the same config |
05 |
# 由于VPN的数据包是建立在已经存在的Internet链接上的, 没有必要再次用TCP建立连接 |
06 |
# 所以正常情况都可已设为udp, 除非是Internet的质量太差. |
13 |
#除非在服务器侧有很多其他windows主机要共享,否则 |
17 |
# Certificates,这些都是刚才生成的文件 |
23 |
key server.key # This file should be kept secret |
27 |
# Server settings,一般就用默认设置比较好,避免和本地局域网地址重复 |
29 |
server 10.8.0.0 255.255.255.0 # Default VPN ip range. |
31 |
#这句很关键,让客户端所有路由都转从VPN的默认网关 |
33 |
push "redirect-gateway def1"? #def1也不能少,否则有时候客户端的默认网关不会变 |
35 |
# OpenDNS settings,也很关键。 |
39 |
push "dhcp-option DNS 208.67.222.222" |
41 |
push "dhcp-option DNS 208.67.220.220" |
43 |
# Allow clients to see eachother |
51 |
# Reduce the OpenVPN daemon's privileges |
57 |
#增加一个快速的tls完整性验证, 避免对一些明显无效的数据包进行完整的tls/ssl验证 |
64 |
ifconfig-pool-persist ipp.txt |
66 |
#日志也可以改到/var/log/openvpn/下 |
4)设置端口转发
1 |
sudo ?vi ?/etc/sysctl.conf |
将其中net.ipv4.ipforward=1的注释去掉
为了不用等到系统重启才能生效,再输入
1 |
sysctl -w net.ipv4.ip_forward=1 |
可以用sysctl net.ipv4.ip_forward确认上述设置是否成功了。
然后 sudo /etc/init.d/openvpn restart重启服务就可以了。
防火墙设置
在原来系统的iptables_init.sh中,添加
1 |
#假设服务器只有一块网卡eth0,所以无论是接收VPN请求,和向外二次转发,都用eth0这个interface |
3 |
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE? #VPN向Internet转发的关键 |
4 |
iptables -I FORWARD -d 10.8.0.0/24 -j ACCEPT? #从Internet进来的包, 如果是指向VPN内部的, 必须尝试转发, 有OpenVPN决定是否安全 |
5 |
iptables -A INPUT -i tun+ -j ACCEPT? #必须可以接收tun0转来的VPN内部数据包 |
6 |
iptables -A INPUT -i tap+ -j ACCEPT? #这条主要是为了Window客户端OpenVPN GUI登录所设置的,因为其只有tap接口 |
7 |
iptables -A FORWARD -i tap+ -j ACCEPT? #允许VPN转发 |
8 |
iptables -A FORWARD -i tun+ -j ACCEPT? #允许VPN转发 |
9 |
iptables -A INPUT -p tcp -i eth0 --dport 1194 -j ACCEPT? #允许客户端递交VPN登录请求 |
然后清空iptables规则,并重新建立
4 |
sudo ?/etc/init.d/fail2ban restart |
可以用一下命令看防火墙是否成功建立
1 |
sudo ?iptables -L - v ?sudo ?iptables -L - v ?-t nat |
顺便给一个完整的防火墙建立脚本
06 |
iptables -P INPUT ACCEPT???? #There will be a line at the bottom of the chain to reject default package |
07 |
iptables -P FORWARD DROP? #By default, do not act as a router |
08 |
iptables -P OUTPUT ACCEPT? #By default, assume the server is secured, thus allow all outgoing traffic. could be hardened in future |
10 |
iptables -I FORWARD -d 10.8.0.0/24 -j ACCEPT |
11 |
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE |
12 |
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
13 |
iptables -A INPUT -i lo -j ACCEPT |
14 |
iptables -A INPUT -i tap+ -j ACCEPT |
15 |
iptables -A INPUT -i tun+ -j ACCEPT |
16 |
iptables -A FORWARD -i tap+ -j ACCEPT |
17 |
iptables -A FORWARD -i tun+ -j ACCEPT |
18 |
iptables -A INPUT -p tcp -i eth0 --dport? ssh ?-j ACCEPT |
19 |
iptables -A INPUT -p udp -i eth0 --dport 1194 -j ACCEPT |
20 |
iptables -A INPUT -p tcp -i eth0 --dport 1194 -j ACCEPT |
21 |
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT |
22 |
iptables -A INPUT -p tcp -i eth0 --dport 21 -j ACCEPT |
23 |
iptables -A INPUT -j DROP |
25 |
iptables-save > /etc/iptables.rules |
发表评论: