zhangdizhangdi

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-%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86
https://cloud.tencent.com/developer/article/2315269
https://openvpn.net/community-resources/how-to/
https://community.openvpn.net/openvpn/wiki/HOWTO