主要内容:

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 等)在公共网络上建立安全的通信隧道,将数据封装在隧道中传输。

主要类型

  1. 远程访问 VPN:允许远程用户通过互联网安全地连接到企业内部网络,访问内部资源。常见的协议有 PPTP、L2TP/IPSec、SSL/TLS 等。
  2. 站点到站点 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、主要组件

  1. systemd:核心进程,负责系统的初始化和进程管理
  2. systemctl:命令行工具,用于管理系统和服务,如启动、停止、重启服务等
  3. journald:日志管理服务,负责收集、存储和管理系统日志
  4. logind:会话管理服务,负责管理用户登录和会话
  5. networkd:网络管理服务,负责配置和管理网络接口
  6. timedated:时间管理服务,负责管理系统时间和时区
  7. 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:指定服务的启动类型,常见的值包括 simpleforkingoneshotdbus 和 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服务管理。除此之外推荐参考相关学习网址:


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐