VPN ⌛️
功能
test的环境 或 线上后台管理 需要连接VPN才可访问
- 在服务器安装配置VPN,设置用户,导出
.ovpn
文件 - 客户端安装VPN,导入
.ovpn
文件,访问限制访问网站
软件
- OpenVPN - 官网
- iOS - Apple Store * 需要【非中国区AppleID】下载
- Tunnelblick - 官网 - macOS
服务端安装
安装软件
bash
$ yum -y install easy-rsa openvpn
$ rpm -ql easy-rsa #查看已安装的RPM包中名为 easy-rsa 的文件列表
制作证书
bash
$ mkdir /etc/openvpn/easy-rsa
$ cd /etc/openvpn/easy-rsa
$ cp -a /usr/share/easy-rsa/3.0.8/* .
$ vim vars
sh
# 新建/修改 /etc/openvpn/easy-rsa/vars 文件配置
# /usr/share/doc/easy-rsa/vars.example 是示例
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Beijing"
set_var EASYRSA_REQ_ORG "zhangdi"
set_var EASYRSA_REQ_EMAIL "ex@email.com"
set_var EASYRSA_NS_SUPPORT "yes"
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 825
bash
# 在 /etc/openvpn/easy-rsa 目录下
$ ./easyrsa init-pki # 1. 创建pki目录,用于存储证书
$ ./easyrsa build-ca nopass # 2. 创建根证书,不加nopass会要求输入两次密码
# Your new CA certificate file for publishing is at:
# /etc/openvpn/easy-rsa/pki/ca.crt
$ ./easyrsa build-server-full ali-server nopass # 3. 创建server端证书、签名、私钥文件
# ali-server 名字随便起
# req: /etc/openvpn/easy-rsa/pki/reqs/ali-server.req
# key: /etc/openvpn/easy-rsa/pki/private/ali-server.key
# crt: /etc/openvpn/easy-rsa/pki/issued/ali-server.crt
$ ./easyrsa gen-dh # 4. 创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法
# DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem
$ openvpn --genkey --secret ta.key # 5. 生成 tls-auth key
bash
# 把相关证书整理到一个目录下,此步可无
$ mkdir /etc/openvpn/server/certs && cd /etc/openvpn/server/certs
$ cp /etc/openvpn/easy-rsa/pki/dh.pem ./
$ cp /etc/openvpn/easy-rsa/pki/ca.crt ./
$ cp /etc/openvpn/easy-rsa/pki/private/ali-server.key ./
$ cp /etc/openvpn/easy-rsa/pki/issued/ali-server.crt ./
$ cp /etc/openvpn/easy-rsa/ta.key ./
配置 OpenVPN
bash
# 1. 新建 /etc/openvpn/server/ali-server.conf
port 1194 # 端口
proto udp # 协议
dev tun # 采用路由隧道模式
# server 10.8.0.0 255.255.255.0 # 给客户端分配的地址池
server 172.31.250.240 255.255.255.240
# ifconfig-pool-persist ipp.txt # 保持客户端IP地址池
push "dhcp-option DNS 8.8.8.8" # 推送DNS配置给客户端
push "dhcp-option DNS 8.8.4.4" # 推送DNS配置给客户端
push "route 172.31.250.0 255.255.255.0" # 推送内网路由到客户端,确保加入vpn后能访问内网资源
# push "redirect-gateway def1 bypass-dhcp" # 将客户端的默认网关重定向到VPN
keepalive 10 120 # 存活时间,10秒ping一次,120秒如果未收到响应则视为短线
max-clients 100 # 最多允许100个客户端连接
verb 3 # 日志详细级别
client-to-client # 允许客户端与客户端之间通信
persist-key # 保持密钥持久化
persist-tun # 保持隧道持久化
duplicate-cn # 客户端密钥(证书和私钥)是否可以重复
comp-lzo # 启动lzo数据压缩格式
key-direction 0
tls-auth /etc/openvpn/server/certs/ta.key 0
ca /etc/openvpn/server/certs/ca.crt # ca证书的位置
cert /etc/openvpn/server/certs/ali-server.crt # 服务端公钥的位置
key /etc/openvpn/server/certs/ali-server.key # 服务端私钥的位置
dh /etc/openvpn/server/certs/dh.pem # 证书校验算法
status /etc/openvpn/log/status.log # 日志位置,记录openvpn状态
log /etc/openvpn/log/server.log # openvpn日志记录位置
# 2. 启动
$ systemctl start openvpn-server@ali-server.service
# 参考文档:https://community.openvpn.net/openvpn/wiki/Systemd
# Place your server configuration file in /etc/openvpn/server
# Use the openvpn-server@.service like so:
# $ sudo systemctl start openvpn-server@{Server-config}
# Replace {Server-config} with the name of your config file without the .conf
创建客户端用户
bash
# 服务端
$ cd /etc/openvpn/easy-rsa
$ ./easyrsa build-client-full zd nopass
sh
# zd.ovpn
client
dev tun
proto udp
remote xx.xx.xx.xx 1194 # server ip
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
comp-lzo
verb 3
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
#将server上的/etc/openvpn/server/certs/ca.crt文件内容拷贝过来
-----END CERTIFICATE-----
</ca>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
#将server上/的etc/openvpn/server/certs/ta.key文件内容拷贝到这里
-----END OpenVPN Static key V1-----
</tls-auth>
<cert>
#将server上的/etc/openvpn/easy-rsa/pki/issued/zd.crt文件内容拷贝到这里
</cert>
<key>
#将server上的/etc/openvpn/easy-rsa/pki/private/zd.key文件内容拷贝到这里
</key>
iptables
https://wangchujiang.com/linux-command/c/iptables.html
https://gist.github.com/jhazelwo/ce9a9fa9baa331fa455675d7927e939a
bash
$ iptables -F
$ iptables -F -t nat
$ iptables -L -n --line-numbers # 将所有iptables以序号标记显示
$ iptables -L -t nat
$ iptables -D INPUT 8 # 删除INPUT里序号为8的规则
$ iptables -D POSTROUTING 4 -t nat
bash
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ iptables -t nat -A POSTROUTING -s xxx.xx.xx.0/24 -o eth0 -j MASQUERADE
$ iptables -t nat -A POSTROUTING -s xxx.xx.xx.0/24 -j MASQUERADE
$ iptables -I INPUT -s xxx.xx.xx.0/24 -p tcp --dport 80 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 80 -j DROP
$ iptables-save > /etc/sysconfig/iptables
$ echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
$ sysctl -p # 这一步一定得执行,否则不会立即生效。
bash
iptables -I FORWARD 1 -i tun0 -o eth0 -j ACCEPT
iptables -I FORWARD 1 -i eth0 -o tun0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d ip --dport 80 -j DNAT --to-destination ip
iptables -t nat -A POSTROUTING -p tcp -d ip --dport 80 -j SNAT --to-source ip
参考
https://wiki.eryajf.net/pages/3807.html#_7-用户管理https://cloud.tencent.com/developer/article/2315269https://openvpn.net/community-resources/how-to/https://community.openvpn.net/openvpn/wiki/HOWTO