易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 190|回复: 8
收起左侧

Centos7.9系统安装OpenVPN-超详细

[复制链接]
发表于 2025-5-3 12:01:31 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 2 金钱 才能浏览
 楼主| 发表于 2025-5-3 16:31:13 | 显示全部楼层
at > /etc/openvpn/checkpsw.sh <<"EOF"& p6 b/ Z; I/ n* Q
#!/bin/sh6 }( T, N0 M2 ~) ~% k
###########################################################
5 j  ^# }9 _6 n: K$ B6 ?# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
% J0 t" F9 y* ?6 b* ~2 Y2 u% ^# J; }#& Y. ]/ u! r1 v5 L
# This script will authenticate OpenVPN users against
. B! X/ d) N( \$ m$ x# a plain text file. The passfile should simply contain; `6 _' B5 N; {
# one row per user with the username first followed by' h0 m3 o) R8 H$ L* ?. s) [( N0 r
# one or more space(s) or tab(s) and then the password.7 A3 h) g/ o% G
PASSFILE="/etc/openvpn/psw-file"
" Q6 Q+ z% @6 p0 d9 `% {, x- }LOG_FILE="/var/log/openvpn-password.log"
/ A2 M9 J; c8 P" N8 PTIME_STAMP=`date "+%Y-%m-%d %T"`  O) h: ~- B$ S. r
###########################################################9 n( C0 b: o- w1 i/ l
if [ ! -r "${PASSFILE}" ]; then  J- t1 H& `- B' k  ^7 a) B
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}/ Y1 M# }/ c" P9 [. e/ a8 \1 i) J
exit 1/ ^% N0 T5 p9 m
fi
* Q9 v; w# V, I: A# x6 K8 BCORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`  n2 O; a/ X. G$ W$ K5 l
if [ "${CORRECT_PASSWORD}" = "" ]; then( x# a9 E; u3 W# }! M
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}3 S5 i) L: Z8 c
exit 1
! I& x! {3 ?7 C+ U. xfi& p5 h% Z, _: |3 U! E% r. M
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then) K% n/ l/ P! a
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}! _/ i) b% t. R+ Z" l+ f+ h& N7 q
exit 0
9 p& F( F8 u4 I; {5 T2 [% u! Hfi! D5 I4 m; Z9 N
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
7 ?' g7 @! G% s* E: Aexit 1
6 H2 s% ^' ^) S$ C" }/ B$ \. CEOF
6 K4 b1 G4 N# E5 P) p1 B& }- W/ l. T) O- K& G0 o
chmod +x /etc/openvpn/checkpsw.sh; j: X  [1 O3 _0 t+ d" E2 y! W
systemctl stop firewalld, O4 m' j9 u& @. A, u
systemctl disable firewalld' _' A4 |, a# b; L: N
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux$ X$ V0 U3 s" O4 W: B6 m6 s$ }  C
setenforce 0
  K, R) H; ]) j9 V" p6 Msystemctl start iptables
' k) k3 t) s3 }% ?systemctl enable iptables  X: l* I$ [+ k0 |% t; j8 t
iptables -F& [5 l8 u# P2 M3 s
iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
  f. v4 s" t+ E3 Nservice iptables save( r  P& I9 i% L9 m
systemctl restart iptables1 _+ h2 L1 z4 b) n: o# ^( s: l6 A- K
echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf( J0 w* y1 f$ P7 X, f: c& g
sysctl -p+ M% \1 ^$ S* \) G
systemctl start openvpn@server% E; u- |% o" M8 ^) ^) o
systemctl enable openvpn@server 8 Z) P- D- z0 D2 e
systemctl status openvpn@server
/ g  @# a) h3 c! n" O  V# i& D6 Q: T$ O- H. i# P
echo ''>/etc/openvpn/openvpn.sh& j! B+ m/ i3 V! e7 |  H  @
touch /etc/openvpn/openvpn.sh
3 }6 j) L2 U% e7 h0 [# p0 zcat > /etc/openvpn/openvpn.sh <<"EOF"- y9 P8 W+ B- Q% E  w1 D) l2 c
#!/bin/bash
' I# |( N" O# t% `# E#by openvpn useradd/ M: Z" }! f: o4 [
#name LLL 2022年02月23日13:48:55% w7 M$ f6 T) s& g
###########################################
' w5 h( `! o  S#user="$1"
# F8 j6 m; q7 N5 w, J#pass="$2": @) u7 d# ^' l% z0 \& o
#ip="$3"
& t; P7 I4 {9 ~7 `& _easyrsa="/etc/openvpn/easy-rsa/3.0.8": c% V6 C/ h# ?8 {
function useradd(){
3 J; V5 @2 @+ N: kread -p "请输入用户名:" user5 S9 ]0 g+ G7 O( v
if [ ! $user ];then
. W; B- F5 y& Q4 b) o6 G5 f  I7 zecho "user is NULL"( z# S/ P9 i. S* h% d; x' `6 L
read -p "请输入用户名:" user1 L) Y7 k+ g  ?' @4 k" r
fi* g0 r, G( W) ^6 B
read -p "请输入密码:" pass! f- e7 x( G6 _4 \0 T1 n+ i
if [ ! $pass ];then
; p1 h" m& m$ Z( s" ~. qecho "password is NULL"5 M- Z/ o/ E- \8 f
exit
% f! g+ P5 R, pfi0 v4 i" n/ i  ~- S; W8 G' V& p
read -p "请输入IP地址(如:10.9.0.6 10.9.0.5,IP地址以4个为单位增加):" ip8 K- |# T/ K  m9 g& Y
if [ ! $ip ];then
, C+ `0 X( S9 _" z# Q! ^echo "ip is NULL"
0 X$ w) c1 a+ E* Xexit6 m* ^8 Y% D7 F' [3 h1 O9 g9 i
fi. H, S" ^3 A6 C; J" b3 T+ ^3 n& k/ ?* V
sh /etc/openvpn/client/ovpn_user.sh $user0 j, J$ e5 }2 a, I
cat>>/etc/openvpn/ccd/$user<<eof
8 ]* u: h  m" `; b8 L! Iifconfig-push $ip4 [# U; Z5 S& [! U
eof
6 k3 [. c$ N( _8 _0 xcat>>/etc/openvpn/psw-file<<eof- ]5 r- y; M: u- J5 u
$user $pass
# v2 [& h! D4 h1 T% L% N9 u6 j5 geof
! y+ w' d, j# F+ E" K}
, \% b( F7 J* R4 w/ k& m- y# dfunction userdel(){# `5 k: j, @" N( I
read -p "请输入您需要删除的用户名:" user
! p" \. K* w. R8 q: M- {1 J; o0 bif [ ! $user ];then6 l3 i$ t6 \- j, }
echo "user is NULL"
% }. O2 {8 N. Z  Ufi
1 c4 @3 c9 U# {0 ucd $easyrsa
8 X2 {6 \' ]+ m8 u2 ~/ A( Techo "-----------------------------------------------------------------"5 {9 @* s4 s4 }8 T5 U& Y& K; ?
echo "出现continue with revocation请输入yes"1 O5 b8 n- T2 x, S% E# V
echo "------------------------------------------------------------------"
# ]" f0 i: j' R./easyrsa revoke $user# ]& v) U  C( ^* `
./easyrsa gen-crl
" o$ U0 [3 I! _; W8 U$ |' S) x$ M+ [rm -f /etc/openvpn/ccd/$user
- \" A* I3 H, }$ B}4 t: m& r7 _5 p5 t$ V* r
function alter_user(){
+ B/ Y5 `: }- W6 K! P& b! ^& Uread -p "请输入您需要修改的用户名:" user: b# w/ z+ W6 K3 Q' R. [/ y
read -p "请输入此用户名的新密码:" pass* {% z  G( H6 {+ d8 ~/ C
sed -i '/'"$user"'/d' /etc/openvpn/psw-file* _' |4 {. f7 m7 f" U9 @, E
echo "$user $pass" >>/etc/openvpn/psw-file
8 M+ b# h0 P2 Q) J}
' E: j7 E: o) @) Pfunction alter_ip(){. e* \9 O& @' @4 c# u4 j7 u  a4 _9 E
read -p "请输入您需要修改的用户名:" user  z7 J1 X6 n* N8 ~+ I" c' j2 W
if [ ! $user ];then
( ]# H- J! @. x: l- r$ Jecho "user is NULL", Q' M% {( |( ]* p" s5 f3 Q4 D
exit
4 @- P0 N/ g7 P* G; ofi- b; p/ f5 n4 [; {: m, p
read -p "请输入您的新IP地址(如:10.9.0.6 10.9.0.5):" ip* A* }+ O6 W) X. ]; l
if [ ! $ip ];then
6 q. _1 I1 x+ Iecho "ip is NULL"
, F4 B4 s1 f: K/ Q# c7 w, F8 sexit
* w5 Q- X; q) c$ rfi' g. [6 }! N1 }2 h3 _. v
echo ifconfig-push $ip >>/etc/openvpn/ccd/$user
. o7 }: H/ t/ J2 d2 I) a}2 I! }( p7 c( R
echo "请选择您需要做的操作选项"
& t; S$ z% I" @4 N9 I# i/ N0 ]5 decho "----------------------------------------------------------------"; O% ]) T% |9 }" Y$ m) k
select VPN in "创建用户" "删除用户" "修改账号密码" "修改IP地址"( z5 g& B# i1 G* X% y; m+ P
do" y  `. L: R$ @5 D3 i
case $VPN in
0 O% ^( k- }- K7 ?3 m创建用户)
/ g3 W' @" k1 H8 C* x4 J: Iuseradd
. d1 \' g: d) e7 ]3 j;;
" o. B7 S) T- }- ], c& d+ u删除用户)& S/ T3 _  G: l" o
userdel
$ O2 ?8 B7 U+ |. I9 E) U;;* N% i9 u  [' X& W& b" v
修改账号密码)
" Z- n& V4 m7 lalter_user
- l, x/ k9 ^9 x  B; M;;
: g8 d; d) p: o9 I6 f修改IP地址)5 i2 X6 V% y" L  i" {
alter_ip$ V- t2 ~6 _) n0 @0 O) v# M& Y3 S
;;
, M/ ^: B# N+ b- oesac( }& E$ c& g" a( S  |5 c( B- {
done
9 T% R! E2 ?- j6 O. qEOF
2 K" a" A% ~  E  X; o. U$ S% i0 T! n: f2 Q( Z. d
echo ''>/etc/openvpn/client/ovpn_user.sh. m0 c" b: I5 D( e' I8 w( Z5 _
touch /etc/openvpn/client/ovpn_user.sh
: s' ?1 g( ]# p6 E1 g( {9 l0 hcat > /etc/openvpn/client/ovpn_user.sh <<"EOF"
* M: n- z; A" W7 ~# ! /bin/bash
0 ~+ \$ I$ j1 E3 k8 C- G. Qset -e1 t/ M# r8 x5 e$ y; P' V1 l
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
# W7 Y# B' [- E, K# |* `EASY_RSA_VERSION=34 M# L- ^1 }  B. Y" z; o* n
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
9 `. j4 g5 k+ s, [6 X2 Q( D3 LPKI_DIR=$EASY_RSA_DIR/$EASY_RSA_VERSION/pki
% X# o. v9 m2 F+ ?2 A) {7 A$ B  w/ C6 S8 ]1 A6 O/ E; r2 D
for user in "$@"
/ T3 d2 Y: \  s: ?# }2 R3 Mdo5 D/ c+ G* }, x# V  V
if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then- B! Z0 I) k% D( @8 n
rm -rf $OVPN_USER_KEYS_DIR/$user
. H: [, M+ S2 ^- J1 _rm -rf $PKI_DIR/reqs/$user.req; u# v% @- p9 D  G3 C1 Y
sed -i '/'"$user"'/d' $PKI_DIR/index.txt, X1 L$ J& ~2 o0 n. {
fi
( i- _/ S, [, A2 ^cd $EASY_RSA_DIR/$EASY_RSA_VERSION
: r/ x7 {$ i5 k+ ^' r# 生成客户端 ssl 证书文件
& O, {# t1 X, }; Q./easyrsa build-client-full $user nopass
" R2 U1 R- z1 k& ?# 整理下生成的文件; X. V% i" L2 s
mkdir -p $OVPN_USER_KEYS_DIR/$user- Q0 t1 ?  `/ w- e( r
cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/ # CA 根证书
$ j; Q' }+ Q; s# @% S' lcp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/ # 客户端证书1 `) F' D# M' B$ [# n( B9 B% ~; w
cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/ # 客户端证书密钥
9 X$ \" i* Q' s. M; Y) mcp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件  ~9 ?8 K# g9 _0 |: m1 @8 ?
sed -i 's/admin/'"$user"'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
1 Q" A/ z# L9 H. e& b5 vcp /etc/openvpn/server/certs/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key # auth-tls 文件
" l; Y1 ~3 Y/ n& N( N" Y, Rcd $OVPN_USER_KEYS_DIR
- g" i4 S0 Q+ y2 a( x+ [* x% lzip -r $user.zip $user# l$ k9 F8 [/ K& g" b
done
! l( t) w, {8 A8 b% Sexit 04 F8 f9 P0 \6 ]9 Z
EOF
) C' O* V7 C: ?
# ]3 F+ R4 [7 V8 G' Becho ''>/etc/openvpn/client/sample.ovpn  P* h7 b8 `6 _; y# f$ a: I
touch /etc/openvpn/client/sample.ovpn
3 F4 j- U( p0 @% o: kcat > /etc/openvpn/client/sample.ovpn<<"EOF"
 楼主| 发表于 2025-5-5 00:11:31 | 显示全部楼层
# 监听地址
4 R/ e1 t6 r' r+ i. h# n1 Vlocal 0.0.0.0  
( g- F' S# Z/ O9 B3 K$ b# Q : W$ \$ G& I+ W! |  E) n
# 监听端口$ H, N" t$ _& U' _$ L9 o; G( m
port 1194  
3 W( W, _1 C: D
9 }; Z: D5 C) p- p# 监听协议, L! c$ e) q' ~( J" J& u5 c% D: v8 e
proto tcp  
! N+ R. b' l7 y( g: o' C- K 1 s7 }* ^/ ^* n! j/ N
# 采用路由隧道模式7 \3 S/ [, s# Y4 r
dev tun  ! b9 L: I$ e1 a( u: W9 N6 }

/ e0 U7 ?0 I% W* Y4 s# ca证书路径/ y9 m/ Z1 @  J9 F. V( N' g! o' U: b
ca /etc/openvpn/ca.crt  ! z# ~6 A, y4 `8 `( P' _) U
% O: Q8 D- ~3 V
# 服务器证书
6 l) I) W  }& Pcert /etc/openvpn/server.crt  
- i+ f: Q/ W' v4 k$ g
- x6 ]* }) g5 h3 w# This file should be kept secret 服务器秘钥4 F) b( p" w0 `
key /etc/openvpn/server.key  
3 C. _, L% p6 }1 k/ b: O , @* |2 q7 t9 o+ l: C
# 密钥交换协议文件
2 n0 @# S% D" A  j7 Gdh /etc/openvpn/dh.pem  2 f: `* U) ]5 h) p
3 h9 J# y8 ]0 X1 J! q
# VPN服务端为自己和客户端分配IP的地址池,服务端自己获取网段的第一个地址(这里为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。注意:该网段地址池不要和已有网段冲突或重复3 v2 x, U9 _  b; i+ I5 l
server 10.8.0.0 255.255.255.0  ' z1 {$ L8 {) o+ B9 l/ r

" {. a/ g; A3 }" k) l1 q#使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思$ {0 T8 u8 L7 g9 d( c+ g
ifconfig-pool-persist ipp.txt
- ?. y' t: ^6 y! V4 C
- r' U0 v3 ]+ m$ n# 客户端所有流量都通过 openvpn 转发,类似于代理$ h; R2 y5 k  D2 z
push "redirect-gateway def1 bypass-dhcp"7 G' ]( v  z8 M  |9 M/ b

" S3 g! E- j- `* t2 Y# 注意:客户端配置,当服务端开启上面一条流量转发后,客户端需要配置如下2条,客户端只有访问192.168.0.0/24的地址才会走vpn隧道,也就是会使用vpn服务端的IP地址,访问其他地址还是会走本地网络& f1 M8 \) [: y5 W1 U
route-nopull6 Z# s7 u2 I. L$ Y! h' U  \2 e
route 192.168.0.0 255.255.255.0 vpn_gateway
7 n' s# s/ B! b% J& _ & s0 x8 {( p" M. ~, v) d
# 将服务器端的内网地址推给客户端,添加到客户端的路由表中,可以添加多条
8 u! @; A1 B; `2 ]push "route 192.168.0.0 255.255.255.0" . g6 m/ l8 T. f- g0 I

" @2 |$ M. H% A% l5 R# 服务端推送客户端dhcp分配dns: ^5 n- q4 b' G& @: X+ C
push "dhcp-option DNS 8.8.8.8"  . b3 j' p0 ]0 q' C0 K! d6 \

/ v$ k+ \# I' V. Q' U: U# 客户端之间互相通信
8 {1 C; M# y: Y+ Lclient-to-client
0 e+ x1 g. U+ v2 s3 P
, ^" @; Y2 Z: E* L# 存活时间,10秒ping一次,120 如未收到响应则视为断线3 G, ~/ ?1 K3 I, A8 y9 {/ z* b; p
keepalive 10 120
& y( t) f* ~8 g% b4 j7 [
8 X3 h) A' q! G- U, m# openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令
$ }( b; N% o0 d3 ^& s  o0 `% v/ Gcompress lz4-v2; e: F& W5 C9 z. C3 R* `
push "compress lz4-v2"  v6 ]! F( g6 ~( F8 S

& t4 t8 S2 X4 z6 r  K4 w# 启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置& x1 I% _  O( ^* u
comp-lzo* N  N1 v6 d6 R' o
+ L" _" J  t2 ]
# 最多允许 100 客户端连接" J# g) a$ Q( R# c- K8 {
max-clients 100  
, z' e: f  v' J+ }' M7 K# g$ `; u 0 |; l2 h8 S$ X, |2 j. `4 c
# 用户
9 n2 Y& |2 [2 ~user openvpn  $ \: B4 m/ c) x' o1 y+ j0 m

- Z% t) C! {; `% n* q7 F4 N) `# 用户组  3 u& G' U+ e& P; L, D; O$ e
group openvpn  1 ]* B0 O* B$ Z
# S. n. c6 u7 V: y
# 参数 0 可以省略,如果不省略,那么客户端配置相应的参数该配成 1;如果省略,那么客户端不需要 tls-auth 配置6 G9 b1 R9 T. R, Q1 n
tls-auth /etc/openvpn/server/ta.key 0  
7 e9 A% E& ~' i0 T$ t3 L
% d2 ~0 M5 z, ^9 B! P$ ]) r! m* q# 设置一个证书多人同时登陆,如果不允许则注释掉
: v" O/ t9 [) T: S! j: o) mduplicate-cn
) Y% c3 A9 }: T$ h% B
 楼主| 发表于 2025-5-5 00:34:17 | 显示全部楼层
最好的办法是禁止OpenVPN设置自定义缓冲区大小。在服务器和客户端的配置文件加入:
% _6 Z3 _, @. |: t# j6 m
. L9 T5 Z+ p6 Nsndbuf 0. A3 i  I. ^1 x: G: F2 K& g$ i
rcvbuf 0
7 b2 I; G3 t% c  G & C! _0 X2 X! H4 e
9 F3 D1 a, y2 b. f5 J
这样缓冲区大小就由操作系统控制了。对于Linux,这个固定值对于TCP是net.ipv4.tcp_rmem 和net.ipv4.tcp_wmem, UDP是net.core.rmem_default 和 net.core.wmem_default 两个值除2.0 c1 t/ r' O5 E+ Z5 v! `, r
7 u% f) f2 q' f& h
如果客户端配置文件不能修改,那么你需要从服务器推送更大的缓存大小:7 I. T( q& p3 V8 o; q

, Z8 k8 N/ @/ K7 U: d9 d0 Zsndbuf 0
  r9 N" J# D, N1 Srcvbuf 0/ m# V  S- P) C5 b
push "sndbuf 393216"
9 U: |3 m- T+ U4 w8 }push "rcvbuf 393216”1 ]0 J2 O2 a# B! |9 P9 L' f

! y' t3 s$ l, C& p. _! {1 @7 {3 T5 a
UDP和TCP不同,没有窗口大小这一说,虽然不是整个系统都需要。但是缓冲区过小也有可能降低速度。如果你把缓冲区调成0后还是慢,你应该要么在系统层面增加缓冲区大小(net.core.rmem_default 和 net.core.wmem_default),或者在服务器推送更大的缓冲区配置:
# [8 a, X: a7 X* m+ n- h, k/ M; e0 ^/ s
sndbuf 393216
0 Z6 ^" B+ c% \1 V5 wrcvbuf 393216
/ d6 W; A3 L' {: S+ U) b* \push "sndbuf 393216"; o) A  l& I& E. F- k
push "rcvbuf 393216”
: `# N7 x2 W! K$ A8 ^
 楼主| 发表于 2025-5-5 01:04:47 | 显示全部楼层

- H: Q+ d$ M: U3 ]& l& q这部要做:2 a8 o7 K/ D1 l" N; o/ Y- q* ?
firewall-cmd --permanent --add-service openvpn# v# g8 n& g! O6 @# z% `$ F8 a
firewall-cmd --permanent --add-masquerade
. o8 d4 o8 d, h- @* Z3 _  ?firewall-cmd --reload- h  C' j) j! f. q( |4 m5 H/ Z
! `6 f2 @; [1 v# q
: |* F  }0 Y6 v" F, y+ Q/ z* p
优化后的配置:* h. w. _- ?9 ]6 [! T3 W1 w1 F" u% I
! n& H6 N4 L$ Y& V: M( O
" S$ Z/ j% s: M: a0 i& u
服务端配置 (server.conf)
, ?5 I: j( A' T' N1 o# 基本设置
" E+ C6 x& N5 ?% o! P  ulocal 0.0.0.0
7 M6 }- [' m2 y' ^' n2 s$ t8 Bport 2197
$ z) B. [  H3 M2 d: y8 b8 g  U1 zproto tcp* u% D; O" U! l4 B2 c2 S
dev tun& A" T% o8 [& z- K% ?5 y, b& `# X9 U
topology subnet) @1 i. Z1 x0 U- z

/ h8 w( M6 E. \3 Y
+ V9 b; n5 O2 e
# MTU/MSSfix 优化,避免 TCP-over-TCP 卡顿和重连
( M4 A- i1 Q, z; stun-mtu 1450
0 J% q& c7 |/ \/ ]mssfix 1410
& I# m7 m6 T+ ^# A1 q% jpush "tun-mtu 1450"' `- C* s& V/ L" s# D
push "mssfix 1410"( A/ |$ b$ B9 u3 O: r( p

2 E$ |( l+ G" T
9 E! W7 G8 @- [+ H
# 证书路径
: `* J( r/ A4 u9 ?8 A  |7 v" Rca /etc/openvpn/certificate/ca.crt
* I& O. X$ n% I+ {. }. Zcert /etc/openvpn/certificate/openvpnserver.crt$ \9 }' m' a" _8 \# E
key /etc/openvpn/certificate/openvpnserver.key# p) S9 j  w$ O/ v* \
dh /etc/openvpn/certificate/dh.pem  f! m$ \/ j0 M8 y6 D2 {
tls-auth /etc/openvpn/certificate/ta.key 0: t, R1 J) W0 _" I
tls-server, \% D2 e0 z3 d- M7 E: C/ O4 n

' M2 F: X* g1 h+ ]! [  a6 x* |" L
. H0 N% ~. A8 z' l
# VPN 内网网段5 ~% A0 f7 F% k0 t) ?
server 10.10.10.0 255.255.255.05 z) u0 N$ |, h2 p" ], V
ifconfig-pool-persist /var/log/openvpn/ipp.txt2 g( b, d3 l9 Y
4 }% X1 Q: I3 W4 ~2 z( T
( [6 [& R: Z$ K
# 内网路由推送6 l: j0 f. D! H/ a/ {4 k$ x
push "route 192.168.16.0 255.255.252.0"& {. H7 Q  N0 y- }4 U' }8 Y1 b
push "route 172.30.1.0 255.255.252.0"; H$ G1 ]2 |5 @9 v
/ x3 G9 Z! N1 k. x

0 ?) [* p7 r7 ?2 d* R+ ]# DNS 推送
" n; V6 l. v2 m/ Y6 hpush "dhcp-option DNS 119.6.6.6"5 z' F' I8 p; f6 ]6 s/ b% k
push "dhcp-option DNS 119.7.7.7"' i- u! A2 }0 [( T7 e
) r' |# ~/ J: t6 B" o% \+ m, w, b* D
+ S0 C. @3 [- ~% j* C' O& I
# 客户端互通* ?$ m1 x& V; i$ l, g
client-to-client
1 q" `: M4 F" R; {! a
7 {$ I$ Q- i* X% I* W9 X2 O4 C
0 ?; u" ]5 a- ~1 p
# 保持连接,优化 TCP4 o: l& ~& @% S# ^
keepalive 10 60, m. n" O8 X. P5 Q. k5 F: \
tcp-nodelay* v+ H, J5 L  y+ Z) r7 ~: ^4 U

) G) R2 N  y7 l
6 ^+ p' U# m. H- e% q
# 加密和压缩
& E( A8 U6 P$ b, Ycipher AES-256-GCM. n  x- y+ S3 a% Y5 V" G4 N5 B8 e; y
auth SHA256
2 u% S+ [0 `! q. ]compress lz4-v2# h6 D. ]- a) C/ r; L$ ^% H  K
push "compress lz4-v2"/ O: i$ M' ~. d" H* |& X# |
1 L+ ]1 J- J9 r. c$ w2 x
: S0 M' f3 h% d. g3 M2 h
# 客户端数量8 R, g0 S0 m! f7 U! c& U+ L
max-clients 250
. _8 v/ J" x6 pduplicate-cn   # 如果允许同证书多端连接
0 t9 Y+ k9 X2 a7 l+ b' g9 J6 o; w2 A/ Y/ l5 \* R
5 e& r! f! L8 s2 j9 j
# 用户权限
) _/ c( N8 D: |  n5 v  ]user openvpn
/ `" [9 ^4 P4 _  Q- D* v& ?$ I& Egroup openvpn/ V- K8 [0 p# g$ C! b7 T+ a% m
persist-key
# D. h; u3 S- E# ^persist-tun
+ z% j& S$ G, ^0 C6 }/ H6 [
/ y; c% r+ @  U) t: r
0 N4 U! w0 _! q
# 日志
1 P/ v# p' r0 ?- Cstatus /var/log/openvpn/openvpn-status.log! @: h, a8 P( r  M# S! f
log-append /var/log/openvpn/openvpn.log
1 m1 Z  t, P+ y% `: N: ?7 Yverb 3  X9 a+ g% R$ a2 F! `* @
6 m# L9 B( k9 W$ ~/ v$ F" r
/ w: `% m5 F* Z
客户端配置 (client.ovpn)& R9 Y+ Q  j) I. h
client2 E& s9 f( ~; v
dev tun
7 E  W7 @" I- s$ ^3 n, Hproto tcp1 D7 e( U5 J( d" g# O
remote 119.99.99.9 2197, ]5 v+ w1 _- v, W# B! P1 N+ M  ?
resolv-retry infinite
" G: h8 _7 i7 Rnobind
8 k; x) _& W9 |$ I, ?remote-cert-tls server
6 a, _; M) ^; V  Q( }% n
' g# B6 U# x- X9 d' K2 I( z, u4 ~5 ~
7 q/ c9 E' h2 f! u, v0 ~! K
# 证书
; M3 K5 v  A0 |$ x7 pca ca.crt
( @) M/ O. \4 t8 U$ f( `cert rui.crt
1 x2 |( y' H7 i! _. p& o: T1 Nkey rui.key) l2 J7 k* j- |  m3 m
tls-auth ta.key 1
+ h5 l5 |- w% J3 S" b& [
% \8 g" g( [; e2 V. m5 g

- |3 K$ A5 H3 E: ^: {% z# MTU/MSSfix 同服务端! e1 N1 l) [* j" o# W
tun-mtu 1450- c# @/ J& j1 i
mssfix 14104 D7 t! f, [& v' m: J

. t8 }+ w! Z+ x/ o9 N

/ E( y) M8 n1 b7 ?2 S  I$ v# 加密/压缩一致" _$ y6 p" Q0 K; R$ t4 y6 X: \+ x
cipher AES-256-GCM/ n" I/ W1 I% X; Q" f' V$ _* E
auth SHA256  E6 ?  Q* c& G
compress lz4-v2
) m* ^( H: g+ p+ d% q4 g( O0 O# H0 \" h9 n4 t9 k4 f6 I, p8 q& V
7 g. q+ g& m$ G; C+ x3 T, {1 w
# DNS4 ^/ p1 K  b1 G8 M6 i* G( l
dhcp-option DNS 119.6.6.67 n% [) H8 S, t: r& G
dhcp-option DNS 119.7.7.7$ R7 f* S* W7 H& _

3 F- X# ]. ^% T- G* I7 o
+ T+ [. S2 D6 k( H: u( k5 ~
# 自动重连优化# p2 K/ v$ f6 _! A3 w9 q3 N) ?
keepalive 10 60
8 C: s5 ?  j8 v5 L2 f4 v  g& dpersist-key. k9 J* I% [" D/ l% P3 h9 e
persist-tun# g. Z7 L; A0 j% P9 y
remote-random
7 w7 Z) t6 H6 a6 n$ ~0 i, |5 \, ^tcp-nodelay
9 u2 `* O- }6 \7 u+ M0 O; ]. dresolv-retry infinite: z) L3 @" j# R( P3 F  R
8 g, J$ u* z# b9 r% w- m

3 j1 n6 C2 N9 m2 i3 D3 S3 [1 X6 `# 日志和调试
1 v/ `' F: H5 G" I* r; j3 P; ^verb 3% l; J2 O, B3 c

2 {# N+ W0 z, ]9 B! d; d/ S
2 N6 v5 X5 |  G: G7 U: j
 楼主| 发表于 2025-5-5 01:09:01 | 显示全部楼层
Centos7安装与配置OpenVPN服务器,更新 CentOS 软件包! d1 D/ s7 c  a) h( w
2 o; Z8 j/ a5 |$ p1 U2 m; n
代码语言:javascript代码运行次数:0
. q5 \- q8 O1 `( W4 S$ S0 S$ t+ a运行3 K* q5 `: l7 f) q
AI代码解释$ ]. `$ e7 N8 A# G
yum -y update
  f/ i/ T0 ~; w; w: W& E虽然也是可以不进行更新直接安装。* |" }# J4 G! E! p
9 a6 J  ?. o1 `0 S$ Y
安装 OpenVPN 和 EasyRSA
2 V7 {9 L9 ?' ]1 ^$ Y
! }9 F  d% u% s$ x安装 OpenVPN、Firewalld 软件包以及用于生成各种证书的 EasyRSA
7 T, N0 F+ z1 E" m+ g' h6 R6 J$ N5 ]7 E' }
代码语言:javascript代码运行次数:0
1 Y* m' p6 W2 k. d' T运行
2 z7 k/ ~* R% W2 c6 k& b! tAI代码解释
% \+ \# j1 ~& c; B5 ?& c. {( Ayum -y install openvpn easy-rsa firewalld
* y9 |' b: I6 r& H9 Q8 P如果未能成功安装 OpenVPN,则可能需要先安装一下 Epel 库。
7 G5 {% C' x/ m( x' T' @) i& c' [. f9 w/ Z3 ~3 L5 u
代码语言:javascript代码运行次数:01 t! w! t- [1 Y! y+ T2 l
运行
; y1 g' B) n/ k# }AI代码解释
/ s! L* I# k$ J' V3 n" Wyum install epel-release -y0 }# q- G! N7 s
生成 CA 证书、服务端密钥与共享密钥( r' V3 |9 ]. z& {& a9 r, B  D: D
0 R) `9 w$ r7 h
这里步骤比较多。" v1 L. b8 y1 R, M. v2 V
, {" ~/ a. V: F- J* j
首先需要初始化 PKI2 U2 b, s3 |7 k, d5 F! p4 Q, C

, {# L5 `# b* O+ ?& M代码语言:javascript代码运行次数:0
$ i  B) G: r% G运行" G- E6 F7 @; z! `  F+ \
AI代码解释4 f" n% V7 s! ]5 W3 @
cd ~
# Y9 M' A# d+ A6 ^) X/usr/share/easy-rsa/3/easyrsa init-pki* u) ?. I  k: F2 K; z
接下来是生成 CA 证书
# B7 s7 d) V9 |& u  u1 G! v) B( @* {/ T6 k  i) |9 J/ I- T( W& o4 d
代码语言:javascript代码运行次数:0% k+ c$ M5 V2 n% N& y7 U! \
运行
& \! J  d# p# Q' I1 z$ SAI代码解释$ {* V- P; J( F1 k9 B: X2 P- u
/usr/share/easy-rsa/3/easyrsa build-ca nopass# H! F, B2 A0 H$ ]$ `  D9 Q3 Z- ?, Q
其中 nopass 表示不加密私钥,主要是方便后面导出公钥与颁发服务器证书。
5 X; q8 r5 o. l5 ]8 J3 l( t
) \' O) E7 \8 S" E) Q: N2 B( m' V* B再来是生成交互密钥
# Z  \$ K* E, O. _0 M& c
( l1 c: t2 t" ?( T4 a代码语言:javascript代码运行次数:0, n. B+ K0 G$ F1 y
运行
# Y# ^* K6 H/ Y: l% @) PAI代码解释+ r9 W$ @0 M1 e+ o4 ~
/usr/share/easy-rsa/3/easyrsa gen-dh6 q8 ~! X' I2 U3 {1 J% @5 N+ M
开始生成服务端密钥7 e% [( A: n+ p/ R3 t% I
" y1 M2 B) ?7 q. w1 C
代码语言:javascript代码运行次数:0
, O9 k' I' F4 O& V; P运行
8 j. d, {2 n. |. S& i5 h  dAI代码解释
$ R# A0 b4 a4 x, D/usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass
3 p" B4 G' `1 u# c接下来生成客户端密钥,如果未开启同证书允许多人登陆,则需要多次执行生成对应的客户端密钥) ]$ i/ p+ v& ?9 @
3 L. i% t" i3 N7 o% I' ^+ A3 }
代码语言:javascript代码运行次数:0* s0 v4 e; ~/ c  R
运行
( G5 c" {: ~1 f1 {1 b' K/ hAI代码解释8 w' z0 Q  V. T) _( ?$ t9 M3 B
/usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-01 nopass
: i1 O9 D, {% J) r8 p8 j8 b. n7 @最后是生成证书交互列表,如果不需要 crl-verify 则可以跳过
  F6 z+ L8 n6 E- l' A/ o0 e
# K( w# p3 ]$ M& Y6 j2 K代码语言:javascript代码运行次数:0
3 D" F7 f4 n5 I$ c4 S: P$ L运行
. _4 B/ c$ D! E. A9 ZAI代码解释
4 y, a1 W# u, u( O4 n; O' \/usr/share/easy-rsa/3/easyrsa gen-crl, I4 I7 p) ~" |2 w9 V- E
其实到这一步需要的证书都以及生成好了,如果你开启了 tls-auth 则还需要生成共享密钥$ n4 h' L1 ~! Q# n7 L' ?

8 f) ~$ |; e  w' l代码语言:javascript代码运行次数:0# b, r5 M; P8 U( W0 B
运行
4 M  {" j4 }5 b1 dAI代码解释8 |6 @2 {$ M5 `* H1 [, x) ?
openvpn --genkey --secret pki/ta.key: t2 s  E: e  W' r1 z$ N. |
在上面所有证书都生成完毕之后,我们需要将相关证书拷贝到 OpenVPN 的配置文件夹中(似乎也可以在 conf 文件中使用绝对路径)) ~2 m$ f! |. I3 e) Z
" k) A6 B! u6 w
代码语言:javascript代码运行次数:0- I/ g8 A+ F$ H! R5 U
运行# M% `- F: @( x4 h
AI代码解释  @9 W! E+ z2 {7 F  R$ ?/ s7 E
cp pki/ca.crt /etc/openvpn/ca.crt4 S9 V  x2 M, i
cp pki/dh.pem /etc/openvpn/dh.pem
6 W' B5 ]7 D/ H( H' w4 Kcp pki/issued/vpn-server.crt /etc/openvpn/server.crt3 |0 U8 q! I* a4 A' T
cp pki/private/vpn-server.key /etc/openvpn/server.key
: W: Q9 P0 K5 @: d1 lcp pki/ta.key /etc/openvpn/ta.key
* ^1 X2 g7 t2 j4 N) A7 x5 ]5 Mcp pki/crl.pem /etc/openvpn/crl.pem5 d8 b+ `( s$ {' L6 M/ n
配置服务端
3 o+ {" U/ P4 ~  m
$ O1 o; O3 j. C3 F/ WOpenVPN 配置文件有许多可定制化,具体请查阅官方文档。) i7 _$ U) C- h+ j
1 N$ x+ @9 m: S) t0 y9 V
代码语言:javascript代码运行次数:07 Y5 T( ~( @$ e$ Y- H: Y! E, F
运行$ J" {8 ?/ A" a  t) @
AI代码解释
6 ?% W9 ]% f$ w0 n; ncd /etc/openvpn
9 k0 w5 a- K2 ovim server.conf3 s" Z+ k2 w; F6 o$ T8 K: ^
将以下内容粘贴进去- M  T$ t+ u8 i4 _, A" N
+ |5 K7 S+ F/ k4 Z6 Y
代码语言:javascript代码运行次数:0
. f+ h* D- q: ~3 ]7 B$ C9 F1 g) d0 V运行2 K' J1 }! A; g
AI代码解释: ?/ y& c" d' G" L# N
# Secure OpenVPN Server Config
% x) g" V3 f6 R+ u8 A0 S$ s# Basic Connection Config
+ h5 U6 q( Z! [: @3 Zdev tun" }$ [) S, C  w6 C
proto udp
* S/ \& k4 l! O& P+ U+ h+ ]port 1194. P* ^  v; `$ J" a9 g
keepalive 10 1208 H4 W0 ?& z  s" X9 Q4 P
max-clients 5
( ^; V+ |4 e0 P, c$ N8 r# Certs
4 F3 h2 e  z4 Nca ca.crt+ R- l3 f7 C2 o3 r0 L. _* K7 p
cert server.crt
4 K- l  P% x) K; |$ l; ikey server.key
- a: G- R4 @$ k& vdh dh.pem
, t. Q" l1 }) y( Y- b  _# n3 @tls-auth ta.key 0
$ x) y& A( `0 e! R0 J+ X# Ciphers and Hardening
" f! b. K& e) y7 c7 G- qreneg-sec 02 _% v2 C7 q  Y( m4 L( j. ]
remote-cert-tls client- M- N7 C0 C# X
crl-verify crl.pem. R4 V/ `' s; I* O: U
tls-version-min 1.23 P3 e6 w0 O. e7 S- `
cipher AES-256-CBC- ]5 u  ?7 k! M0 S8 w, `  T
auth SHA512
# b5 s8 ?& t. Otls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256* ]/ m( Z+ O# t5 n4 w* Z" S( `
# Drop Privs) O3 e: \& G3 ?; `
user nobody
4 u% C# K% ~7 c0 }group nobody1 ]4 t: A  W7 C. _! Q7 U# W  p1 U# J" ~
# IP pool% K' i, W: a5 E1 p/ z; k) S
server 172.31.100.0 255.255.255.01 [! v! k! V4 E9 g: z" O
topology subnet
; M) L% J$ }) e) o/ D* E" z& V( Yifconfig-pool-persist ipp.txt1 X$ V- x  `3 Q- k' d, f4 v
client-config-dir client
0 t4 r% k' n5 [: l& ~( J# Misc# Z" N/ i' n. A# L! |" [3 Y  ?* n3 I4 b
persist-key( t1 I, T# n; e* ]
persist-tun' V, ^. N7 L/ ~2 a( k; k% M, I
comp-lzo- I- |7 \- }0 a7 |8 b
# DHCP Push options force all traffic through VPN and sets DNS servers. q8 q4 ]& D/ d: W# z! _- n) f! w
push "redirect-gateway def1 bypass-dhcp", Z$ C9 h( T, K. W. B1 [
push "dhcp-option DNS 8.8.8.8"7 x' H% c! l, N5 l+ k
push "dhcp-option DNS 8.8.4.4"
( d4 _' E' A1 K/ N: g# Logging" Y/ t5 R, k; S; O% _" N$ L
log-append /var/log/openvpn.log3 [1 f" c8 _6 n7 o
verb 3
8 b+ r# j, @8 E" E, v7 @启动服务端并让其开机自动启动
6 _% S7 v8 n6 s0 Q, N& n
3 o6 I& q5 v( |0 I, X代码语言:javascript代码运行次数:0
, A, a( [  @# H5 y% y( Q/ o运行' \& R1 t7 I3 b5 Y# Y
AI代码解释
- J( R9 x# v5 M& f2 jsystemctl start openvpn@server) ^, w% f6 m' N( n
systemctl enable openvpn@server
1 |" x, G1 q) z5 h" H- K- F配置防火墙与流量转发1 `, t% p9 s4 R/ ^8 b* W  p

6 |# B" S& T/ s* D放行 OpenVPN 入网流量与开启 IP 伪装2 h6 C3 y$ y$ u( q

: m) G* p5 R% K; |; ?& S  C代码语言:javascript代码运行次数:0
; x, w1 v" E6 @: K; `7 Z运行
# i9 u# O& c( iAI代码解释9 x8 G1 u8 d" E$ a$ A/ H- \2 z( n
firewall-cmd --permanent --add-service openvpn& `; i$ z* k5 X% Z! O% o
firewall-cmd --permanent --add-masquerade) F! @5 g, V+ R5 h
firewall-cmd --reload
$ {2 i3 x9 Z' Q* ?, C# ^检查是否开启流量转发
$ A, Z& t1 s' B( n. u& H, D
* H- L0 A5 a! B* y3 Q代码语言:javascript代码运行次数:0% ], v6 I+ S- g- g/ w+ I) |
运行& v9 N1 b) I, O! n3 Q. Q. v
AI代码解释' D) B+ t- d' ^" R. r& T! ?, w
sysctl -a | grep net.ipv4.ip_forward
; A2 d2 J* R& D$ ~2 f% o, p确保net.ipv4.ip_forward 等于 1,如果不是,则需要修改一下% L' [, F) k4 m5 e
' L1 m  B2 y; A) r
代码语言:javascript代码运行次数:0
$ I9 p5 s) [6 \- _: a运行
+ G2 J8 s( e, x+ RAI代码解释
) ^7 {, [) e/ O3 n5 Hecho "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf4 @, D4 d/ ?/ O4 M$ Y2 [  ]$ i5 L1 {/ e
sysctl -p6 P; F: C& l# H+ S: W) k
配置客户端
$ e- t  x/ t) e/ p0 e6 L& r9 w; p' Q9 n4 _: `9 H2 M) D
客户端需要拷贝以下文件
7 W$ X, F" t4 \
$ w* m) y) h+ [% J代码语言:javascript代码运行次数:0) \8 U' V: r6 k3 \0 b" G: U% D  w
运行# N0 b6 l7 w6 v3 v9 @3 g, [" z
AI代码解释# E% \/ ]5 E& m6 S; D. u
cd ~
* X, y) z9 n% {* D4 i9 Emkdir vpn-client-01-config
4 [+ F8 I/ \* |0 D! Q4 v8 bcp pki/ca.crt vpn-client-01-config/ca.crt. x  K+ W: p* q
cp pki/issued/vpn-client-01.crt vpn-client-01-config/client.crt
8 }9 p/ [# r6 l+ c2 z! D: `- Gcp pki/private/vpn-client-01.key vpn-client-01-config/client.key
4 W" s" x1 v  p6 T3 Ocp pki/ta.key vpn-client-01-config/ta.key
6 c0 v# H* @% J* o5 W最后vim vpn-client-01-config/client.ovpn并粘贴下面内容
5 ?. N: v. C" {  R$ [+ }" X) ~( P# v( K0 Q0 c& c6 }; G
代码语言:javascript代码运行次数:0
  p" G; {7 F2 s2 u  K/ E运行5 D& S2 Y; J1 k# U
AI代码解释
" \, w) j0 o5 O' C# Secure OpenVPN Client Config+ p3 j" X, R  i& c5 k" d# L7 L
#viscosity dns full& C+ v/ V. Z; U  d8 F
#viscosity usepeerdns true) b+ W* t+ i0 _8 J; [3 K
#viscosity dhcp true
% [( x' Z( v' \' ^/ Ptls-client3 G9 D" ?& B+ ]. D7 Z2 G: B; H$ h4 G
pull7 ?* x% y; b/ z/ \7 {
client* r/ f3 h* Q. T" n/ o
dev tun( J$ ~' M2 }. n" T2 A+ c9 }
proto udp) p9 s7 Z# p' ?6 T: w6 ]8 a. G3 D
remote 123.123.123.123 1194" j+ E, n- V) x! l, g
redirect-gateway def1
6 S2 B3 k0 m# W7 J+ n8 a* A0 O" znobind. f: @' h& [# s* q  ^2 Z5 G' ~
persist-key) D8 z, Z$ V6 I; v
persist-tun3 s( C) u/ V0 L3 y
comp-lzo# T& w  H* n! E, k2 g/ [/ f0 }
verb 3* H( m1 A. g) I' @! o
ca ca.crt" J: w# a  g+ l2 M$ |
cert client.crt# o. n" r5 f6 b; t! P
key client.key$ l6 i- L1 I( F( W8 V) j( `. a
tls-auth ta.key 1/ _* f6 h! u( g+ b8 c' Y- \
remote-cert-tls server& N& q3 G" a- N  r( H+ u* c
ns-cert-type server/ ~2 B- V5 [/ R
key-direction 1
8 i9 O  ?% v8 k' m/ H- H0 C! vcipher AES-256-CBC
8 Q6 u' r" e& p& Ttls-version-min 1.2  |9 o3 I3 q- H2 b: K1 @
auth SHA5126 U' v& t7 n+ d/ T9 O
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
6 w1 ]0 K; Q9 O( I
5 Y7 F- ]& L1 h: nremote后面填写服务端IP地址和使用的端口号,然后将 vpn-client-01-config 的所有文件拷贝到需要链接的电脑上,即可开始使用。
* x7 |8 }# O3 G8 L1 E  y
 楼主| 发表于 2025-5-6 23:24:01 | 显示全部楼层
调整压缩设置:启用压缩可以减少数据量,但可能会增加 CPU 的使用率。在配置文件中,你可以启用 LZO 压缩:
! H- i# E$ v2 `3 J) P2 f
( [# k* ?8 B# @: Q& K+ |comp-lzo
 楼主| 发表于 2025-5-16 14:23:56 | 显示全部楼层
Centos7安装与配置OpenVPN服务器,更新 CentOS 软件包
1 @) s) H: e& M, P, F" W
2 T: R2 |: h  t' \# }代码语言:javascript代码运行次数:0
3 A# U8 @4 B0 C7 s8 h. g运行
9 F( E- W, \" m, J& ^5 HAI代码解释; F  |- O9 s9 J* W
yum -y update; |$ O+ W; K4 F% `/ N
虽然也是可以不进行更新直接安装。& X; O( Q( w8 t* G. d) {6 k

# ]( W6 T. w3 V+ `. v* Q安装 OpenVPN 和 EasyRSA
/ d* C* S0 |( f- X
4 T4 O3 a$ C* @$ r# @2 s9 o/ ]安装 OpenVPN、Firewalld 软件包以及用于生成各种证书的 EasyRSA/ u, A2 [9 A+ q5 o/ C' T

6 @6 y4 g; i3 m1 Z! p) D8 Y代码语言:javascript代码运行次数:0: r7 M5 J& N0 H9 n5 U6 N+ h1 |) Z
运行
, j& h' ^# r: ^  t8 |AI代码解释
9 F* Y, Y9 V/ j6 Uyum -y install openvpn easy-rsa firewalld
0 E3 W( T9 k1 [$ L/ z7 ~6 E如果未能成功安装 OpenVPN,则可能需要先安装一下 Epel 库。9 J  w2 I% V: d
4 z3 P' P" S( ~9 x) W
代码语言:javascript代码运行次数:08 C8 z' a. I2 [, _& j$ I, J
运行
5 Z, U- ]9 ]3 }' ?2 y$ Z& WAI代码解释
) y3 {/ W: u. [yum install epel-release -y
( v9 T& [+ h2 J5 d0 `生成 CA 证书、服务端密钥与共享密钥
- J1 {# H2 O5 ?; }3 ~5 e* [& b- [' D$ ?6 {1 M
这里步骤比较多。
4 K( ]  r2 d/ {! Y* G& m8 y# Z7 _; O( d
首先需要初始化 PKI" D" E0 a6 i8 [* U$ \
) X5 ]3 F. Q$ r' j9 s
代码语言:javascript代码运行次数:0
/ X% C( U0 w0 r7 b6 f( k2 }运行! j- G% |7 Z3 `4 z+ n
AI代码解释3 y2 ^- |1 r2 y: t) }
cd ~1 l3 n2 o: \8 Q9 u) x8 c9 O4 L
/usr/share/easy-rsa/3/easyrsa init-pki
' f( r" ]( y' Z4 i' v, [接下来是生成 CA 证书
2 h7 h. \  E& X0 F# i
+ p" V$ |' ~! |4 E1 ^" ~- L. t代码语言:javascript代码运行次数:0$ [  }; _9 J( U7 b7 ^' X+ W2 V1 w
运行7 U& w: Z' A& |3 h$ d
AI代码解释
# F6 P( ~' o1 N% n/ v  g/usr/share/easy-rsa/3/easyrsa build-ca nopass; s. J% T. t/ |; M
其中 nopass 表示不加密私钥,主要是方便后面导出公钥与颁发服务器证书。
' X& B# S3 t1 b6 \* u0 ~6 ^3 Q' h  n8 [. |+ Q& s0 e" `$ E
再来是生成交互密钥
$ R' F  O6 e0 g# W; x" b: B  G" \' z4 a+ V0 m6 I/ H; T
代码语言:javascript代码运行次数:0; T! k7 u1 S0 C" C8 M# _; c
运行! F5 ]" c  N9 z( g  N6 Z+ y/ k" _9 O
AI代码解释
4 v+ b7 @+ `# R  \$ w/usr/share/easy-rsa/3/easyrsa gen-dh5 ]; y( C; q  Q2 i2 v
开始生成服务端密钥2 @7 M# D* n9 r3 F) M+ E& }% I

3 X! x5 ^6 j  `/ I: B0 Z$ E0 Z代码语言:javascript代码运行次数:0
- t( C! b$ @* n8 l! l! g: Z) r% h% s运行1 x* ^- s2 D1 K* I! N* C
AI代码解释
- l8 ?* v( b& U; v, V3 w3 _% h/usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass$ \7 F" z8 b7 @1 ~3 y1 {$ t
接下来生成客户端密钥,如果未开启同证书允许多人登陆,则需要多次执行生成对应的客户端密钥+ q9 _" i% X# C1 q$ f, |+ J

; E/ G8 d; J/ h. `% [1 h代码语言:javascript代码运行次数:02 q1 y) j& O* G6 |/ T. T
运行) b' z" E( c9 X5 h
AI代码解释
' K* m3 p; d& H6 L1 W: {/usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-01 nopass
9 ~0 \% ^8 P8 X4 o* R! ]最后是生成证书交互列表,如果不需要 crl-verify 则可以跳过
9 X" T% {4 A$ t& C1 g9 H5 K, s2 Y3 |( }& @+ L- r7 s4 C7 Y
代码语言:javascript代码运行次数:0
" G2 Y4 J3 H) v运行
7 r* c) y* k" E* V- IAI代码解释
$ V4 t9 ?6 J" |# A4 e& P) i/usr/share/easy-rsa/3/easyrsa gen-crl
) ^9 J; J7 I5 O其实到这一步需要的证书都以及生成好了,如果你开启了 tls-auth 则还需要生成共享密钥
8 O5 g4 e4 }2 p. _2 |% T$ i0 T
4 d: L1 o, W7 M: [5 f2 e+ g代码语言:javascript代码运行次数:0
5 y' X, F8 U& x+ m' u: ]1 [5 T运行. b7 T$ B0 t( \4 [3 g4 O( z1 G
AI代码解释
8 ~8 r( H4 H4 N5 E0 Kopenvpn --genkey --secret pki/ta.key' K8 @" V- ?; W: Z5 x0 o" b% k  v
在上面所有证书都生成完毕之后,我们需要将相关证书拷贝到 OpenVPN 的配置文件夹中(似乎也可以在 conf 文件中使用绝对路径)
; ^9 N9 ~) [; M* j/ |2 @8 _# l" b. F1 z; t9 g
代码语言:javascript代码运行次数:09 O1 h% r) N, O2 ?, f
运行
/ |% M2 p# u$ l, z4 Z( Y" k5 MAI代码解释
! \2 k) @: m- H8 o! _8 N4 Tcp pki/ca.crt /etc/openvpn/ca.crt
) y+ B6 i7 o# {2 D$ qcp pki/dh.pem /etc/openvpn/dh.pem
5 \' X( |9 U* ~1 Y5 lcp pki/issued/vpn-server.crt /etc/openvpn/server.crt
8 P! C* C0 c) p# fcp pki/private/vpn-server.key /etc/openvpn/server.key
2 e& ?5 K" |) U0 ]cp pki/ta.key /etc/openvpn/ta.key, Z% A8 @4 @; f! @
cp pki/crl.pem /etc/openvpn/crl.pem
4 o2 v, |: ]: k8 w5 x8 J配置服务端1 ?' `8 }% k- v9 }; J5 t
# r3 c4 ]$ b1 J5 Y
OpenVPN 配置文件有许多可定制化,具体请查阅官方文档。. L0 V7 f# ]) F# x
2 }8 U+ M- y# h: x. m! z5 W
代码语言:javascript代码运行次数:0
# ]# ?. x" e3 @0 S: M运行
( x! n$ U. v* E7 Y' P9 j7 AAI代码解释
, B4 H% k9 k8 xcd /etc/openvpn
4 ^1 o! _$ A1 Y; wvim server.conf4 I# [  M7 Y. B. n0 \
将以下内容粘贴进去3 z- p, x9 T/ N, e+ Z

, F$ z* X8 t' k代码语言:javascript代码运行次数:0
# X1 k: {8 a, v9 ^" y运行
# P7 d0 N7 L4 }AI代码解释
' B) Z" M7 K8 P; R# Secure OpenVPN Server Config" b/ S8 P$ ]/ p
# Basic Connection Config+ a% R/ D( U% S- @* j
dev tun# q9 o& @2 o: a9 o8 w7 |
proto udp1 l) u1 a/ `) `2 Y
port 1194
$ l0 w/ }; a5 w% [$ ^: g; L& p& Akeepalive 10 120; Z* q! r4 i! A
max-clients 5! t1 u& t7 v( Q% W
# Certs
) I' E7 j1 {" l$ \* B1 ]ca ca.crt/ ^# }7 ^2 d) K0 f4 ~
cert server.crt
+ b3 P) f% K. I0 Akey server.key
/ |$ ~4 v  L( F0 |. |- I+ {" a2 |( ^' Ydh dh.pem1 ~0 @+ D! e8 b3 f$ u; K
tls-auth ta.key 0$ a0 L. ^! x' f' L9 q
# Ciphers and Hardening$ J6 V0 L& {/ i, V$ }4 J
reneg-sec 0
8 x; G) q( O& t* D1 uremote-cert-tls client
! E8 j+ G* e' tcrl-verify crl.pem
; c& d/ i. G$ l0 u8 v2 ]3 ]; Qtls-version-min 1.2# E/ D% U7 b& n4 K# _
cipher AES-256-CBC
) a4 ^; H2 q0 k& z# vauth SHA512
1 F+ {+ P- s- }3 I* utls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA2568 ]: G) Q7 A) W1 A
# Drop Privs
- b9 @% F+ H5 e% W' s- z$ s: tuser nobody
, [8 x/ B! x9 D) {* bgroup nobody2 ^1 G1 _9 O- s8 m$ |7 E
# IP pool& m' }2 S# w" [# ?' r7 D. k5 m  O
server 172.31.100.0 255.255.255.07 z3 L! C$ k9 A0 O
topology subnet" N3 _7 a4 c& F' ^
ifconfig-pool-persist ipp.txt# c) E6 V. v7 v# x. `
client-config-dir client9 h% `5 z" b( f0 d1 d
# Misc
: {! o/ e" r3 {# @( opersist-key& |2 \' Q$ `+ J3 D- k
persist-tun' E; H( f0 p! e7 H; J) F7 H" ~
comp-lzo% ]7 y8 _1 a8 v
# DHCP Push options force all traffic through VPN and sets DNS servers
1 T* j* T% D5 g. R% Q5 V' opush "redirect-gateway def1 bypass-dhcp"
$ x2 I) X3 p* O# Jpush "dhcp-option DNS 8.8.8.8"% W+ I" I, ~8 f
push "dhcp-option DNS 8.8.4.4": I( U/ O  v" k. H* f* A
# Logging+ ]% O0 U( B( N& q! J
log-append /var/log/openvpn.log. a2 \" ~& }6 l9 {7 V
verb 3, n- z# Z: E/ k$ X; g
启动服务端并让其开机自动启动/ m) R% x+ V( K7 |

" b' X8 k0 ]8 p代码语言:javascript代码运行次数:0( \! ?5 C) e; d1 a5 V- \+ G
运行
+ |6 J4 H  E% q0 @. p0 p' l% M' nAI代码解释
1 G( _9 C7 l: \+ Z1 L# a: P. Isystemctl start openvpn@server
0 A1 u  K$ @( ]3 `, Q! z4 }3 `/ [systemctl enable openvpn@server
: W+ I! T% z0 D配置防火墙与流量转发
" ~1 H) }! ?: C! X$ s" ^  I( P
$ f# y4 V+ f5 X+ l0 R" {0 {放行 OpenVPN 入网流量与开启 IP 伪装
$ a6 U& \2 T! G8 Y& H
! e( o8 r0 _9 g% T. y  l1 t' t代码语言:javascript代码运行次数:0. T. D) _: F, s2 u1 {* z
运行+ J; B: v0 N) V/ ]6 M/ Q# ?
AI代码解释4 M) D0 X/ r" P1 S+ w, D
firewall-cmd --permanent --add-service openvpn
4 E  W) X+ A& J+ E% P- a; o" |firewall-cmd --permanent --add-masquerade
* o) i1 f* q  }* k1 u# A( T: Vfirewall-cmd --reload+ v. {) p" p- d
检查是否开启流量转发2 {; [0 N. ?* ^# ^4 t: I/ N

/ K  g  g1 L  `5 N5 z代码语言:javascript代码运行次数:0
# L3 e% @; Z: T运行
) I# C' U) s' q  K4 F3 F+ B( NAI代码解释8 L: K5 `/ u( M$ ^, ~" C
sysctl -a | grep net.ipv4.ip_forward
* w! M9 @" K, q6 _0 b/ N确保net.ipv4.ip_forward 等于 1,如果不是,则需要修改一下
0 m. _7 a9 A; E5 b
4 ^& l6 m) S' Y: A8 c0 f代码语言:javascript代码运行次数:04 V4 Z2 Q6 E4 S) {  S9 s4 c% ~
运行" V7 X6 F9 `  ?0 g4 |3 q8 X
AI代码解释
7 V5 y' H8 Z0 x, M* ~* y6 Gecho "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf8 P& x1 I+ \* n$ s
sysctl -p" H( t8 U6 ]; X9 X2 m
配置客户端4 ?  b- y& C' L4 [$ n2 G+ N
4 {7 S3 @  B5 F( i, T" D
客户端需要拷贝以下文件
5 f8 t" \  M6 H! P, b
' f) R, q& o  S代码语言:javascript代码运行次数:0
: A# g  T5 _8 l. h9 v' Q2 i% e, C运行
0 c5 B7 L/ V7 n+ \AI代码解释& J' B* j! G8 B- x$ x# `1 S7 \
cd ~: B: t  C" K5 t& i+ {# Z; f
mkdir vpn-client-01-config+ z4 U/ {) t3 v. R& D
cp pki/ca.crt vpn-client-01-config/ca.crt, M6 T+ U7 x4 x( O7 |! A2 b
cp pki/issued/vpn-client-01.crt vpn-client-01-config/client.crt
$ N( d! [$ D* |9 @6 D% s% _- w, qcp pki/private/vpn-client-01.key vpn-client-01-config/client.key
+ ]4 u" M  i' o( V4 ?2 ^) ^cp pki/ta.key vpn-client-01-config/ta.key
1 y( F# b4 p2 a5 l+ x' y2 a) I最后vim vpn-client-01-config/client.ovpn并粘贴下面内容
  B# @& q0 e) ~2 G1 p: ]; a- B, M1 r8 |' K- u( b6 D
代码语言:javascript代码运行次数:0" o7 B3 I: o8 t; S' T- x
运行
  y$ Z7 _7 A6 u9 B! BAI代码解释
: b$ j% K- u+ i, f# Secure OpenVPN Client Config
6 Y* f! k( ^7 g6 g0 E' t" m#viscosity dns full; Y: \" N; M) i7 o2 D( F/ a8 K
#viscosity usepeerdns true( k& f, g+ Z- z0 h9 O& g5 K
#viscosity dhcp true
) r5 l' z4 A' w5 x  |7 t. Xtls-client
- n* [$ [2 E6 r5 I7 M; wpull4 ^* |4 L6 n# l- j7 s$ J
client
4 {( w% A# t/ H& b- j9 N6 C2 e1 @dev tun
" \  u: o' S% V' X9 D1 Eproto udp1 f/ h2 o& z- X$ a
remote 123.123.123.123 1194' E  o/ A& e( G9 n) ?4 ]  k! r
redirect-gateway def16 W3 d% Y2 I9 ~: i( d' N& X  W$ y
nobind
" `' Z# S1 N9 g7 }persist-key0 ~/ }$ e2 o5 |2 h9 B2 b7 O
persist-tun
" N) \3 b: n$ i# Bcomp-lzo: ?0 U: j0 Y  b
verb 3
' U- t/ _; e$ q' S8 v- B' ica ca.crt' `3 X% A2 P/ D; e- g; F- U  \2 B
cert client.crt
' i1 z; i: O( k# Okey client.key
0 H  f+ ~7 ~4 a1 Y2 n) Ltls-auth ta.key 1
3 p, M& g, e7 V& i* p/ z0 tremote-cert-tls server4 C9 q4 h. A+ ]! K0 o/ {4 `9 ~
ns-cert-type server
. s  k# o6 o. p  M  A$ n3 k8 Kkey-direction 1& {0 Z# E' }4 B# z$ Y
cipher AES-256-CBC% Y) q4 ~' p$ S! R0 I, @: R
tls-version-min 1.2
4 {+ q3 L8 t9 h1 A9 H$ W7 }7 M5 P/ r) dauth SHA512# Z* N  _& {% Y+ m1 y) g% g
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
! W5 x) X& q! i! bremote后面填写服务端IP地址和使用的端口号,然后将 vpn-client-01-config 的所有文件拷贝到需要链接的电脑上,即可开始使用。
 楼主| 发表于 2025-5-16 15:22:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:37 , Processed in 0.070688 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表