主要内容:
RPM打包(生成目录结构、拷贝源码软件包、编写SPEC文件)、VPN服务器(GRE VPN、PPTP VPN、L2TP+IPSec VPN)、Systemd服务管理(命令行工具、编写Unit配置文件)
一、RPM软件打包
RPM(Red Hat Package Manager)是一种用于 Linux 系统的软件包管理系统,主要用于 Red Hat 系列发行版(如 Fedora、CentOS、RHEL 等)。当官方未提供RPM包且无法自定义时,大量的源码包希望能提供统一的软件管理机制;所以可以使用 rpm-build 用于构建 RPM 软件包的工具,提供了一套标准化的流程和工具集,使得软件包的创建和管理变得更加简单和一致。
基本概念
- RPM 软件包:一个 RPM 软件包是一个包含软件及其元数据的文件,通常以
.rpm
为扩展名。RPM 软件包可以包含二进制文件、配置文件、文档等。 - Spec 文件:Spec 文件是用于描述 RPM 软件包的构建过程和元数据的文件,通常以
.spec
为扩展名。Spec 文件定义了软件包的名称、版本、依赖关系、构建步骤等信息。 - Buildroot:构建过程中临时存放源代码和生成文件的目录。
1)软件打包流程
- ① 准备源码软件包
- ② 安装rpm-build工具,使用该工具生成rpmbuild目录
- ③ 编写SPEC编译配置文件;
- ④ 编译RPM包
2)RPM软件工具
软件包:rpm-build //负责将源码包生成RPM包
格式:rpmbuild -ba ~/rpmbuild/SPECS/your-package.spec
-ba
参数:表示同时构建二进制 RPM 包和源 RPM 包。-bb
参数:表示只构建二进制 RPM 包。-bs
参数:表示只构建源 RPM 包。
构建完成后,生成的 RPM 包会存放在 ~/rpmbuild/RPMS
和 ~/rpmbuild/SRPMS
目录中
示例:
① 使用 rpm-build
之前,需确保系统上已安装相关的工具和依赖包。通常可通过以下命令安装:
sudo yum install rpm-build rpmdevtools
② rpmdevtools 提供了一套工具来帮助创建和管理 RPM 构建环境。可使用rpmdev-setuptree命令来创建标准的构建目录结构,该命令会在用户主目录下创建一个 rpmbuild
目录,其结构如下:
~/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
BUILD
:存放构建过程中的临时文件。
BUILDROOT
:存放构建过程中的临时安装目录。
RPMS
:存放生成的二进制 RPM 包。
SOURCES
:存放源代码和补丁文件。
SPECS
:存放 Spec 文件。
SRPMS
:存放生成的源 RPM 包。
将源代码和补丁文件放入 ~/rpmbuild/SOURCES 目录中。源代码通常是一个压缩文件,如 .tar.gz、.tar.bz2 等
Spec 文件是 RPM 软件包的核心,定义了软件包的构建过程和元数据。一个典型的 Spec 文件包含以下几个部分:
- Header:定义软件包的基本信息,如名称、版本、发布号、架构等。
- Source:定义源代码文件的位置。
- BuildRequires:定义构建过程中需要的依赖包。
- Requires:定义安装软件包时需要的依赖包。
- %description:软件包的描述信息。
- %prep:准备阶段,通常用于解压源代码。
- %build:构建阶段,执行编译和构建命令。
- %install:安装阶段,将生成的文件安装到
BUILDROOT
目录中。- %files:定义软件包中包含的文件和目录。
- %changelog:变更日志,记录软件包的变更历史。
③ 使用 rpmbuild 命令来构建 RPM 包。假设 Spec 文件位于 ~/rpmbuild/SPECS 目录中,可使用以下命令,构建完成后生成的 RPM 包会存放在 ~/rpmbuild/RPMS
和 ~/rpmbuild/SRPMS
目录中。
rpmbuild -ba ~/rpmbuild/SPECS/your-package.spec
④ 安装和测试 RPM 包
sudo rpm -ivh ~/rpmbuild/RPMS/your-package-version.rpm
案例:制作nginx的RPM包
案例要求:使用nginx-1.17.6版本的源码软件,生成对应的RPM包软件,具体要求如下:
- 1)准备nginx软件源码包(软件名称为nginx,软件版本为1.17.6)
- 2)RPM软件包可以查询描述信息;
- 3)RPM软件包可以安装及卸载;
准备测试源码软件
[root@proxy ~]# ls lnmp_soft/nginx-1.17.6.tar.gz
lnmp_soft/nginx-1.17.6.tar.gz
步骤1:安装并通过rpm-build软件生成rpmbuild目录
1)安装rpm-build工具
[root@proxy ~]# yum -y install rpm-build rpmdevtools
2)生成rpmbuild目录结构
[root@proxy ~]# rpmbuild -ba nginx.spec //创建RPM包,由于没源码包则导致生成时报错,同时在报错后,自动生成了rpmbuild目录结构
错误:stat /root/nginx.spec 失败:没有那个文件或目录
[root@proxy ~]# ls /root/rpmbuild/ //查看生成的rpmbuild目录结构
3)将源码软件复制到SOURCES源目录
[root@proxy ~]# cp lnmp_soft/nginx-1.17.6.tar.gz rpmbuild/SOURCES/
步骤2:编写SPEC编译配置文件
1)创建并修改SPEC配置文件(当创建以.spec后缀的文件,即有SPEC描述信息)
[root@proxy ~]# vim /root/rpmbuild/SPECS/nginx.spec
Name:nginx //源码包软件名称(严格按照源码包名、版本名登记)
Version:1.17.6 //源码包软件的版本号
Release: 1 //制作的RPM包版本号
Summary: Nginx is a web server software. //RPM软件的简单概述
#Group: //软件组(注释即可)
License:GPL //软件授权的协议
URL: www.test.com //公司网址
Source0:nginx-1.17.6.tar.gz //源码包文件的全称(rpm-build会在SOURCES源目录找到该源码包)
#BuildRequires: //制作RPM时的依赖包(注释即可)
#Requires: //安装RPM时的依赖包(注释即可)
%description //软件的详细描述
nginx is an HTTP and reverse proxy server.
%post
useradd nginx //非必需操作:安装后脚本(创建账户)
%prep //安装前准备,解压
%setup -q //脚本协助自动解压源码包,并cd进入目录
%build //编译需要执行的命令
./configure //脚本协助配置编译源码
make %{?_smp_mflags}
%install //安装时需要执行的命令
make install DESTDIR=%{buildroot} //脚本协助安装源码
%files //定义打包文件列表
%doc
/usr/local/nginx/* //对哪些文件与目录打包
%changelog //软件修改历史
步骤3:使用spec配置文件创建RPM包
1)安装依赖软件包
由于spec配置文件的脚本需自动对源码包进行配置编译安装源码包再打包,所以脚本执行此过程也需要提前安装gcc、make等依赖包;
[root@proxy ~]# yum -y install gcc make pcre-devel openssl-devel
2)rpmbuild创建RPM软件包
[root@proxy ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
[root@proxy ~]# ls /root/rpmbuild/RPMS/x86_64/
nginx-1.17.6-1.x86_64.rpm nginx-debuginfo-1.17.6-1.x86_64.rpm
补充:debuginfo为开发人员排错使用的rpm包
测试:
[root@proxy ~]# yum install /root/rpmbuild/RPMS/x86_64/nginx-1.17.6-1.x86_64.rpm
[root@proxy ~]# rpm -qa | grep nginx
nginx-1.17.6-1.x86_64
[root@proxy ~]# ls /usr/local/nginx/
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
二、VPN概述
VPN(Virtual Private Network,虚拟专用网络)是一种通过公共网络(如互联网)建立安全、加密的连接,从而实现远程访问和数据传输的技术。VPN 可以在不安全的网络环境中保护数据的隐私和完整性,使得用户可以安全地访问内部网络资源,就像直接连接到本地网络一样。在公共网络上建立专用私有网络,进行加密通讯,多用于为集团公司的各地子公司建立连接,连接完成后,各个地区的子公司可以像局域网一样通讯,偶尔可以用于“翻墙”。
- 加密通信:VPN 通过加密技术(如 AES、RSA 等)保护数据在传输过程中的安全,防止数据被窃听或篡改。
- 身份验证:VPN 提供多种身份验证方法(如用户名/密码、证书、令牌等),确保只有授权用户才能访问网络资源。
- 隧道技术:VPN 通过隧道技术(如 IPSec、SSL/TLS 等)在公共网络上建立安全的通信隧道,将数据封装在隧道中传输。
主要类型
- 远程访问 VPN:允许远程用户通过互联网安全地连接到企业内部网络,访问内部资源。常见的协议有 PPTP、L2TP/IPSec、SSL/TLS 等。
- 站点到站点 VPN:连接两个或多个地理位置不同的网络,使得这些网络可以像一个单一的本地网络一样进行通信。常见的协议有 IPSec、GRE 等。
常见协议
- PPTP(Point-to-Point Tunneling Protocol):最早的 VPN 协议之一,使用 MPPE(Microsoft Point-to-Point Encryption)进行加密,安全性较低。
- L2TP/IPSec(Layer 2 Tunneling Protocol / Internet Protocol Security):结合了 L2TP 和 IPSec 两种协议,提供更强的安全性和加密功能。
- SSL/TLS(Secure Sockets Layer / Transport Layer Security):基于 Web 的 VPN 技术,通过浏览器实现安全的远程访问,适用于 Web 应用和资源。
- IPSec(Internet Protocol Security):一种标准的 VPN 协议,提供加密、认证和数据完整性保护,适用于站点到站点和远程访问 VPN。
补充:使用 lsmod 查看当前计算机已经加载的模块,使用 modprobe 加载Linux内核模块,使用modinfo 可以查看内核模块的信息
1、GRE VPN(Generic Routing Encapsulation)
GRE 是一种隧道协议,主要用于在 IP 网络中封装各种网络层协议(如 IP、IPX、AppleTalk 等)。GRE 本身不提供加密功能,因此通常与其他加密协议(如 IPSec)结合使用,以提供安全的隧道传输。
主要特点:
- 封装协议:GRE 可以在 IP 网络中封装多种网络层协议。
- 简单性:GRE 协议相对简单,易于配置和管理。
- 无加密:GRE 本身不提供加密功能,需要与其他加密协议结合使用,缺点即缺少加密机制
应用场景:
- 站点到站点连接:用于连接两个或多个地理位置不同的网络,实现网络层协议的传输。
- IP 多播传输:GRE 支持 IP 多播数据的传输。
2、PPTP VPN(Point-to-Point Tunneling Protocol)
PPTP 是一种较早的 VPN 协议,主要用于远程访问 VPN。PPTP 使用 MPPE(Microsoft Point-to-Point Encryption)进行数据加密,但由于其安全性较低,现在已不太推荐使用。
主要特点:
- 简单易用:PPTP 配置相对简单,易于使用。
- 较低安全性:PPTP 使用较弱的加密算法(如 MPPE),安全性较低。
- 兼容性:PPTP 广泛支持于各种操作系统和设备。
应用场景:
- 远程访问:允许远程用户通过互联网安全地连接到企业内部网络。
- 旧系统兼容:在一些旧系统或设备上,PPTP 可能是唯一支持的 VPN 协议。
3、L2TP/IPSec VPN(Layer 2 Tunneling Protocol / Internet Protocol Security)
L2TP/IPSec 结合了 L2TP 和 IPSec 两种协议,提供更强的安全性和加密功能。L2TP 负责建立隧道,而 IPSec 负责加密和认证数据。
主要特点:
- 强安全性:L2TP/IPSec 使用 IPSec 提供强大的加密和认证功能。
- 标准化:IPSec 是一种标准的安全协议,广泛应用于各种 VPN 解决方案。
- 复杂性:相比 PPTP,L2TP/IPSec 的配置和管理更为复杂。
应用场景:
- 远程访问:提供安全的远程访问,适用于需要较高安全性的企业环境。
- 站点到站点连接:用于连接两个或多个地理位置不同的网络,实现安全的数据传输。
案例1:配置GRE VPN(支持LINUX环境:2台Linux)
案例要求:启用内核模块ip_gre,创建一个虚拟VPN隧道(10.10.10.0/24),实现两台主机点到点的隧道通讯;
步骤1:启用GRE模块(web1和web2都需要操作)
- 命令:lsmod | grep ip_gre //显示模块列表
- 命令:modprode ip_gre //加载内核模板
- 命令:modinfo ip_gre //查看模块信息
1)查看计算机当前加载的模块
[root@web1 ~]# lsmod //显示模块列表
[root@web1 ~]# lsmod | grep ip_gre //确定是否加载了gre模块
2)加载模块ip_gre
[root@web1 ~]# modprobe ip_gre //加载模块ip_gre
[root@web1 ~]# lsmod | grep ip_gre
ip_gre 22707 0
ip_tunnel 25163 1 ip_gre
gre 13144 1 ip_gre
[root@web1 ~]# modinfo ip_gre //查看模块信息
步骤2:web1主机创建VPN隧道
- 格式:ip tunnel add 隧道名称 mode 隧道模式 remote 远程主机公网IP地址 loacl 本地公网IP地址
- 格式:ip address add 设置隧道的本地IP地址 peer 设置隧道的对方主机IP地址 dev 指定隧道名
- 格式:ip link set 隧道名 up //启用隧道up
1)创建VPN隧道,并关联link地址
[root@web1 ~]# ip tunnel add tun0 mode gre remote 192.168.2.200 local 192.168.2.100
解释说明:
# ip tunnel add创建隧道(隧道名称为tun0,可任意),ip tunnel help可以查看帮助
# mode设置隧道使用gre模式
# local后面跟本机的IP地址,remote后面是与其他主机建立隧道的对方IP地址;
- 若要删除隧道配置,使用 ip tunnel del 即可;
2)为VPN隧道配置IP地址
[root@web1 ~]# ip address add 10.10.10.10/8 peer 10.10.10.20/8 dev tun0
[root@web1 ~]# ip address show tun0 //查看隧道IP地址
5: tun0@NONE: <POINTOPOINT,NOARP> mtu 1476 qdisc noop state DOWN group default qlen 1000 //state为DOWN
link/gre 192.168.2.100 peer 192.168.2.200
inet 10.10.10.10 peer 10.10.10.20/8 scope global tun0
解释说明:
# 为隧道tun0设置本地IP地址(10.10.10.10.10/8)
# 为隧道tun0设置对方主机IP地址(10.10.10.20/8)
3)启用该隧道(类似与设置网卡up)
[root@web1 ~]# ip link set tun0 up //启用隧道up
[root@web1 ~]# ip link show
5: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/gre 192.168.2.100 peer 192.168.2.200
[root@web1 ~]# ip address show tun0
5: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 //state为UP
link/gre 192.168.2.100 peer 192.168.2.200
inet 10.10.10.10 peer 10.10.10.20/8 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::5efe:c0a8:264/64 scope link
valid_lft forever preferred_lft forever
步骤3:web2主机创建VPN隧道
[root@web2 ~]# ip tunnel add tun0 mode gre remote 192.168.2.100 local 192.168.2.200
[root@web2 ~]# ip address add 10.10.10.20/8 peer 10.10.10.10/8 dev tun0
[root@web2 ~]# ip link set tun0 up
[root@web2 ~]# ip link show
5: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/gre 192.168.2.200 peer 192.168.2.100
[root@web2 ~]# ip address show
5: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000
link/gre 192.168.2.200 peer 192.168.2.100
inet 10.10.10.20 peer 10.10.10.10/8 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::5efe:c0a8:2c8/64 scope link
valid_lft forever preferred_lft forever
验证:
[root@web1 ~]# systemctl stop firewalld //关闭web1防火墙
[root@web2 ~]# systemctl stop firewalld //关闭web2防火墙
[root@web2 ~]# ping 10.10.10.10 //使用VPN隧道IP地址互访
PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data.
64 bytes from 10.10.10.10: icmp_seq=1 ttl=64 time=0.388 ms
64 bytes from 10.10.10.10: icmp_seq=2 ttl=64 time=0.516 ms
--- 10.10.10.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.388/0.463/0.516/0.057 ms
案例2:配置PPTN VPN(支持Windows环境)
案例要求:使用PPTP协议创建一个支持身份验证的隧道连接,使用MPPE对数据进行加密,为客户端分配10.10.10.0/8的地址池,客户端连接的用户名为tom,密码为123456
注意:需要提前关闭防火墙和SELinux限制
步骤1:部署VPN服务器(服务器端:Linux)
1)安装软件包(软件包参考lnmp_soft/vpn/)
[root@web1 ~]# tar -xf lnmp_soft.tar.gz
[root@web1 ~]# cd lnmp_soft/vpn
[root@web1 vpn]# ls
myipsec.conf pptpd-1.4.0-2.el7.x86_64.rpm xl2tpd-1.3.8-2.el7.x86_64.rpm
[root@web1 vpn]# yum -y install pptpd-1.4.0-2.el7.x86_64.rpm
[root@web1 vpn]# rpm -qc pptpd
/etc/ppp/options.pptpd
/etc/pptpd.conf
/etc/sysconfig/pptpd
2)修改配置文件(修改3个配置文件的内容)
[root@web1 ~]# vim +102 /etc/pptpd.conf //修改配置文件,直接到102行
102 localip 192.168.2.100 //服务器本地IP
103 remoteip 10.10.10.10-18 //分配给客户端的IP池(可自定义)
...
[root@web1 ~]# vim +66 /etc/ppp/options.pptpd //修改认证配置
40 require-mppe-128 //使用MPPE加密数据
66 ms-dns 8.8.8.8 //指定DNS服务器地址
...
[root@web1 ~]# vim /etc/ppp/chap-secrets //修改账户密码配置文件
# Secrets for authentication using CHAP
# client server secret IP addresses
tom * 123456 *
解释:用户名 服务器名称 密码 客户端IP;windows连接Linux-VPN服务器的账户密码
3)重新启动pptpd服务(端口1723)
[root@web1 ~]# systemctl restart pptpd
[root@web1 ~]# systemctl enable pptpd
[root@web1 ~]# netstat -anptul | grep pptpd
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 1778/pptpd
4)通过iptables防火墙进行翻墙设置(非必须操作)
[root@web1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward //开启路由转发
[root@web1 ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 201.1.2.5
步骤2:客户端设置(客户端:Windows)
1)启动一台Windows虚拟机,将该虚拟机网卡桥接到与服务器同一虚拟网络,实现客户端与服务器网络互通,配置IP地址为192.168.2.X网段。
① 设置虚拟网络private
② 设置Windows的IP地址
测试与服务器是否互通
2)添加VPN连接,输入Linux(VPN)服务器分配的账户与密码
① VPN类型:点对点隧道协议(PPTP)
② 建立连接
测试与VPN服务器网络连通性
案例3:配置L2TP+IPSec VPN(支持Windows环境)
案例要求:使用L2TP协议创建一个支持身份验证与加密的隧道连接,使用IPSec对数据进行加密,为客户端分配10.10.10.0/8的地址池,客户端连接的用户名为:tom,密码为:123456
预共享密钥:randpass
步骤1:部署IPSec加密服务
1)安装软件包
[root@web1 ~]# yum -y install libreswan.x86_64 //libreswan加密工具
2)新建IPSec密钥验证配置文件(参考lnmp_soft/vpn/myipsec.conf )
[root@web1 ~]# cd lnmp_soft/vpn/
[root@web1 vpn]# ls
myipsec.conf pptpd-1.4.0-2.el7.x86_64.rpm xl2tpd-1.3.8-2.el7.x86_64.rpm
[root@web1 vpn]# cat /etc/ipsec.conf //仅查看一下该主配置文件
.. ..
include /etc/ipsec.d/*.conf //加载该目录下的所有配置文件
[root@web1 vpn]# cp myipsec.conf /etc/ipsec.d/ //以myipsec.conf做模板修改
[root@web1 vpn]# vim /etc/ipsec.d/myipsec.conf
conn IDC-PSK-NAT
rightsubnet=vhost:%priv //允许的VPN虚拟网络
also=IDC-PSK-noNAT
conn IDC-PSK-noNAT
authby=secret //加密认证
ike=3des-sha1;modp1024 //加密算法
phase2alg=aes256-sha1;modp2048 //加密算法
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=3h
type=transport
left=192.168.2.100 //服务器本机的外网IP
leftprotoport=17/1701
right=%any //允许任何客户端连接
rightprotoport=17/%any
3)创建IPSec预定义共享密钥
[root@web1 ~]# vim /etc/ipsec.secrets
include /etc/ipsec.d/*.secrets
192.168.2.100 %any: PSK "randpass" //randpass为预共享密钥
解释说明:
# 192.168.2.100是VPN服务器的IP
# %any: 任何客户端都可以连接服务器
# PSK(pre share key)中文预共享密钥
步骤2:部署XL2TP服务
1)安装软件包(参考软件包lnmp_soft/vpn/)
[root@web1 vpn]# yum -y install xl2tpd-1.3.8-2.el7.x86_64.rpm
2) 修改配置文件(修改3个配置文件的内容)
[root@web1 ~]# vim +32 /etc/xl2tpd/xl2tpd.conf //修改主配置文件
[global]
...
[lns default]
ip range = 10.10.10.10-10.10.10.18 //分配给客户端的IP池
local ip = 192.168.2.100 //VPN服务器的IP地址
...
[root@web1 ~]# vim /etc/ppp/options.xl2tpd //修改认证配置
10 #crtscts //注释或删除该行
16 #lock //注释或删除该行
21 require-mschap-v2 //添加一行,强制要求认证
...
[root@web1 ~]# vim /etc/ppp/chap-secrets //修改账户密码文件
# Secrets for authentication using CHAP
# client server secret IP addresses
tom * 123456 * //账户名称、服务器名称、密码、客户端IP
3)启动服务(ipsec服务端口500、xl2tpd服务端口1701)
[root@web1 ~]# systemctl restart ipsec.service //加密服务
[root@web1 ~]# netstat -anptul | grep :500
udp 0 0 127.0.0.1:4500 0.0.0.0:* 2603/pluto
udp 0 0 192.168.2.100:4500 0.0.0.0:* 2603/pluto
udp 0 0 10.10.10.10:4500 0.0.0.0:* 2603/pluto
udp 0 0 127.0.0.1:500 0.0.0.0:* 2603/pluto
udp 0 0 192.168.2.100:500 0.0.0.0:* 2603/pluto
udp 0 0 10.10.10.10:500 0.0.0.0:* 2603/pluto
udp6 0 0 ::1:500 :::* 2603/pluto
[root@web1 ~]# systemctl restart xl2tpd.service //VPN服务
[root@web1 ~]# netstat -anptul | grep xl2tpd
udp 0 0 0.0.0.0:1701 0.0.0.0:* 2779/xl2tpd
步骤3:客户端设置(客户端:Windows)
1)启动一台Windows虚拟机,将该虚拟机网卡桥接到与服务器同一虚拟网络,实现客户端与服务器网络互通,配置IP地址为192.168.2.X网段。
① 设置虚拟网络private
② 设置Windows的IP地址
测试与服务器是否互通
2)添加VPN连接,输入Linux(VPN)服务器分配的账户与密码、域共享密码
① VPN类型:使用预共享密钥的L2TP/IPsec
② 建立连接
测试与VPN服务器网络连通性
补充:Windows7有遇到无法连接VPN情况,由注册表导致,需设置Windows注册表(不修改注册表,连接VPN默认会报789错误),具体操作如下:
- 单击"开始",单击"运行",键入"regedit",然后单击"确定"
- 找到下面的注册表子项,然后单击它:
- HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services\Rasman\Parameters
- 在"编辑"菜单上,单击"新建"->"DWORD值"
- 在"名称"框中,键入"ProhibitIpSec"
- 在"数值数据"框中,键入"1",然后单击"确定"
- 退出注册表编辑器,然后重新启动计算机
补充:翻墙设置
[root@client ~]# echo "1" > /proc/sys/net/ipv4/ip_forward //开启路由转发
[root@client ~]# iptables -t nat -A POSTROUTING -s 允许源IP地址网段 -j SNAT --to-source VPN服务器的IP地址
三、Systemd概述
Systemd 是一个系统和服务管理器,最初由 Lennart Poettering 和 Kay Sievers 开发,并于2010年首次发布。它被设计为 Linux 系统的初始化系统(init system),用于启动用户空间和管理系统进程。Systemd 不仅替代了传统的 SysV init 系统,还提供了许多额外的功能和改进。
1、核心功能
- 初始化系统:Systemd 作为系统的第一个进程(PID 1)启动,负责初始化系统并启动必要的系统服务。
- 服务管理:Systemd 可以启动、停止、重启和管理系统服务,支持并行启动,大大加快了系统启动时间。
- 日志管理:Systemd 集成了日志服务(journald),提供了一个统一的日志管理接口,支持结构化日志记录和高效的日志存储。
- 定时任务:Systemd 提供了定时器(timer)功能,可以替代传统的 cron 任务,支持更灵活的时间控制和事件触发。
- 挂载管理:Systemd 可以自动挂载文件系统,支持基于目录的挂载点管理。
- 套接字激活:Systemd 支持套接字激活(socket activation),可以在有连接请求时才启动服务,节省系统资源。
- 依赖管理:Systemd 通过单元文件(unit files)定义服务和依赖关系,自动处理服务之间的依赖和启动顺序。
2、主要组件
- systemd:核心进程,负责系统的初始化和进程管理
- systemctl:命令行工具,用于管理系统和服务,如启动、停止、重启服务等
- journald:日志管理服务,负责收集、存储和管理系统日志
- logind:会话管理服务,负责管理用户登录和会话
- networkd:网络管理服务,负责配置和管理网络接口
- timedated:时间管理服务,负责管理系统时间和时区
- udev:设备管理服务,负责管理硬件设备和设备事件
3、Unit 单元文件
Systemd 使用单元文件(unit files)来定义和管理系统资源,如服务(service)、挂载点(mount)、套接字(socket)、定时器(timer)等。单元文件通常位于/etc/systemd/system/ 或 /usr/lib/systemd/system/ 目录下。
单元文件类型:
Service:定义系统服务,如启动、停止和重启服务
Socket:定义套接字,支持套接字激活
Mount:定义文件系统挂载点
Timer:定义定时任务,替代 cron
Target:定义系统状态或同步点,类似于运行级别
Systemd管理服务时会读取对应的Unit文件,Unit 文件按照 Systemd 约定,应该被放置在指定的3个系统目录之一,而这3个目录是有优先级的,依照下面表格,越靠上的优先级越高,因此在几个目录中有同名文件的时候,只有优先级最高的目录里的那个会被使用;
路径 | 说明 |
/etc/systemd/system | 系统或用户提供的配置文件 |
/run/systemd/system | 软件运行时生成的配置文件 |
/usr/lib/systemd/system | 系统或第三方软件安装时添加的配置文件 |
修改/usr/lib/systemd/system目录下的Unit文件,则需要使用daemon-reload重新加载配置;
4、Systemd 单元文件的语法描述
基本结构
单元文件通常由多个部分组成,每个部分以 [Section] 开头,后跟一系列键值对。常见的部分包括 [Unit]、[Service] 和 [Install]。
[Unit] Description=Example Service After=network.target [Service] ExecStart=/usr/bin/example ExecStop=/usr/bin/example-stop Restart=on-failure [Install] WantedBy=multi-user.target
[Unit] 部分
- Description:服务的简短描述。
- Documentation:服务的文档链接。
- After:指定服务启动的顺序,表示该服务在指定的服务之后启动。
- Before:指定服务启动的顺序,表示该服务在指定的服务之前启动。
- Requires:指定服务依赖的其他服务,如果依赖的服务启动失败,该服务也不会启动。
- Wants:指定服务依赖的其他服务,如果依赖的服务启动失败,该服务仍会启动。
[Service] 部分
- ExecStart:指定服务启动时执行的命令。
- ExecStartPre:指定服务启动前执行的命令。
- ExecStartPost:指定服务启动后执行的命令。
- ExecStop:指定服务停止时执行的命令。
- ExecStopPost:指定服务停止后执行的命令。
- ExecReload:指定服务重新加载配置时执行的命令。
- Restart:指定服务在何种情况下自动重启,常见的值包括 no、on-success、on-failure、on-abnormal、on-abort 和 always。
- RestartSec:指定服务重启前的延迟时间,单位为秒。
- TimeoutStartSec:指定服务启动的超时时间。
- TimeoutStopSec:指定服务停止的超时时间。
- Type:指定服务的启动类型,常见的值包括
simple
、forking
、oneshot
、dbus
和notify
。- User:指定服务运行时使用的用户。
- Group:指定服务运行时使用的用户组。
[Install] 部分
- WantedBy:指定服务在哪个目标(target)下启动,常见的值包括
multi-user.target
和graphical.target
。- RequiredBy:指定服务在哪个目标(target)下启动,如果目标启动失败,该服务也不会启动。
示例:定义名为 example.service
简单的单元文件服务示例:
[Unit]
Description=Example Service
After=network.target
[Service]
ExecStart=/usr/bin/example
ExecStop=/usr/bin/example-stop
Restart=on-failure
User=exampleuser
Group=examplegroup
[Install]
WantedBy=multi-user.target
5、systemctl命令
命令 | 说明 |
systemctl | 列出所有启动的服务 |
systemctl status | 查看服务状态 |
systemctl start | 启动服务状态 |
systemctl stop | 关闭服务状态 |
systemctl restart | 重启服务状态 |
systemctl enable | 设置开机自启 |
systemctl enable --now | 设置开机自启并启动 |
systemctl disable | 禁止开机自启 |
systemctl is-active | 查看是否激活 |
systemctl is-enabled | 查看是否设置开机自启 |
systemctl reboot | 重启计算机 |
systemctl poweroff | 关闭计算机 |
思考:由于Nginx为源码安装,没有相应的.service文件,所以无法使用systemctl命令进行管理,可参考已安装软件的Unit文件进行修改,其中字段含义:
- After,针对开机自动启动顺序,例如network.target 网络相关服务、remote-fs.target网络系统相关服务、nss-lookup.target DNS解析相关服务,在以上网络服务启动后再启动Nginx服务;
- forking,多进程服务,启动一个主进程的服务为simple("notify"与"simple"类似),需要启动若干子进程的服务为forking;
补充:target
对service结尾的特定服务可以执行start、stop、restart等操作;另外还有一类后缀是以target的结尾,这些target 服务可以视作一批服务的集合,里面预定义了哪些服务运行,哪些不运行;
补充:kill
Linux kill 命令用于删除执行中的程序或工作。kill 可将指定的信息送至程序,预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看
案例:创建nginx.service文件,实现systemctl管理
可参考 /usr/lib/systemd/system/httpd.service 作为模板编写
步骤1:创建文件
1)创建名为 nginx.service 的文件。通常放在 /etc/systemd/system/ 目录下。
sudo vim /etc/systemd/system/nginx.service
2)编辑文件,在文件中添加以下内容:
[Unit]
Description=A high performance web server and a reverse proxy server //服务的简短描述
Documentation=https://nginx.org/en/docs/ //服务的文档链接
After=network.target //指定服务在 network.target 之后启动,确保网络服务可用
[Service]
Type=forking //仅启动一个主进程的服务为simple,需要启动若干子进程的服务为forking(默认为simple)
PIDFile=/run/nginx.pid //指定 Nginx 的 PID 文件路径
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' //在启动服务前执行的命令,用于测试 Nginx 配置是否正确
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' //启动 Nginx 服务的命令
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload //重新加载 Nginx 配置的命令
ExecStop=/bin/kill -s QUIT $MAINPID //停止 Nginx 服务的命令,$MAINPID为内置变量,在开启服务后将nginx的进程赋值到该变量,kill传递终止程序方式比nginx 的stop终止更加稳定
PrivateTmp=true //为服务分配一个独立的临时空间
[Install]
WantedBy=multi-user.target //指定服务在 multi-user.target 下启动,这是多用户模式的目标
3)使用systemctl启用和启动nginx.service服务文件
① 重新加载 Systemd 配置:在创建或修改单元文件后,需要重新加载 Systemd 配置。
sudo systemctl daemon-reload
② 启用服务:使 Nginx 服务在系统启动时自动启动。
sudo systemctl enable nginx.service
③ 启动服务:立即启动 Nginx 服务。
sudo systemctl start nginx.service
④ 检查服务状态:验证 Nginx 服务是否正常运行。
sudo systemctl status nginx.service
[root@web1 system]# systemctl daemon-reload //重新加载配置
[root@web1 system]# systemctl stop httpd //端口占用80
[root@web1 system]# systemctl start nginx.service //启动服务
[root@web1 system]# netstat -anptul | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3022/nginx: master
小结:
本篇章节为 的学习【第二阶段】OPERATION-DAY6 笔记,这篇笔记可以初步了解到 RPM打包、VPN(GRE VPN、PPTP VPN、L2TP+IPSec VPN)、Systemd服务管理。除此之外推荐参考相关学习网址:
- Unit文件详解_在unit里面设置environment=-CSDN博客
- CentOS 7之Systemd详解之服务单元设置system.service_permissionsstartonly-CSDN博客
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解