易陆发现互联网技术论坛

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

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

[复制链接]
发表于 2025-5-3 12:01:31 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 2 金钱 才能浏览
 楼主| 发表于 2025-5-3 16:31:13 | 显示全部楼层
at > /etc/openvpn/checkpsw.sh <<"EOF"
) {# T7 m6 b  k. [" |#!/bin/sh& R) F2 }/ k2 @0 w0 O
###########################################################: t5 ]5 T7 c2 Z6 f& S
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
( F3 `- i& C4 i" F2 P#
+ }  y! g7 ^( D; W" w, |, _# This script will authenticate OpenVPN users against
9 s2 c: x( @/ q  u# a plain text file. The passfile should simply contain
. ]; G8 e6 f+ X2 C  Y& {4 [# one row per user with the username first followed by
/ a: p: }  C" f, l# one or more space(s) or tab(s) and then the password.
% U4 h4 M* b$ Y' e, [5 FPASSFILE="/etc/openvpn/psw-file"" m; |% M! F" |5 f4 V8 t+ m
LOG_FILE="/var/log/openvpn-password.log"" O; q% X; }9 y2 ^8 d% v  u( d
TIME_STAMP=`date "+%Y-%m-%d %T"`. }, j2 {* A* ~) ~) U% n/ G- }
###########################################################/ L/ X& b7 T  H% u" ~4 M' S
if [ ! -r "${PASSFILE}" ]; then
& H9 S: ~) }' }+ N* w# @3 Z9 techo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}+ H% x  o# Z. p
exit 1
2 A$ S9 g) Q' t/ Zfi% l" p' b$ c, v$ [
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
+ F2 N: ?, o8 zif [ "${CORRECT_PASSWORD}" = "" ]; then
1 _0 M4 L; B! ?. S9 Pecho "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}& A# v; u5 F4 G- ?7 j7 r
exit 1$ {5 z- v: L  E  Z) o4 w+ _6 c
fi
) q4 E9 U- l$ Zif [ "${password}" = "${CORRECT_PASSWORD}" ]; then$ \: p) z- k; ?- ^
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
4 P" h, F) k( B' o$ sexit 0
+ w* |4 s7 R0 Zfi
& Q1 y. B. D( ?* m  D6 `9 _' h8 P5 hecho "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
1 j( M3 o1 m0 d) J2 `exit 15 |) c" J: a  ^  n( S1 T0 F3 j2 j
EOF% O, _( N  |+ v2 R- Y

/ z) l8 r: e5 S9 _7 o: b  Fchmod +x /etc/openvpn/checkpsw.sh
5 j5 g$ S0 ~' U6 J- `( W% V. Usystemctl stop firewalld
7 R0 ]+ B5 j: f$ H4 psystemctl disable firewalld
* F; j( P' H& S' X2 wsed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
4 T' d/ `1 r- g3 ~setenforce 0
9 {" Y1 G. ]9 u- ]! B" ]+ u6 r$ o& Rsystemctl start iptables. e, U$ _; o: ^# g* x
systemctl enable iptables' D& {/ @' {% X, [9 w8 S# Q! c6 j
iptables -F
  Q) S, i+ H! O0 ^: v. kiptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE9 k7 Q) j; ^; g& i
service iptables save
# T" s7 b  f1 u5 g7 d, {5 ~1 I( ^0 ?systemctl restart iptables
; t6 F$ Y0 x! j6 o- Zecho net.ipv4.ip_forward = 1 >>/etc/sysctl.conf
; Z( u2 w+ e2 f# p. P: y- usysctl -p
1 A. T  _6 e% |. k' A- o! zsystemctl start openvpn@server
/ I4 F: [" N$ E' I! msystemctl enable openvpn@server * u7 ^2 b/ E) t" u
systemctl status openvpn@server
% b" f! m, x1 q* K8 j8 ]" E5 A$ p% K
echo ''>/etc/openvpn/openvpn.sh
6 m9 V7 T( W4 o6 Y- b5 L' ttouch /etc/openvpn/openvpn.sh) X4 o! v6 u- S% {$ M; [
cat > /etc/openvpn/openvpn.sh <<"EOF"+ g+ L3 w6 Y8 S; f
#!/bin/bash  @2 l5 M- X, A3 z8 V% b
#by openvpn useradd6 F& Y/ n* k( |
#name LLL 2022年02月23日13:48:55
$ M4 k. y/ s: e7 |8 d###########################################- x" m% ?% i3 {# B: |, K6 K
#user="$1"
/ w, e# @* x6 ^0 N# v- b* r#pass="$2"
1 j4 m) b  k( o* I" k#ip="$3"
1 m. _% a0 D, d/ ?& Oeasyrsa="/etc/openvpn/easy-rsa/3.0.8"
' Q* t" g. f7 n6 x0 Nfunction useradd(){
# K( \4 {8 H' h  `read -p "请输入用户名:" user2 h1 g8 W9 ?. I! ~5 W7 ]/ K( y
if [ ! $user ];then
8 q1 u5 ^: d, B( B) techo "user is NULL"8 j  W" w. {& G) T* w
read -p "请输入用户名:" user
1 E$ G7 K! t6 [  _fi
1 J* p. o  r) P6 x- i! _read -p "请输入密码:" pass2 I" }4 T) \( |" `2 U; {
if [ ! $pass ];then
1 K2 f3 y/ `. ?% J; H$ }: e& Becho "password is NULL"7 l) Y9 L9 X) Z* f( e
exit
9 L: a+ r5 k, T; w% C1 Lfi
! V* h* G2 E7 a; H9 |2 Xread -p "请输入IP地址(如:10.9.0.6 10.9.0.5,IP地址以4个为单位增加):" ip% N1 C& u( o) f; R( h1 V
if [ ! $ip ];then
5 a3 A7 {1 M5 K6 z- Uecho "ip is NULL"
) B: P' O; C! S6 nexit( Q# r( {. Y: U7 P# |/ }7 R( d
fi% Z4 }9 V. z+ T9 w# y; E% }) I0 _
sh /etc/openvpn/client/ovpn_user.sh $user+ I# M* \: `7 X% Y4 @, c( w
cat>>/etc/openvpn/ccd/$user<<eof
: `! T) m& l! E) A& Qifconfig-push $ip' Z9 K! y! b: X+ |8 W
eof
7 T- M0 M+ O& b: [. f; Jcat>>/etc/openvpn/psw-file<<eof
$ m6 }; E8 N4 R! d$user $pass6 A3 S; Q0 F6 H; v) Y. ^
eof
% ~3 f6 f1 N7 x2 k" W}, k0 g: p. V* c2 r; B2 G
function userdel(){* @1 Y; C! n6 m0 ], V) l
read -p "请输入您需要删除的用户名:" user
( k$ S% {# c( N, j* Q" V  wif [ ! $user ];then2 o/ Z5 ~, x+ J3 a; C
echo "user is NULL"
) H: e( b0 R( _  d; e: Yfi2 H0 m5 ?$ W. h" S7 v- F5 ^6 d
cd $easyrsa
3 J* C+ V& @. A6 N' \echo "-----------------------------------------------------------------"
- d7 P/ b7 {/ N& c0 oecho "出现continue with revocation请输入yes". v: v! e3 v+ M5 E3 z/ B
echo "------------------------------------------------------------------"  M$ @  h& T6 @8 T4 |2 m
./easyrsa revoke $user/ G, z, w7 N! O  i* e- [
./easyrsa gen-crl
3 H" B! T3 _! q% }/ A: L. krm -f /etc/openvpn/ccd/$user
5 Z' g- P" n3 t1 v6 ?/ r}
% S5 j+ x2 \* T' W6 @" R2 J( l) rfunction alter_user(){6 }" f6 R: S0 Z0 `
read -p "请输入您需要修改的用户名:" user) R8 Z; O+ W  x& p
read -p "请输入此用户名的新密码:" pass; m0 T, D  E4 K3 P4 R" `$ K/ I
sed -i '/'"$user"'/d' /etc/openvpn/psw-file+ |: r2 U7 A0 L' w4 ^- o
echo "$user $pass" >>/etc/openvpn/psw-file6 D4 w7 I  k, O+ Y2 m& }
}( W7 l5 R$ N; v- U: \
function alter_ip(){, n, a/ C: i8 p
read -p "请输入您需要修改的用户名:" user
1 U6 n2 a; A6 \if [ ! $user ];then
- x5 E* }6 K1 a0 W0 w* x$ w% necho "user is NULL", V4 B. L7 z8 r+ r
exit
0 |$ X3 u" n0 D# Kfi
0 _! F# c6 \) m% Z2 `' q) gread -p "请输入您的新IP地址(如:10.9.0.6 10.9.0.5):" ip! Y( n# i3 x+ K5 M( ]9 ^0 Q$ c
if [ ! $ip ];then1 p# P9 T8 O7 O. m) ]
echo "ip is NULL"
% G0 E% d6 `/ N. S0 Uexit
; u: A9 N$ `. H0 afi  w; L9 M$ Q  I! N
echo ifconfig-push $ip >>/etc/openvpn/ccd/$user; e# r4 i5 a; _9 c7 i9 m: ]" J
}
& l4 [" F1 ^; C1 G  G2 \& z* X9 mecho "请选择您需要做的操作选项"
4 `, j" a- y0 d' A, T1 @, xecho "----------------------------------------------------------------"$ k1 d3 n0 ^+ g
select VPN in "创建用户" "删除用户" "修改账号密码" "修改IP地址"
9 o2 V% |' t5 Zdo8 B: R- u7 n; D5 L
case $VPN in
# a) }; P/ ?. S  G4 N4 W7 k/ o创建用户)
5 M* H; b, l/ P" h( ?: |4 kuseradd
1 n9 o: D3 o4 D% M2 [;;. Z8 ?  C" ?6 v; y% ]. i5 b9 {
删除用户)7 L( \( v- }. t- F0 P# R
userdel
0 W0 k& X6 q6 s* Q" X;;- E) O$ l& g. c  @2 R/ Z5 z$ k" Q
修改账号密码)
7 u. E" a) m, d% j' o5 ]6 h3 a+ Aalter_user
1 M* b6 ~/ U% [, y( N/ Y# J;;
7 v0 n6 U  L  M+ U- C7 B. u4 @% c修改IP地址)- Q: T/ i) g5 q1 J
alter_ip
4 G1 z9 Q5 k! {$ }& M# y6 @;;
8 e9 Z8 V. `+ m- Jesac4 S- C3 A& C7 F  d1 w4 y" y! N
done
# a* O' I; B! |8 wEOF
8 E2 g& J$ K" Y7 C
2 h1 e0 U6 y, B6 H0 v- g- }echo ''>/etc/openvpn/client/ovpn_user.sh8 r" m. |5 c& Q2 g
touch /etc/openvpn/client/ovpn_user.sh
3 G: g! s8 Q  b- xcat > /etc/openvpn/client/ovpn_user.sh <<"EOF"
" r/ b$ F- D. F2 D4 C# ! /bin/bash- P9 p9 P, q- {$ p
set -e
' C* u* Z' \/ X; F* `0 F" uOVPN_USER_KEYS_DIR=/etc/openvpn/client/keys; z" B) m. E* w
EASY_RSA_VERSION=34 x& g6 s! ?: Q
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
3 T% W# a# G5 l& `; E' B0 v7 S: b( b% rPKI_DIR=$EASY_RSA_DIR/$EASY_RSA_VERSION/pki7 B9 f( }; Y; `! ?( |

4 D4 L' b7 w+ C5 s; @; Qfor user in "$@"" Y- `( h$ D( z( F8 C+ J
do
- n7 q  |: H& P5 r# xif [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then# D0 C9 v0 E  U  C
rm -rf $OVPN_USER_KEYS_DIR/$user
9 S6 ~4 v3 @) [0 erm -rf $PKI_DIR/reqs/$user.req
. ^- p5 F8 g6 o. ], Osed -i '/'"$user"'/d' $PKI_DIR/index.txt
+ r& I+ d' p+ y  Efi, s+ y- p/ i9 T; ~. P  U  I% F
cd $EASY_RSA_DIR/$EASY_RSA_VERSION6 w- {  Q1 J) W. k1 p& v
# 生成客户端 ssl 证书文件
- S1 D9 X8 H3 g! [6 K( i/ [" ]4 z./easyrsa build-client-full $user nopass
" k3 X1 ^9 z5 k# 整理下生成的文件/ l3 O0 |9 Z; P" m! c8 u
mkdir -p $OVPN_USER_KEYS_DIR/$user
5 k4 A) Y) M( g  K6 Z8 Scp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/ # CA 根证书+ i! x, Z' G( g3 |$ @$ |9 e+ }3 ~
cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/ # 客户端证书; ^2 o6 C& ]' C( g4 `+ W9 `5 }
cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/ # 客户端证书密钥
. g3 I6 ~( h, B& p/ fcp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件0 |( X  l; I$ x: y% b9 F
sed -i 's/admin/'"$user"'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn5 z; ]+ h8 a8 \3 m2 V
cp /etc/openvpn/server/certs/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key # auth-tls 文件5 a4 W- C3 j# C4 W: m  d! E
cd $OVPN_USER_KEYS_DIR
8 f# j6 l% a, |$ p% Bzip -r $user.zip $user, e1 a" z& X% E# D
done8 ~6 A  g  G  Y; Y! ~% H7 ~
exit 0
( ?: C0 k# t3 E" Z; u4 pEOF" a7 ?- I* E- `# [; [
' }- I, \$ m1 `0 o
echo ''>/etc/openvpn/client/sample.ovpn
  S( c) o9 U" e" Ptouch /etc/openvpn/client/sample.ovpn6 `9 u( p: }# h/ Z8 C
cat > /etc/openvpn/client/sample.ovpn<<"EOF"
 楼主| 发表于 2025-5-5 00:11:31 | 显示全部楼层
# 监听地址
5 Y, X4 |1 t4 M; Q: ~; r( Blocal 0.0.0.0  
7 P  C6 V# Q. K3 p. [! V
1 n0 y' Q: f6 k0 T6 ~# 监听端口, k, d2 r: z9 d
port 1194  
' a3 ]: v. _: Y ; S# l- }/ G2 Z3 B
# 监听协议
( ^1 B! o* [% V5 k- c% V( {proto tcp  
) S: [, a8 W6 d
9 t: P8 X) a+ F9 p8 Y# 采用路由隧道模式# |; f1 u; o  g6 o& v" W. m
dev tun  
3 {. o. P2 ?: ~+ Z3 B/ O 3 ?- }) k  h$ ~: ^% t5 N8 S+ [- b& j
# ca证书路径
- C, }& k# r8 S. e& Gca /etc/openvpn/ca.crt  5 x$ w& {( \8 ?7 X

5 i0 y0 M6 O3 H# T# 服务器证书8 `2 X0 @9 U1 C3 y( L0 K) w
cert /etc/openvpn/server.crt  0 A3 g7 q1 s6 }9 j7 {8 ]+ n

9 v3 H+ b. P( Y) Y2 i# This file should be kept secret 服务器秘钥
8 N9 w/ l& g; s" y% Jkey /etc/openvpn/server.key  
/ \' T9 ?! x% {3 l) L : k, I5 K8 t4 k4 }' r; U% c
# 密钥交换协议文件8 W7 M$ J9 j$ T5 \
dh /etc/openvpn/dh.pem  ' u" Y# B& A5 }. w; p- J4 v& C

5 w* J; v" c, p  [# VPN服务端为自己和客户端分配IP的地址池,服务端自己获取网段的第一个地址(这里为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。注意:该网段地址池不要和已有网段冲突或重复- ~: B: V" h. \' p) {' q
server 10.8.0.0 255.255.255.0  
" V$ X- e) X( o4 o% B 9 N$ \- G3 I) x0 o2 N
#使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思
8 u$ S+ q# C6 W2 Zifconfig-pool-persist ipp.txt
3 Y$ b4 V, L* e/ b6 K. k+ ] 6 q! p1 `  |# @
# 客户端所有流量都通过 openvpn 转发,类似于代理
9 W' B9 Q: L5 H2 t5 B5 }) ^' B9 m% ipush "redirect-gateway def1 bypass-dhcp"- s- E$ S, g. O9 A6 T% k
& G6 @& S' o4 p& u+ D4 h
# 注意:客户端配置,当服务端开启上面一条流量转发后,客户端需要配置如下2条,客户端只有访问192.168.0.0/24的地址才会走vpn隧道,也就是会使用vpn服务端的IP地址,访问其他地址还是会走本地网络5 P0 i+ Y! w+ P
route-nopull) @! m- O- x5 I3 U# r/ {( W8 o8 }
route 192.168.0.0 255.255.255.0 vpn_gateway
6 |/ Q9 Q% I  ?, \
" ~" J, l( D( K1 s7 h# 将服务器端的内网地址推给客户端,添加到客户端的路由表中,可以添加多条
, n8 j; `  N. J% ]1 d2 u# o+ E: rpush "route 192.168.0.0 255.255.255.0"
0 n( r' s$ M  ]+ _1 K2 Q7 [, } ) n& K/ \1 y4 O2 e. Z; h" z, U
# 服务端推送客户端dhcp分配dns+ q9 [9 T, Q6 n; y; W) S5 K! g2 a! `
push "dhcp-option DNS 8.8.8.8"  
: C, E& M( j4 L# s  ]- k- C& O 5 Y) X1 B8 T# D  I/ L
# 客户端之间互相通信% ?! `' M7 |% [5 N' f
client-to-client( L6 M( M2 O7 {! z. P

8 M7 M7 j/ r; H$ k! V, P# 存活时间,10秒ping一次,120 如未收到响应则视为断线4 N9 _' o5 g1 C2 u$ i5 ]
keepalive 10 120
! v) q" p) d. h* ~
9 W- s' I2 y: [& t# openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令
. o3 D% i' A: U8 }) }compress lz4-v2
6 A$ k% ?2 {+ n$ J3 U# h' ?  K. H) zpush "compress lz4-v2"; a" o8 T# u1 H+ \  J$ S1 m: J

( |' t+ P' q# ^7 Q7 s  k1 }# 启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置2 E  `8 Y9 a0 ]! Y7 {) A
comp-lzo- a/ w8 Q& |. ]6 R8 ^
: b# P6 v; Y9 v. N% c
# 最多允许 100 客户端连接
. D& S+ T: K5 U, F: jmax-clients 100  
. v0 j# G# R. h' P$ r: K % }8 n7 ]1 H  G2 _2 d, a. n; O% t9 i
# 用户# ?7 a; f0 k$ K, p( }
user openvpn  & \% {/ D2 s# h1 w, x2 Z
9 _5 M0 o7 O7 b
# 用户组  
9 M8 z2 E. d8 j) |" P& R7 ?group openvpn  3 |! h2 O' b) f4 V# m4 U

2 k0 k  n4 p3 U) E4 m) J! x/ g2 M' [# 参数 0 可以省略,如果不省略,那么客户端配置相应的参数该配成 1;如果省略,那么客户端不需要 tls-auth 配置
+ m4 `6 O9 Q5 F7 g5 ~9 X+ H4 Ctls-auth /etc/openvpn/server/ta.key 0  
" x4 ~- X8 s/ [ 7 j- |9 _; E) F2 }. W
# 设置一个证书多人同时登陆,如果不允许则注释掉; l$ `3 I( r# T
duplicate-cn9 f. h- o: g/ z( ^
 楼主| 发表于 2025-5-5 00:34:17 | 显示全部楼层
最好的办法是禁止OpenVPN设置自定义缓冲区大小。在服务器和客户端的配置文件加入:, E- M0 `$ Z6 N# q) G
" E9 r" o6 g1 L
sndbuf 0
4 E" [2 X' H' trcvbuf 05 s; S; ~4 E7 s: f7 I
8 A$ \. n" O1 n5 g; |7 N* ~# b
+ P: {0 b' E3 m3 y
这样缓冲区大小就由操作系统控制了。对于Linux,这个固定值对于TCP是net.ipv4.tcp_rmem 和net.ipv4.tcp_wmem, UDP是net.core.rmem_default 和 net.core.wmem_default 两个值除2.4 W/ y  f  U) N) x
, O2 c# m5 y8 x; M( P- X$ p7 W
如果客户端配置文件不能修改,那么你需要从服务器推送更大的缓存大小:
. c) [9 Q4 E6 q! k6 N2 w1 `9 N* ~: f( G
sndbuf 0: h6 e/ c+ S  z' x: B
rcvbuf 0
7 b* D# s0 b$ ?2 f+ x; t* f; X# d" Spush "sndbuf 393216"
' d- b5 o9 J; S& M( |6 \1 Mpush "rcvbuf 393216”
6 ]4 w6 a0 y4 f6 f5 \! F4 y ( f6 a# V. K! l5 S
# C3 M& Q: V& k% ^# ?, d
UDP和TCP不同,没有窗口大小这一说,虽然不是整个系统都需要。但是缓冲区过小也有可能降低速度。如果你把缓冲区调成0后还是慢,你应该要么在系统层面增加缓冲区大小(net.core.rmem_default 和 net.core.wmem_default),或者在服务器推送更大的缓冲区配置:
; U; U2 w/ \& F+ ]' r8 c: \; X8 `+ i6 A! u7 Q2 n
sndbuf 393216# G0 m8 k9 n1 _$ \1 x! E
rcvbuf 393216# V  p0 b" i1 `) L; \  ^% x; Z
push "sndbuf 393216"
, P6 }9 ]7 ?; x8 i9 @) Fpush "rcvbuf 393216”
! \' G  G8 |- `6 U  v5 M, o! l* ~
 楼主| 发表于 2025-5-5 01:04:47 | 显示全部楼层

" ~/ B3 f7 U- t: g) o! u" }0 t# x6 y这部要做:6 K# E/ P! s+ M
firewall-cmd --permanent --add-service openvpn
9 N" v/ l2 y; o/ x* @5 q$ Afirewall-cmd --permanent --add-masquerade
; q2 r* p. ]* f2 u3 Cfirewall-cmd --reload" \1 @0 p; |; |! @, C
5 Y- [: s4 y. o4 N9 N" C' t) \

8 b6 |* E$ Z6 I" Q) T优化后的配置:1 S/ Y- i, a8 p4 `9 k. H- ?+ J1 S5 l
( k, g: q3 a) V6 q" k4 @  M$ X
. N7 I$ i0 O0 Z7 f% n, Q1 l. @
服务端配置 (server.conf)
: q7 p3 `6 p" Z- j9 C8 t* G0 T# 基本设置
1 \3 l! q, {6 h4 k8 o  p. T# }, ulocal 0.0.0.0! z5 f' K5 I8 w: k
port 2197
4 v3 Q/ ]% ^' [6 o( C& @, I( zproto tcp7 J7 m, H1 G1 @: r7 L
dev tun1 W9 u( a* f0 m* R/ Y
topology subnet- u% o) ~0 k+ k' D- y/ N! g

2 ^4 o/ y' E$ F! D3 U# @3 V

% G7 V1 A" L# ?# ~8 A# MTU/MSSfix 优化,避免 TCP-over-TCP 卡顿和重连2 w2 C& Y! U  d
tun-mtu 1450- X' V9 G) z/ a! o
mssfix 1410/ P3 q' P4 T, C; f6 _* I
push "tun-mtu 1450"6 ]7 r) T6 Q% A% B+ p/ v
push "mssfix 1410"6 Y" L% |  m. {! H* b

) N: k. t4 g9 Y. ]0 w/ Q

$ _8 D- Y' g6 W* S2 E# 证书路径- i) \9 |7 s! c* F. ?& H7 `
ca /etc/openvpn/certificate/ca.crt1 v7 g& z2 ~2 @3 x6 ?/ A
cert /etc/openvpn/certificate/openvpnserver.crt
9 F4 v% D$ [) P3 Y# [key /etc/openvpn/certificate/openvpnserver.key2 p/ V/ \% K) Z4 R6 ]) M
dh /etc/openvpn/certificate/dh.pem% }$ U- G, H% ?8 X
tls-auth /etc/openvpn/certificate/ta.key 06 L/ |1 m  Q/ l# G7 H( x* V+ q$ B4 i
tls-server
; s3 }5 m- z) [0 i# @: u( t
0 Q) |- t8 b8 r% T
% K! g( I9 b: f
# VPN 内网网段1 Q; j; A! P8 d1 ~7 C/ J
server 10.10.10.0 255.255.255.0
+ n( f8 G. ^: Difconfig-pool-persist /var/log/openvpn/ipp.txt; j7 d: O6 {. ^$ e, L4 ?0 e

2 C0 c3 Y' C4 b5 p& T* ]  E. L
* p2 n+ _' K+ r; D6 Y5 O
# 内网路由推送8 j7 d6 M4 V4 O  \" s; u! q
push "route 192.168.16.0 255.255.252.0"& ^% J# C7 S' _! E. a7 }* H9 O5 u
push "route 172.30.1.0 255.255.252.0"
" r4 N5 F( M, P: h) V6 s, X7 h8 {' N* g0 K1 Y) R, {6 j
/ h3 u7 L% O- [
# DNS 推送: |$ {* O6 [7 ]9 x$ E0 U* P
push "dhcp-option DNS 119.6.6.6"0 L. R& v& ?/ I& ~8 ~: E
push "dhcp-option DNS 119.7.7.7"
# x: B8 ?& [( _8 Y: W9 N0 X0 i* t6 x& l$ S/ l/ z

7 Y1 m7 X9 i9 S6 H& `# 客户端互通
6 x# z' @) Y) k: L/ Jclient-to-client
/ ]% p2 G9 Z  i8 k" C3 Y0 B3 V& w8 }* @9 P- T1 {1 g2 t
2 L4 ?% Y2 T6 G5 @4 F& m
# 保持连接,优化 TCP* ^: X" ~! a# J1 f/ K5 r/ e9 ~
keepalive 10 609 p; [4 B$ P" g2 b) C! i; i" x
tcp-nodelay
1 G0 T2 m4 [$ ~8 B' A# B# ]
: N- _2 N6 R2 R( N* c; f! K
. m' X& c# G: j% _4 v: y- [3 l( W3 w- x
# 加密和压缩
. t- N" e# g1 I& e7 G* U: R; rcipher AES-256-GCM
) o8 ?, s! E2 H2 T- }( }! rauth SHA256
: k7 r, d& H2 p" D; E4 ]5 ^+ ucompress lz4-v2
, m% s9 S( }" C, Spush "compress lz4-v2"- r& A9 E, U) ^, T: I, n
2 b7 B6 a1 @+ B' q) p7 C% J0 A
- y" a  z9 |6 a6 a) F+ g2 Y
# 客户端数量
! w  m% z& E# H+ Tmax-clients 250
* H) Y5 H  |4 |, a. X9 N* f1 `. iduplicate-cn   # 如果允许同证书多端连接
+ E% p1 C+ ~6 U* y3 Z! p/ |% r. ], a. ^$ k/ e% a2 o! t) h2 C. |
4 e0 b: K! s, B1 k# \! }  B% x7 Y
# 用户权限
0 X  B4 _5 K) ~. e7 s8 ?user openvpn9 Q3 _$ Q4 X8 m9 F8 p, ?
group openvpn
& Q1 M9 j' E& H8 A' m  Mpersist-key/ x3 ?& R$ F' y' B$ K
persist-tun
% h2 K( x3 V& O  K/ L  `# A( O
; A. ~7 m2 S, m% P$ L: y# }" a, ^2 A

. g+ [# X. {2 ^" o- @: j8 K# 日志
  Q, K8 T2 M8 J; A, {' J; b2 Estatus /var/log/openvpn/openvpn-status.log
. ?. |2 ]2 Y; k( U" Olog-append /var/log/openvpn/openvpn.log
# L% g/ s. J9 H$ Y% }# u# Q7 ]verb 3: `7 [4 |# W/ X' ^6 n

; p/ ?, G) [5 u& J- k8 |

& v; P- _4 z8 q2 t. _' w# y客户端配置 (client.ovpn), {( o2 a& |5 L0 C4 w
client
/ s- o+ l6 K/ s) S4 h  qdev tun1 m' M8 _0 t2 g& E  _- l
proto tcp
9 P* f2 T1 [2 Hremote 119.99.99.9 2197
6 _% n: q. }# f9 q9 dresolv-retry infinite
# F8 c" m- U! h: u- _nobind
$ Q2 T/ V/ ~3 s: c. p% \8 J9 Q9 ]- Y, u4 Kremote-cert-tls server
1 U5 I( s  _. T4 a
4 j$ M8 k" E, y% {3 V* j# R
$ p7 H) u7 {3 L0 l
# 证书8 E5 b2 I) T% L; x$ @0 H/ k1 P
ca ca.crt
8 B5 e) o+ s9 }+ M! l+ Ucert rui.crt. T: Q+ L0 w. g& T& B9 d* h$ |
key rui.key
; B4 n( W8 a# Z  Y# P  I0 _tls-auth ta.key 1% p. h7 p. ]4 g7 \: [
) s* c; _0 |1 P, K3 S- r+ U/ K" L
7 L. k  D. |6 P& \& q6 k6 V, |; R
# MTU/MSSfix 同服务端' H3 O' A/ i0 b' O* d" w6 h
tun-mtu 1450- w5 L, D. c# G7 G
mssfix 14104 U# ~' `( c0 Y

$ `, C4 l2 Y4 J* |( F5 o! a
& l; P( g  Q% V0 J
# 加密/压缩一致0 s* J6 [+ U7 h) z. i
cipher AES-256-GCM, f' X# M! F2 a9 a& d5 k8 x0 D
auth SHA256/ [; W+ v( E3 @( G* ]" z9 N) J/ z
compress lz4-v27 W# h' g* C" }, b, S" _5 F

0 x: w0 c: k9 q+ r; {

$ ]$ z% a8 W. \! i4 o# F% g# DNS
/ V) r8 O. @2 c; E* [2 f4 w7 gdhcp-option DNS 119.6.6.6
7 _" ^3 @$ `6 y5 idhcp-option DNS 119.7.7.7
  Z- R# ^- H7 ^- P4 U* e2 c
) k8 S1 a7 L; m' E6 I3 c9 w
* r/ U# s; n5 }7 }7 e
# 自动重连优化
$ {' d. L! `7 r9 Skeepalive 10 60
2 a/ S6 C: |4 E/ g" Ppersist-key
3 X& F: V; x0 M: Y: Spersist-tun
1 S' O. ^  ?. b1 T6 E5 ?remote-random
1 f/ Q5 }+ I! P5 Otcp-nodelay
3 ?& ]* o$ {/ S( Y: A; Q- b: T! |: H8 I/ hresolv-retry infinite
% @( ]1 K2 g1 {9 q1 Q
1 Z0 o; s4 v- y8 T

9 |0 U% D  j8 w+ R) f+ {+ k6 k# 日志和调试
9 l8 e% L) ^* X7 b/ hverb 3
/ U8 I6 n' K4 t% \) Z9 x$ ?. K% H, W8 r0 B0 F* n1 z* B+ T+ Z  j

+ G6 l0 |$ D7 G
 楼主| 发表于 2025-5-5 01:09:01 | 显示全部楼层
Centos7安装与配置OpenVPN服务器,更新 CentOS 软件包6 P5 a, d  r% |
  E! @* Y$ @* F
代码语言:javascript代码运行次数:0
* N1 N  B6 {2 d! t* H2 u运行* V8 V" Y9 x1 [% g8 g2 C+ \
AI代码解释- j* P# B3 Y* N( s6 ~8 I$ G. T7 {
yum -y update
8 [$ u5 X7 `1 v# Z虽然也是可以不进行更新直接安装。! g+ _- g0 e2 _
4 q# u& v0 I' o, M3 C" h( V
安装 OpenVPN 和 EasyRSA
( d$ i* \  l# d0 G# J. F( l5 I; x" F
安装 OpenVPN、Firewalld 软件包以及用于生成各种证书的 EasyRSA
( h5 L9 E; f( n8 D; i: M0 r7 L- T/ x2 P
代码语言:javascript代码运行次数:0% Y2 E" `' c# T( V0 F+ \7 [
运行
3 V" P6 e3 z% b  l: C% UAI代码解释+ U. ]6 X4 S/ s& q0 S
yum -y install openvpn easy-rsa firewalld
6 n6 Q, P, m2 c" q  M如果未能成功安装 OpenVPN,则可能需要先安装一下 Epel 库。( j! J, ]& X# j0 P

5 y8 |$ Z: F1 s1 f& A2 G代码语言:javascript代码运行次数:0) b9 |, N' H6 K3 D/ G8 _' g; _
运行: Y/ Z" \% P2 A2 a
AI代码解释
9 e' \) C  J0 Z3 ]9 [5 Yyum install epel-release -y
0 `' e6 `: V  b$ o& e7 L7 `生成 CA 证书、服务端密钥与共享密钥
1 f/ a& [! T! `* w9 p( q( A- N  F, l5 z  c! l# ~: Z" @5 n
这里步骤比较多。) T0 ~& B  \0 X4 H" F7 Y
- j* x* {) Z5 z4 ?. Z7 M: Z; [$ F
首先需要初始化 PKI
7 H& ]1 }# a6 C: G3 W1 k8 y' G# O
3 }2 p8 A. r0 @代码语言:javascript代码运行次数:0
' |3 `4 V# b+ m9 {1 o6 D4 ^: z6 y运行  ^/ J/ W8 z" ]1 w( q
AI代码解释5 P5 C) g/ S; e6 _* K
cd ~/ ]8 O) \6 v$ O+ d" H" {- s
/usr/share/easy-rsa/3/easyrsa init-pki. D+ C  h$ Q+ ~$ l) ~1 j! ~# Y
接下来是生成 CA 证书! b# Y% J1 I' s9 |9 t2 b% @( a

; }% v& }4 ]8 p/ a/ C4 P代码语言:javascript代码运行次数:0
4 Q, n0 ]" r4 K% J, _+ T/ b8 N运行: u; E, ]) o7 e0 r7 n
AI代码解释
+ W8 g; ?3 m2 o5 Q, i5 c8 j/usr/share/easy-rsa/3/easyrsa build-ca nopass5 U8 ^  c$ p- o
其中 nopass 表示不加密私钥,主要是方便后面导出公钥与颁发服务器证书。' I8 M8 ^* c: w6 D) @0 T8 L

' y, {8 p( [  C再来是生成交互密钥. R6 x0 j9 X1 u% a: x7 D8 }
+ I/ y( R, Q. T/ \( D5 D" Q  J7 Z! R
代码语言:javascript代码运行次数:0
" J- X+ `3 Q* H5 b5 N& T/ e运行
0 h9 K: n- d8 K2 K$ dAI代码解释3 C# F% S6 m4 _; a3 y  S
/usr/share/easy-rsa/3/easyrsa gen-dh+ \. y4 i' g' g
开始生成服务端密钥. z2 @+ H0 L# y
$ N7 s2 l8 l6 e  l# b3 F* L6 [- }
代码语言:javascript代码运行次数:04 d& K" Q( g, [, l% b
运行& I. Z: d' R9 D8 E
AI代码解释
3 w& S9 p1 k' ]( F4 ]2 o/usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass9 I9 ?) \/ Z7 r6 f
接下来生成客户端密钥,如果未开启同证书允许多人登陆,则需要多次执行生成对应的客户端密钥; a( @1 o- ?; W6 v
3 b1 K# p8 I3 Y  t
代码语言:javascript代码运行次数:0. g8 G9 I) H0 g3 Y: W8 Q2 U
运行
/ L% u  h# y% R% b# v( B" F0 ^AI代码解释
) c/ S1 J. F' g4 d! i/usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-01 nopass3 d- K( S& H6 l. q3 z5 p
最后是生成证书交互列表,如果不需要 crl-verify 则可以跳过. O3 c" a+ _5 R4 J8 g  M+ z5 u

, T; e) A  o) \6 U5 |# Q代码语言:javascript代码运行次数:0
/ G; E9 W& {, L* y$ x+ |5 G: P7 V运行, X" ^# L3 x+ Y" s- Q( _: p, y
AI代码解释
1 g; O. _  N" h8 i5 V" U3 L/usr/share/easy-rsa/3/easyrsa gen-crl
( \! A& d9 |( n' f其实到这一步需要的证书都以及生成好了,如果你开启了 tls-auth 则还需要生成共享密钥
4 n7 j" }7 e$ Z- j8 F& l* F! _7 d2 L. A. _/ c& F) q
代码语言:javascript代码运行次数:0
$ y# o! Q  P9 S# V! ~' W运行
5 e# y1 Y) o- T8 M" k/ d) ?$ k" }AI代码解释
6 j% y. I3 k( R/ g& s! \, @" X; R4 N# mopenvpn --genkey --secret pki/ta.key
# H* e- N' G1 ^9 b! b% Z在上面所有证书都生成完毕之后,我们需要将相关证书拷贝到 OpenVPN 的配置文件夹中(似乎也可以在 conf 文件中使用绝对路径)
9 y3 `8 @5 ?- k& F6 k2 _
' l2 t5 Z: D% l- d代码语言:javascript代码运行次数:05 F9 A! e0 K- t- Y( e2 `8 ]
运行
9 c3 t3 u7 }' m9 NAI代码解释! X9 C% }6 o& j+ @$ q
cp pki/ca.crt /etc/openvpn/ca.crt
# S' D7 a; n, \8 {3 g, {cp pki/dh.pem /etc/openvpn/dh.pem
& J4 x3 A) w  j/ w/ Ocp pki/issued/vpn-server.crt /etc/openvpn/server.crt7 a" T3 O- E6 |( _" x+ }* C, Y
cp pki/private/vpn-server.key /etc/openvpn/server.key5 _) H% d0 }) X  y. Q8 ^5 v0 s
cp pki/ta.key /etc/openvpn/ta.key
: F4 s- L0 J; H: _! c: scp pki/crl.pem /etc/openvpn/crl.pem
7 p. g  h$ K5 o8 @# i8 H配置服务端+ Q+ d- K) s2 s( U0 V

+ M) A7 O7 [- a* R7 MOpenVPN 配置文件有许多可定制化,具体请查阅官方文档。( G4 }  ?) e/ Z# w1 x2 `
4 y  s* b  E& x" w, Z- O
代码语言:javascript代码运行次数:0
, m$ X/ x, R' [5 ~% ]) ^运行' B, H/ m$ m' m/ r9 U5 c9 |
AI代码解释
- E$ _7 v# |1 C1 Tcd /etc/openvpn
% ^* S4 ?) }& U7 P: rvim server.conf
! I% z" \& M9 n6 g; e* J2 K3 X将以下内容粘贴进去
1 Y- l/ h% q4 b, n  g' N; b% S$ X3 X5 L5 o
代码语言:javascript代码运行次数:0
9 X5 q- |% g! h8 D+ ]+ \运行
# O  ]+ B' @9 @% K- IAI代码解释2 j! A/ M$ u- K; |8 u
# Secure OpenVPN Server Config
& Y& y" _" g% M/ _! ]9 y2 T# Basic Connection Config; o% y. A7 o% Y! J# R
dev tun
/ m8 a: M2 w; L& \. cproto udp) x9 Z1 C4 D) k' _0 L. L7 h" s
port 1194& u* @4 N9 C0 n0 ^* I
keepalive 10 1203 h1 p  Q3 N7 J* J7 Z7 w
max-clients 5; c- o$ e/ y2 r( K
# Certs
8 k( P; g0 B$ b* `) Z8 B: Yca ca.crt4 q* N; D& `" L+ {! N1 }5 [( @
cert server.crt
: e, \7 F: ~9 \: S1 Y7 u" Akey server.key& t2 u/ [5 y3 U
dh dh.pem
+ \. M' W! h2 g: {; Jtls-auth ta.key 0
$ `3 {3 I5 I& E  Y# g3 T+ Y# Ciphers and Hardening
/ O2 `" a( m% T# T( {8 @reneg-sec 0
6 R# q/ u$ z# b: a- O) [$ x- Y  Wremote-cert-tls client
1 Z9 y( r' o& R$ {5 j9 h% rcrl-verify crl.pem
7 j+ o, i1 R- W6 Z/ ~9 u1 @2 Ftls-version-min 1.23 r. G2 \2 t/ \. Z1 D7 ]- J
cipher AES-256-CBC9 s1 C4 J/ [3 n. k1 d+ k
auth SHA512
( }3 ?. T# c: C) R3 ]8 D3 q( @5 Vtls-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! ~" Y; B1 }; X0 k( L9 |
# Drop Privs/ I& A& H* q9 q  ^) }# {; J
user nobody: q/ j1 q# n5 d* I
group nobody- r* f8 c5 _1 W; |7 J& H+ B
# IP pool
" I- x: V& g, y# [' D! ]$ n# Aserver 172.31.100.0 255.255.255.0/ o$ l5 o2 Z4 S# A& \' S
topology subnet
0 M0 J$ T4 J. ^ifconfig-pool-persist ipp.txt+ J. h7 S" N& n
client-config-dir client
& s- J% I4 p5 `# Misc
% E- n& N+ N0 B7 wpersist-key- E! f# r0 X8 m( O  L- W
persist-tun. N! T* y# ~: U
comp-lzo
% W9 h/ n  Z& a4 A) N1 H% ?# DHCP Push options force all traffic through VPN and sets DNS servers
, j' N$ o0 C% o( mpush "redirect-gateway def1 bypass-dhcp"
: D  b; Y8 R4 I7 {4 b% Qpush "dhcp-option DNS 8.8.8.8") e3 ?( d# n( t  I& ]/ n
push "dhcp-option DNS 8.8.4.4"
; a# I8 \, L9 W6 O# R# Logging
% e  Q; p* w; m$ L, W9 Jlog-append /var/log/openvpn.log& I7 T  }. k- v- G" D, W
verb 3
8 x  [/ p& E% I- X& q启动服务端并让其开机自动启动
( b9 X$ l' {! y- B" q' \+ q8 g6 |6 ?4 i# y' W
代码语言:javascript代码运行次数:0
( y2 w2 w! m7 W) ^3 b$ S" Q/ v运行
8 p- e5 ]7 {+ j0 w3 k5 `& GAI代码解释
9 ^& m* ?: a. \1 V, q. k9 hsystemctl start openvpn@server4 a: ]; F' ]) B, f+ c$ ?
systemctl enable openvpn@server* ?7 A& h0 a. R7 y3 v4 {' M- l1 R- K4 H
配置防火墙与流量转发
, i' @' c1 e9 {7 r2 d3 e  ~% j' X
; j) `* ^0 A9 y  e) i: k放行 OpenVPN 入网流量与开启 IP 伪装" M- r* t8 X# ]
% a, @) n6 K, |: |/ [1 ]
代码语言:javascript代码运行次数:0
7 j( `0 e5 g9 O' p  B  e# {运行  `' M3 q5 Q  M1 L  ~4 b
AI代码解释' C! B4 N4 h+ H8 p  Y4 ?
firewall-cmd --permanent --add-service openvpn, j  _' V! ^3 D  x/ k! Q/ w2 i
firewall-cmd --permanent --add-masquerade6 [" z, D% l: T( E6 G, u% R# n7 w
firewall-cmd --reload
0 D) L9 V% ?) c& K+ l! v检查是否开启流量转发
( F6 a3 |4 a$ j7 [, B& l* ]0 ]7 [1 y, h4 h4 E
代码语言:javascript代码运行次数:04 S8 y* {( Z. c
运行$ v  ^& V1 K1 C6 Z7 y5 X4 X
AI代码解释
4 r! h- U2 n% isysctl -a | grep net.ipv4.ip_forward
2 n% M# s2 u2 v3 c. C8 _确保net.ipv4.ip_forward 等于 1,如果不是,则需要修改一下5 J/ I. _4 @& X2 _

- ^( M5 c1 ?$ Z# H5 ^/ v5 ?& E- [4 }9 B0 I代码语言:javascript代码运行次数:0
" j1 U  A/ `  U7 M; @$ ?运行, L! N! C7 v: Q* Q- G* G- a& c
AI代码解释+ d9 y; p: R; A
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf5 g6 ?* s( ?6 r
sysctl -p9 j4 d. q) }" Q! m+ q, p0 i. `
配置客户端: T1 q+ H# q1 }; c6 h( S

' N" ~/ e7 D) s  a, s客户端需要拷贝以下文件
; L  q+ [5 D6 ~. X$ N( ?6 x& Q* {! x# u
代码语言:javascript代码运行次数:0  t' a7 S' O2 F, c& l4 O6 z
运行1 v  b% |8 B/ |( u  _/ f
AI代码解释: Q6 r# g4 s! D* g0 G" |0 u7 ^
cd ~7 |! M; t7 z: s) x! T6 F1 l
mkdir vpn-client-01-config. ~% D2 P6 O4 J
cp pki/ca.crt vpn-client-01-config/ca.crt3 z* s- ]7 F; U1 P3 |8 V
cp pki/issued/vpn-client-01.crt vpn-client-01-config/client.crt3 y: u$ U% V  `% C1 N
cp pki/private/vpn-client-01.key vpn-client-01-config/client.key, \6 e7 q3 W% m5 y
cp pki/ta.key vpn-client-01-config/ta.key) G  w( \7 y# Y
最后vim vpn-client-01-config/client.ovpn并粘贴下面内容
/ x8 a3 J# q  l% K% \' v  y* J- r# t
4 w, E1 E) `5 K% F8 ?" Z代码语言:javascript代码运行次数:0
  }  m! y# R8 Q* ~( s& V4 p运行
9 w5 C% u# K- n! X5 ZAI代码解释; |6 P. N# j. S0 f7 k  U5 V! n  G
# Secure OpenVPN Client Config
+ g8 i# R( Y" d# B5 P! q/ v( {# A- v#viscosity dns full- y3 N- _& a1 y1 ?
#viscosity usepeerdns true( v1 K+ M3 P% R
#viscosity dhcp true/ ~9 E- ~5 J$ P7 ^( \) y: z
tls-client  {: e' n9 c1 ?: G
pull# C" R( e2 u& @
client7 M4 h1 G4 D1 o) h) G+ b6 l3 a
dev tun: K4 K  ?' f5 [" j
proto udp
9 k* }' A  F+ s- c+ tremote 123.123.123.123 1194
" m/ o, q" n( s* Eredirect-gateway def1
8 l" q2 e6 e) O1 s/ J- d1 I- `% Ynobind
( |+ Y% }) y( E9 Z4 h5 T/ Gpersist-key& B( w9 L4 G  d' t& M& r/ z% l6 X
persist-tun5 U- e$ A" O0 c
comp-lzo/ J* y8 g" Z( v# I4 }& M( h% g
verb 3
, j' E6 {6 G- `% {5 hca ca.crt
2 y1 r/ j+ ?; Y: l1 F, [cert client.crt/ Q# K) c( t- c; x2 C! D
key client.key' `3 z' k' P# P3 a1 c6 N
tls-auth ta.key 1
9 I! O# P) _* w8 B! e+ l  z! Kremote-cert-tls server! T' b+ n0 M- a
ns-cert-type server9 B/ `9 Q8 [' {* L4 X& u2 s
key-direction 1
  b) ]* f; e: N: u4 N1 Acipher AES-256-CBC
% l* ]% U2 y4 Q; itls-version-min 1.22 E* g* u/ A8 g( p, n
auth SHA512
+ L9 o3 ~' G6 w! @- A: l5 z+ atls-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
' ~( G0 e8 [! K- Y1 T9 j4 A
5 }  ?. I8 l* [8 Gremote后面填写服务端IP地址和使用的端口号,然后将 vpn-client-01-config 的所有文件拷贝到需要链接的电脑上,即可开始使用。- K. q% Q" D' V  ?
 楼主| 发表于 2025-5-6 23:24:01 | 显示全部楼层
调整压缩设置:启用压缩可以减少数据量,但可能会增加 CPU 的使用率。在配置文件中,你可以启用 LZO 压缩:
9 L: t$ t) t0 j( W# D9 [7 f
% l+ j6 c) s5 X6 f& h' J) Ycomp-lzo
 楼主| 发表于 2025-5-16 14:23:56 | 显示全部楼层
Centos7安装与配置OpenVPN服务器,更新 CentOS 软件包
! v" ^  a8 T" H" [1 N/ y7 Q! _
0 e- w. S+ w, u. ]( O代码语言:javascript代码运行次数:0
6 E+ e0 |' O* j3 j/ i$ C. P2 L运行9 s7 J3 @0 m5 ?. O7 x5 T$ B+ R
AI代码解释
9 X" y! s& K2 P% \1 a7 Wyum -y update. i3 C# `: b1 B
虽然也是可以不进行更新直接安装。
3 Q1 l: m7 @& F3 V: o4 M1 w7 ]0 s+ K
安装 OpenVPN 和 EasyRSA* D, E: B5 B/ E
+ w+ o3 H! x# [) I  W2 ?! [0 }3 e
安装 OpenVPN、Firewalld 软件包以及用于生成各种证书的 EasyRSA9 I8 b2 z) n  C3 B
2 _8 o" O' A( Z6 P8 r% l! z
代码语言:javascript代码运行次数:09 |- W1 C1 U' `' `% `
运行! z$ u2 @" r: ]# _
AI代码解释
0 M% C0 _3 @+ D! g* k' M9 oyum -y install openvpn easy-rsa firewalld4 t) T4 J2 _' A
如果未能成功安装 OpenVPN,则可能需要先安装一下 Epel 库。
$ Q9 m0 N5 B3 {+ C6 I' M
5 _0 v4 B' }) W" j) Q4 G代码语言:javascript代码运行次数:08 `" k' W9 M  ?3 ?* G& A
运行
5 v+ ^; u, H  y# e& CAI代码解释8 i& ~' A; ^, ?9 _
yum install epel-release -y
0 O5 H4 u0 a4 `: _; o生成 CA 证书、服务端密钥与共享密钥
* B  r" j; a0 |2 T! w% W; W- _& ?* j  U8 I/ `
这里步骤比较多。9 j1 ~4 H0 _. |, i0 ^

! r9 Z$ |( L' X( a; u6 U首先需要初始化 PKI
  [4 e! a6 I5 m- q! B9 L& Z/ Q, R8 S7 P
代码语言:javascript代码运行次数:0
7 g: P! ~7 X9 l* }# \% j9 h+ _运行/ {# ^; ]( `9 d4 L8 f
AI代码解释
$ k3 M. P3 P" \; W6 D# D1 u+ k* i; Ucd ~
* G) H5 A4 O- k8 X) ~) W/usr/share/easy-rsa/3/easyrsa init-pki$ N: f( |3 V3 ]' V! j2 k
接下来是生成 CA 证书+ _$ E; Y6 m  X

  E; D8 c; F  y" l7 H) p代码语言:javascript代码运行次数:0
  Z# j3 D: X6 p1 @( B运行
/ m; X! g3 T$ D+ x3 H% {AI代码解释
2 ?1 ~$ {6 r7 O; _9 p. ]/usr/share/easy-rsa/3/easyrsa build-ca nopass
5 B3 b' D2 p, R$ ^5 `: m5 O- R其中 nopass 表示不加密私钥,主要是方便后面导出公钥与颁发服务器证书。
( y% m3 c3 X0 o; K$ `
! g# n6 j, f$ g! x6 a1 r' H) s再来是生成交互密钥& ^" C9 W; k* K) o; O5 ?. v2 I

$ p) M. G: [: Z4 n8 [% t2 q. c代码语言:javascript代码运行次数:0
3 G4 ^' y6 @9 \+ ]$ V! p  n运行7 v2 `8 h; p8 N  K
AI代码解释
4 I! @+ X# b# {/usr/share/easy-rsa/3/easyrsa gen-dh+ r+ e% f, n$ g7 O8 B
开始生成服务端密钥) t- i+ h( U! V6 y- f. x$ W4 ]
: L* Z4 Z# B! @$ x- P  H: t
代码语言:javascript代码运行次数:0
+ E8 J5 p* g7 x6 y& @. X, G运行
9 m. ]7 }0 R0 x% p( X8 U# VAI代码解释
2 B* y& u+ I( T$ H/usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass" v1 G$ w7 P+ U4 B! ^& ]
接下来生成客户端密钥,如果未开启同证书允许多人登陆,则需要多次执行生成对应的客户端密钥' b! @. z& V+ f: f# ^2 ~* e; p7 E' D. s

1 m  }2 M( |9 @+ W0 M2 \代码语言:javascript代码运行次数:0
+ A+ X7 A: m4 C: \! T2 x运行0 V  ]0 A( c* @! h) j5 i4 P: z# p
AI代码解释
3 Q5 d: o, J4 v1 Y+ P/usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-01 nopass
* I, M) z. C( i% e$ M+ O最后是生成证书交互列表,如果不需要 crl-verify 则可以跳过
" q9 l' b( u& v/ `* W4 i2 x1 _) C5 k( R0 x% Z; n& r
代码语言:javascript代码运行次数:0
4 r# K6 R$ v1 R- X4 a运行
* M. Y9 u9 `5 R1 S9 P' D* sAI代码解释; V3 @+ k" g& l( Z: ~
/usr/share/easy-rsa/3/easyrsa gen-crl
$ z3 Z! r+ P/ m  C1 U& r! }: j5 h" A其实到这一步需要的证书都以及生成好了,如果你开启了 tls-auth 则还需要生成共享密钥0 t) q9 D5 v) ]

: V/ u- B) v2 Z5 Y! M- h# k代码语言:javascript代码运行次数:0
4 c. p# H7 `+ f5 t% ~运行3 ?' U5 t. }/ P5 M/ G* S4 }' Y, j: R
AI代码解释
: U8 p+ d4 r/ U6 J% F0 ?- ~openvpn --genkey --secret pki/ta.key; ?' W- ?3 E' a- O
在上面所有证书都生成完毕之后,我们需要将相关证书拷贝到 OpenVPN 的配置文件夹中(似乎也可以在 conf 文件中使用绝对路径), L' A1 \9 k! U6 b" o, R/ C
1 a$ A; |* ]2 ]- z- c# o
代码语言:javascript代码运行次数:0
# R4 R1 j5 C9 J$ s; I运行
+ `- I4 G0 k( B- A0 @AI代码解释, ?9 s- U- J) @+ D2 t/ D0 {
cp pki/ca.crt /etc/openvpn/ca.crt; {' x7 f# j8 a$ `: R! E
cp pki/dh.pem /etc/openvpn/dh.pem/ J" N) u3 A3 K3 B
cp pki/issued/vpn-server.crt /etc/openvpn/server.crt8 B4 Y) K1 y) F1 W  N* L5 V/ y
cp pki/private/vpn-server.key /etc/openvpn/server.key
- `+ v6 n* ~7 D, h& ?cp pki/ta.key /etc/openvpn/ta.key: g1 P' B; d' C3 F7 E  t
cp pki/crl.pem /etc/openvpn/crl.pem
5 D0 J( f9 B* N# V' u5 _  y7 W. z配置服务端
! p: o% a! m: ?7 T' L4 P4 C/ c5 B1 w, d* |( d* @9 Q
OpenVPN 配置文件有许多可定制化,具体请查阅官方文档。
2 \/ i9 ^" }; ^) x& w6 f
$ U0 F  B/ \" K2 I) q* h7 x) j代码语言:javascript代码运行次数:0
: r1 i) L+ o5 t运行
: H! j9 l# A+ w4 FAI代码解释
# V: g/ r2 d1 q1 Y8 bcd /etc/openvpn
9 S. B1 \8 S) W* l$ I$ Wvim server.conf# u: e. N) J' w! R
将以下内容粘贴进去9 {1 H  m, M1 o( E2 J% M; p9 ~
' ]$ R' J( G/ l8 @$ j
代码语言:javascript代码运行次数:0% J1 E% h% [0 B9 i, l$ b
运行
  N* O0 ^. F" Q" q6 f0 ?$ o4 t) o8 q. ?AI代码解释; S- i# E; e9 ?( j
# Secure OpenVPN Server Config
- F! o  m6 V& Q$ J8 C# Basic Connection Config$ b( ^9 \/ L. n: d) d. ~
dev tun, Z5 g4 T$ H/ v6 b. R3 D. D+ y  B
proto udp
2 m+ ?) b& U3 B- Q# v( \port 1194
9 i9 t+ S- }7 U2 a. ]6 B0 B2 Hkeepalive 10 120! B9 g3 c0 ^2 b+ ?+ d2 l7 ]
max-clients 5
& ^$ ^1 I7 o, V/ `# Certs! \# h. N1 p2 x3 M/ S1 }
ca ca.crt
% V  q  p& R$ r; A0 i% o" ncert server.crt
% i  A4 H3 |% H1 R0 H  N" @+ x$ Mkey server.key3 g" B& v4 e3 y) G
dh dh.pem' {4 Q6 j2 @( |9 N4 ~
tls-auth ta.key 0
! D; |' k" y- G2 k# Ciphers and Hardening2 b2 W: s' K* a9 b! r9 ^* }
reneg-sec 05 U  G! e" u, v9 p% t4 P8 ^  ]7 J
remote-cert-tls client
5 n/ w' _* V& V, l( L. vcrl-verify crl.pem" K2 x* J: H$ M. I( c# [
tls-version-min 1.2
3 u4 o: i6 }* }& Scipher AES-256-CBC' E: i! u/ [( R$ F
auth SHA5123 _' O% i" }. c0 X, r/ [
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$ \+ u3 Y, g) Y/ _- h. a7 ~
# Drop Privs
0 W0 o; ?# f0 Kuser nobody& I: c& Q/ G4 W- b
group nobody2 l6 C' @- a( X; N! ^) q
# IP pool
/ Q7 V+ q+ Z5 f8 z% x" Qserver 172.31.100.0 255.255.255.0. l. v# I- g; S
topology subnet
& t$ d; J$ T. @# Zifconfig-pool-persist ipp.txt
. p* n7 J0 X. j# v" i& ]client-config-dir client/ [# L2 T# ?# w/ \  `% Q% m' y2 i5 w$ J
# Misc( |& O% B3 m8 p; U- c  q) y
persist-key
7 u0 S; b0 y/ w4 R8 ?8 }- @persist-tun% `* i1 }; h+ \% _5 P; |5 _8 ^" i0 h8 c
comp-lzo# b3 L+ m% C5 Z$ M) M4 x
# DHCP Push options force all traffic through VPN and sets DNS servers
( j+ S% ]  [: hpush "redirect-gateway def1 bypass-dhcp"
, v5 G& \  r( U4 U% v, rpush "dhcp-option DNS 8.8.8.8"
1 H3 `& k9 `( B4 X5 cpush "dhcp-option DNS 8.8.4.4"; I8 @2 b6 q) p" G
# Logging
7 x- Y( B2 y8 |log-append /var/log/openvpn.log. B' ~) u. ?3 e3 H: u
verb 3
3 C% e8 S, d( d! f+ z# b$ Y) Q启动服务端并让其开机自动启动
1 w% q* l% S9 x3 e- U/ f6 m3 W( w6 w
代码语言:javascript代码运行次数:0
( ~- h2 C7 h# b* ?0 g( ^5 K运行) m3 i* D7 y$ ]+ a. C  N# h1 j
AI代码解释
3 a- P7 G& X  X; usystemctl start openvpn@server
4 h! A. G: X# I, }9 Xsystemctl enable openvpn@server
7 @( V( h; T4 c8 c* A0 Z配置防火墙与流量转发
: @, ^0 z# ?7 J" t$ G2 r% V& O: K' n2 Y2 o4 z
放行 OpenVPN 入网流量与开启 IP 伪装
/ ?  \; W- X4 \. C7 k3 g/ U7 \4 M( C5 Z5 ^
代码语言:javascript代码运行次数:0
/ G9 H5 U( L" v* z7 \6 ~& M4 }运行" u! V) v' B5 ]2 }
AI代码解释  x: C7 U1 E6 d; g
firewall-cmd --permanent --add-service openvpn
% E4 D/ v7 p% X" rfirewall-cmd --permanent --add-masquerade3 t2 b' a9 y" U5 D' A; w" x
firewall-cmd --reload
3 H' t& i' p( e! S$ s检查是否开启流量转发
! N  i5 w4 i1 m- S0 o% D8 i# }$ i9 P' B: |  Z. @( X! H
代码语言:javascript代码运行次数:0& b" v) @6 A# d" m
运行, u7 F  {. _  G$ a1 @# p1 f
AI代码解释
( t- L3 X5 [/ \" j+ V& j1 {' dsysctl -a | grep net.ipv4.ip_forward) w  H  q, A' a7 |
确保net.ipv4.ip_forward 等于 1,如果不是,则需要修改一下
! I2 Z; V) \! p" n- j
+ K: Y. e4 I& G1 Y. B' e代码语言:javascript代码运行次数:0! f$ u  o, x$ {% X2 q7 h* c* z
运行
4 v& w" ?* k4 `# C9 M6 }$ DAI代码解释
# {7 [% H3 j1 p" E, Lecho "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf: b8 `" M: X, i- t
sysctl -p, w& P% C* x3 J! A, _# M! d0 ~$ [
配置客户端1 x8 Y# G0 {# V1 Q
' `* I' ~6 [  C8 x4 F% g( h: f- V' {
客户端需要拷贝以下文件
  o& G8 b3 O( q0 B& Z+ C  [9 M) @
8 |0 N' a8 u& G# \3 T" T代码语言:javascript代码运行次数:02 r* b/ ]5 ~7 G# Y" h+ F$ B
运行, L. f* E9 p; u+ i: @4 I+ J1 E) q. n
AI代码解释' V! N2 F& D9 k$ n9 J. D: y
cd ~) C9 k1 E) d  |$ ]3 T6 `
mkdir vpn-client-01-config8 B7 M; ^6 _  n
cp pki/ca.crt vpn-client-01-config/ca.crt3 U  S- b( w9 [4 c8 U! L
cp pki/issued/vpn-client-01.crt vpn-client-01-config/client.crt
! C0 E7 i& T% f" Dcp pki/private/vpn-client-01.key vpn-client-01-config/client.key5 ?# f& j, }- {- }0 R
cp pki/ta.key vpn-client-01-config/ta.key4 P" ~; v; w' q# @" x; h
最后vim vpn-client-01-config/client.ovpn并粘贴下面内容/ ]% h" T' ?0 ~+ [1 Z# T, [9 l. i

/ z. e7 h- `5 F% G3 D# {代码语言:javascript代码运行次数:0
5 i; o& T* K0 c5 y9 }运行% c0 b1 u; J$ {" `& x& f
AI代码解释
4 C/ q. e; l: D6 v, x" o' |/ w8 G# Secure OpenVPN Client Config% a$ b  A- I: i6 R* `
#viscosity dns full+ V! }0 L) l1 R# u- B, b8 i1 h  w
#viscosity usepeerdns true
2 u9 d1 k6 _' ~* ~$ t, v; k! I+ j#viscosity dhcp true
. x7 i' U3 P* R  A+ ?tls-client6 z( v; Q  {; ~4 `% A
pull
; B  e8 K7 M9 q7 s: c1 x9 W( T& _( Aclient4 N( {& l' w- w& ]2 l2 M
dev tun
" d" }6 C' _# n$ c/ c! d: pproto udp
% A9 d( t( ]3 zremote 123.123.123.123 1194
4 R4 M, Y# ]$ ]$ l, ]redirect-gateway def1# z, o8 C) ~- r" q5 X5 {  {
nobind9 O& r% ~- E" j9 M; Y, r2 S
persist-key
+ T8 v1 r+ K7 jpersist-tun: i! z* F; }; A8 p* w
comp-lzo
- t& W/ Z* x! \; q$ L4 ^verb 32 ?+ @0 P. ]! T) }3 i1 i( o
ca ca.crt
1 Z) d; r" _* F3 u0 R) bcert client.crt6 j5 a( L* A% K5 n
key client.key
" M! L. q/ t* ~4 h. H4 Z2 P$ w/ otls-auth ta.key 1
0 L  p8 Y( D' y- J; w. a% J* yremote-cert-tls server
  n; l$ K1 l+ R# @& Q/ K9 a8 p% Z( Ens-cert-type server7 ~# R" V" L4 R
key-direction 1
# P& g( @! A1 H+ V2 C, ~$ rcipher AES-256-CBC' ^, B. y8 X( n% M
tls-version-min 1.23 a/ T# U" F8 j4 P
auth SHA512
6 C) O0 @9 C+ i, \, I, j+ \' D  Stls-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-SHA2561 e1 x1 ]! x! _' m& H* t
remote后面填写服务端IP地址和使用的端口号,然后将 vpn-client-01-config 的所有文件拷贝到需要链接的电脑上,即可开始使用。
 楼主| 发表于 2025-5-16 15:22:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 23:59 , Processed in 0.079424 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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