OpenVPN软件选择
目前openvpn有两个软件供选择:
一个是OpenVPN Community Edition,社区版本,它的服务端和客户端的配置文件需要手动编辑,客户端凭据需要使用SCP或者SFTP复制到各自的设备。
另一个是OpenVPN Access Server,服务端应用程序,允许你使用浏览器来配置OpenVPN。
对于小场景下应用,OpenVPN Access Server可能是较好的选择,因为它配置简单,用户体验好。
不过免费版本只允许两个并发用户。我们这里介绍OpenVPN Community Edition的使用。
网络规则
OpenVPN目前不支持单个实例同时使用IPv4和IPv6。只能选择其中一个。
IPv4防火墙
1.清除任何系统可能预先存在的规则和非标准的规则链
- sudo iptables -F && sudo iptables -X
2.使用如下规则:
/tmp/v4:
- *filter
-
- # Allow all loopback (lo) traffic and reject anything
- # to localhost that does not originate from lo.
- -A INPUT -i lo -j ACCEPT
- -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
- -A OUTPUT -o lo -j ACCEPT
-
- # Allow ping and ICMP error returns.
- -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
- -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
- -A OUTPUT -p icmp -j ACCEPT
-
- # Allow SSH.
- -A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 22 -j ACCEPT
- -A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED --sport 22 -j ACCEPT
-
- # Allow UDP traffic on port 1194.
- -A INPUT -i eth0 -p udp -m state --state NEW,ESTABLISHED --dport 1194 -j ACCEPT
- -A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED --sport 1194 -j ACCEPT
-
- # Allow DNS resolution and limited HTTP/S on eth0.
- # Necessary for updating the server and keeping time.
- -A INPUT -i eth0 -p udp -m state --state ESTABLISHED --sport 53 -j ACCEPT
- -A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
- -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 80 -j ACCEPT
- -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 443 -j ACCEPT
- -A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
- -A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 443 -j ACCEPT
-
- # Allow traffic on the TUN interface.
- -A INPUT -i tun0 -j ACCEPT
- -A OUTPUT -o tun0 -j ACCEPT
-
- # Log any packets which don't fit the rules above...
- # (optional but useful)
- -A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 4
- -A FORWARD -m limit --limit 3/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 4
- -A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_OUTPUT_denied: " --log-level 4
-
- # then reject them.
- -A INPUT -j REJECT
- -A FORWARD -j REJECT
- -A OUTPUT -j REJECT
-
- COMMIT
注意:
TUN虚拟接口是OpenVPN用来与你的硬件网卡eth0通信的。
你可以使用sudo iptables -S来加载上面的规则。
禁用IPv6
如果你的VPN仅仅使用IPv4,IPv6应该禁用掉。
1.在文件/etc/sysctl.d/99-sysctl.conf增加如下行
- net.ipv6.conf.all.disable_ipv6 = 1
- net.ipv6.conf.default.disable_ipv6 = 1
- net.ipv6.conf.lo.disable_ipv6 = 1
- net.ipv6.conf.eth0.disable_ipv6 = 1
2.激活上面的配置:
3.编辑/etc/hosts,注释localhost的IPv6解析
/etc/hosts:
- #::1 localhost ip6-localhost ip6-loopback
4.增加ip6tables规则集来拒绝所有v6流量。rules.v6文件如下:
/etc/iptables/rules.v6:
- *filter
-
- -A INPUT -j REJECT
- -A FORWARD -j REJECT
- -A OUTPUT -j REJECT
-
- COMMIT
6.强制规则立即生效
- sudo ip6tables-restore < /etc/iptables/rules.v6
安装配置OpenVPN
1.开始安装OpenVPN
2.OpenVPN的服务端配置文件/etc/openvpn/server.conf从一个压缩文件解压出:
- gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
3.使用make-cadir脚本来从/usr/share/doc/openvpn/examples/复制必要的文件并创建工作目录。
- make-cadir /etc/openvpn/easy-rsa && cd /etc/openvpn/easy-rsa/
4.创建一个软链接
- ln -s openssl-1.0.0.cnf openssl.cnf
5./etc/openvpn/easy-rsa/keys的权限为0700,它不允许组和其它用户来访问。基于此原因,我们在server.conf的key设置绝对路径。
/etc/openvpn/server.conf:
- # Any X509 key management system can be used.
- # OpenVPN can also use a PKCS #12 formatted key file
- # (see "pkcs12" directive in man page).
- ca /etc/openvpn/easy-rsa/keys/ca.crt
- cert /etc/openvpn/easy-rsa/keys/server.crt
- key /etc/openvpn/easy-rsa/keys/server.key # This file should be kept secret
-
- # Diffie hellman parameters.
- # Generate your own with:
- # openssl dhparam -out dh1024.pem 1024
- # Substitute 2048 for 1024 if you are using
- # 2048 bit keys.
- dh /etc/openvpn/dh4096.pem
6./etc/openvpn/easy-rsa/vars文件用来指定OpenVPN服务器的证书颁发机构的标识信息,然后将其传递到客户端证书。 更改这些字段是可选的,你可以保持不变以减小工作量。
/etc/openvpn/easy-rsa/vars:
- # 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"
- export KEY_OU="MyOrganizationalUnit"
7.在easy-rsa目录,导入vars脚本
- cd /etc/openvpn/easy-rsa && source ./vars
8.运行clean-all脚本确保在keys目录中没有使用样本文件或模板
./clean-all
生成Diffie-Hellman PEM
Diffie-Hellman参数是在创建客户端的会话密钥期间当建立加密连接时使用的随机生成的数据的块。 我们将在/etc/openvpn/dh*.pem创建文件,其中*表示Diffie-Hellman密钥的位长度。 2048位是默认值,但在这里我们将使用4096位的密钥。
使用如下命令创建pem文件
- openssl dhparam 4096 > /etc/openvpn/dh4096.pem
将输出:
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
加固OpenVPN
1.对服务器和连接客户端之间的TLS握手涉及的所有数据包都需要匹配HMAC签名,没有此签名的数据包将被丢弃。 取消注释(通过删除;)并编辑行:tls-auth ta.key 0#This file is secret。
/etc/openvpn/server.conf:
- # 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 /etc/openvpn/easy-rsa/keys/ta.key 0 # This file is secret
生成HMAC密钥文件,之后我们会传输到每一个客户端设备
- openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
2.设置使用一个有权限限制的用户来运行OpenVPN
- adduser --system --shell /usr/sbin/nologin --no-create-home openvpn_server
取消user和group行的注释,并编辑user行,使用以上建立的用户名。这告诉OpenVPN启动时不使用root权限而切换到openvpn_server用户。
/etc/openvpn/server.conf:
- # It's a good idea to reduce the OpenVPN
- # daemon's privileges after initialization.
- #
- # You can uncomment this out on
- # non-Windows systems.
- user openvpn_server
- group nogroup
3.在CBC模式下,更改VPN的数据通道以使用256位密钥的AES。 Blowfish-128是默认值,但是AES_CBC通常被认为是OpenVPN支持的最安全的密码和模式组合(见openvpn –show-ciphers),并且可以利用AES-NI提高性能。
- echo 'cipher AES-256-CBC' >> /etc/openvpn/server.conf
4.将数据通道的认证摘要更改为SHA-512,一个SHA-2散列函数。 SHA-1是默认值; 请参阅openvpn –show-digest,了解所有支持的摘要。
- echo 'auth SHA512' >> /etc/openvpn/server.conf
5.将VPN的控制通道限制为强密码套件。 建议在这里尽可能限制,但不是所有的密码套件都可以与所有版本的OpenVPN一起使用。 通过使用SHA 2的TLS 1.2在GCM模式下将池限制为AES,并且在CBC模式下使用SHA 1在TLS 1.0上的AES和Camellia。
echo ‘tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA’ >> /etc/openvpn/server.conf
证书和密钥对
开始之前,先进入easy-rsa目录
服务器凭据
1.根证书(有时也称为证书颁发机构)是证书和密钥对,用于生成客户端密钥对。 在每个提示下,添加或编辑要在证书中使用的信息(或将其留空)。 使用服务器的主机名或其他标识符作为公用名,并将挑战密码留空。
2.然后创建服务器的私钥; 再次根据需要在信息提示处添加或编辑:
客户端凭据
连接到VPN的每个客户端设备应该有自己的唯一密钥。 此外,每个密钥应该有自己的标识符(client1,client2等),但所有其他证书信息可以保持不变。 如果您稍后需要添加用户,只需重复此步骤即可。
- cd /etc/openvpn/easy-rsa && source ./vars && ./build-key client1
客户端配置文件
1.复制client.conf模板文件并将其打开以进行编辑。 大多数客户端需要.ovpn文件格式而不是.conf,并且文件扩展名可以在提取期间更改:
- cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn
2.指定OpenVPN的服务器IP
/etc/openvpn/easy-rsa/keys/client.ovpn:
- # The hostname/IP and port of the server.
- # You can have multiple remote entries
- # to load balance between the servers.
-
- remote 192.0.2.0 1194
3.使用普通用户启动openvpn客户端(非windows系统使用)
/etc/openvpn/easy-rsa/keys/client.ovpn:
- # Downgrade privileges after initialization (non-Windows only)
- user nobody
- group nogroup
4.指定crt,key文件路径
/etc/openvpn/easy-rsa/keys/client.ovpn:
- # SSL/TLS parms.
- # See the server config file for more
- # description. It's best to use
- # a separate .crt/.key file pair
- # for each client. A single ca
- # file can be used for all clients.
- ca /path/to/ca.crt
- cert /path/to/client1.crt
- key /path/to/client1.key
5.告诉客户端使用先前生成的HMAC密钥。 如有必要,再次指定路径。
/etc/openvpn/easy-rsa/keys/client.ovpn:
- # If a tls-auth key is used on the server
- # then every client must also have the key.
- tls-auth /path/to/ta.key 1
6.由于VPN服务器被告知在其配置文件中强制某些加密设置,客户端必须具有相同的设置。 将这些行添加到client.ovpn的末尾:
- cipher AES-256-CBC
- auth SHA512
如果有为控制通道指定密码套件,将这些行添加到client.ovpn:
- tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
7.将所有必要的客户端文件打包到一个tarball准备传输。 具体文件有:
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
/etc/openvpn/easy-rsa/keys/client.ovpn
/etc/openvpn/easy-rsa/keys/ta.key
- tar -C /etc/openvpn/easy-rsa/keys -cvzf /etc/openvpn/client1.tar.gz {ca.crt,client1.crt,client1.key,client.ovpn,ta.key}
设置开机启动
- sudo systemctl enable openvpn.service && sudo systemctl start openvpn.service