Linux系统安全及应用

账号安全管理

账号安全

禁止程序用户登录            

usermod -s /sbin/nologin 用户名

[root@localhost ~]# useradd tmt
[root@localhost ~]# useradd my
[root@localhost ~]# useradd yf
[root@localhost ~]# 
[root@localhost ~]# usermod -s /sbin/nologin tmt   //设置tmt用户禁止程序用户登录
[root@localhost ~]# 
[root@localhost ~]# grep "/sbin/nologin" /etc/passwd   //查看用户文件下用户状态
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
chrony:x:993:988::/var/lib/chrony:/sbin/nologin
unbound:x:992:987:Unbound DNS resolver:/etc/unbound:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
geoclue:x:991:985:User for geoclue:/var/lib/geoclue:/sbin/nologin
sssd:x:990:984:User for sssd:/:/sbin/nologin
setroubleshoot:x:989:983::/var/lib/setroubleshoot:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
tmt:x:1002:1002::/home/tmt:/sbin/nologin
[root@localhost ~]# 

锁定禁用长期不使用的用户    

passwd -l 用户名       usermod -L 用户名        #查看锁定账号状态  passwd -S 用户名

[root@localhost ~]# passwd -l my   //锁定my用户
锁定用户 my 的密码 。
passwd: 操作成功
[root@localhost ~]# passwd -S my    //查看my用户锁定账户状态
my LK 2024-04-20 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# 
[root@localhost ~]# usermod -L tmt   //锁定tmt用户
[root@localhost ~]# passwd -S tmt    //查看锁定账号状态
tmt LK 2024-04-20 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# 

 删除无效用户                

userdel -r 用户名

[root@localhost ~]# userdel -r my   //删除用户my
[root@localhost ~]# grep "/sbin/" /etc/passwd
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd   //查看用户
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
chrony:x:993:988::/var/lib/chrony:/sbin/nologin
unbound:x:992:987:Unbound DNS resolver:/etc/unbound:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
geoclue:x:991:985:User for geoclue:/var/lib/geoclue:/sbin/nologin
sssd:x:990:984:User for sssd:/:/sbin/nologin
setroubleshoot:x:989:983::/var/lib/setroubleshoot:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
test:x:1000:1000:test:/home/test:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
tmt:x:1002:1002::/home/tmt:/sbin/nologin
yf:x:1004:1004::/home/yf:/bin/bash
[root@localhost ~]# 

 

禁止账号和密码的修改

 chattr +i /etc/passwd /etc/shadow               #查看锁定文件状态  lsattr 文件名

/etc/passwd 存放用户的文件

/etc/shadow 存放用户密码的文件

[root@localhost ~]# chattr +i /etc/passwd /etc/shadow  禁止账号和密码的修改 
[root@localhost ~]# 
[root@localhost ~]# lsattr /etc/passwd   //查看用户锁定状态
----i----------- /etc/passwd
[root@localhost ~]# 
[root@localhost ~]# lsattr /etc/shadow    /查看用户密码锁定状态
----i----------- /etc/shadow
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow   //解锁账号和密码的修改
[root@localhost ~]# 
[root@localhost ~]# lsattr /etc/passwd      //查看账号
---------------- /etc/passwd
[root@localhost ~]# lsattr /etc/shadow      //查看密码
---------------- /etc/shadow
[root@localhost ~]# passwd my   //修改账户my密码
更改用户 my 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 过于简单化/系统化
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# echo abc1234 | passwd --stdin xy101  /输入abc1234为xy101密码
更改用户 xy101 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# 


密码安全管理

设置密码有效期              

          chage -M 天数  用户名                 #针对已存在的用户,天数为 99999 表示为永不过期
           vim /etc/login.defs  -->  PASS_MAX_DAYS 天数     #针对新建的用户



[root@localhost ~]# chage -M 99999 my  //设置my用户密码有效期为99999(永久有效)
[root@localhost ~]# chage -l my   //查看my用户状态
最近一次密码修改时间					:4月 20, 2024
密码过期时间					:从不
密码失效时间					:从不
帐户过期时间						:从不
两次改变密码之间相距的最小天数		:0
两次改变密码之间相距的最大天数		:99999
在密码过期之前警告的天数	:7
[root@localhost ~]# passwd -S my     //查看my用户状态
my LK 2024-04-20 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# 

 针对新建的用户

[root@localhost ~]# 
[root@localhost ~]# vim /etc/login.defs

[root@localhost ~]# 
[root@localhost ~]# useradd xy101
[root@localhost ~]# vim /etc/shadow

强制用户下一次登录修改密码  

chage -d 0 用户名

[root@localhost ~]# chage -d 0 my  //强制my用户下一次登录修改密码 
[root@localhost ~]# 


历史命令安全管理


查看历史命令    

history

[root@localhost ~]# 
[root@localhost ~]# history  //查看历史命令  
    1  setenforce 0
    2  systemctl stop firewalld
    3  ifconfig
    4  vim /etc/sysconfig/network-scripts/ifcfg-ens33
    5  systemctl restart network
    6  ifconfig
    7  fdisk -l
    8  partprobr
    9  partprobe
   10  fdisk -l
   11  echo "- - -" > /sys/class/scsi_host/host0/scan
   12  echo "- - -" > /sy class/scsi_host/host1/scan
   13  echo "- - -" > /sys/class/scsi_host/host2/scan
   14  fdisk -l
   15  fdisk /dev/sdb
   16  fdisk -l /dev/sdb
   17  fdisk /dev/sdb
   18  fdisk -l
   19  fdisk /dev/sdc
   20  fdisk /dev/sdd
   21  fdisk -l
   22  pvscan /dev/sdb1
   23  pvcreat /dev/sdb1 /dev/sdc1
   24  pvcreate /dev/sdb1 /dev/sdc1
   25  pvdisplay /dev/sdb1
   26  pvdisplay /dev/sdc1
   27  ls
   28  df -h
   29  ls
   30  cd /etc/yum.repos.d
   31  ls
   32  cat local.repo
   33  cd /etc/yum.repos.d
   34  ls
   35  mount /dev/vgyz/lvhf /opt/xy101
   36  ls
   37  ls -l -h
   38  cd /etc/yum.repos.d
   39  cat local.repo
   40  cd
   41  mount /dev/sr0/mnt
   42  df
   43  mount /dev/sr0 /mnt
   44  cd /etc/yum.repos.d/
   45  mkdir repo.bak
   46  mv*.repo repo.bak
   47  mv *.repo repo.bak
   48  cd /etc/yum.repos.d/
   49  vim local.repo
   50  yum clean all && yum makecache
   51  cat local.repo
   52  yum install -y xfsprogs quota
   53  cd /opt/xy101
   54  ls
   55  rm -rf*
   56  rm -rf *
   57  ls
   58  cd
   59  umount /opt/xy101
   60  df
   61  mount -o usrquota,grpguota /dev/vgyz/lvhf /opt/xy101/
   62  cd /opt/xy101
   63  cd
   64  df
   65  df -hT
   66  fdisk -l
   67  ll
   68  df
   69  rpm -q xfsprogs xfs_quota 
   70  df -h
   71  fdisk -l
   72  df -hT
   73  mount /dev/sr0 /mnt
   74  cd /etc/yum.repos.d
   75  ls
   76  cat local.repo
   77  ls
   78  mount /dev/sro /mnt
   79  mount /dev/sr0 /mnt
   80  ls
   81  mkdir local.repo
   82  cat local.repo
   83  cd
   84  umount /dev/vgyz/lvhf
   85  umount /dev/vgyz1/lvhf1
   86  rpm -q xfsprogs xfs_quota
   87  df -h
   88  df -hT
   89  fdisk -l
   90  mkdir /opt/xy101
   91  mount /dev/vgyz/lvhf /opt/xy101
   92  df -h
   93  df -hT
   94  rpm -q xfsprogs xfs_quota
   95  df -h
   96  mount /dev/sr0 /mnt
   97  cd /etc/yum.repos.d/
   98  ls
   99  cat local.repo
  100  useradd tmt
  101  useradd my
  102  useradd yf
  103  usermod -s /sbin/nologin
  104  usermod -s /sbin/nologin tmt
  105  grep "/bin/nologin" /stc/passwd
  106  grep "/bin/nologin" /etc/passwd
  107  grep "/sbin/nologin" /etc/passwd
  108  passwd -l my
  109  passwd -S my
  110  usermod -L my
  111  passwd -S my
  112  usermod -L tmt
  113  passwd -S tmt
  114  userdel -r my
  115  grep "/sbin/" /etc/passwd
  116  cat /etc/passwd
  117  chatr +i /etc/passwd /etc/shadow
  118  chattr +i /etc/passwd /etc/shadow
  119  chattr +i tmt /etc/passwd /etc/shadow
  120  chatr +i /etc/passwd /etc/shadow
  121  chattr +i /etc/passwd /etc/shadow
  122  lsattr /etc/passwd
  123  lsattr /etc/shadow
  124  chattr -i /etc/passwd /stc/shadow
  125  chattr -i /etc/passwd /etc/shadow
  126  lsattr /etc/passwd
  127  lsattr /etc/shadow
  128  useradd my
  129  chage -M 99999 my
  130  chage -1 username
  131  chage -M 99999 my
  132  chage -l username
  133  passwd -S username
  134  passwd -S my
  135  chage -l my
  136  chage -M 99999 my
  137  chage -l my
  138  passwd -S my
  139  chage -d 0 my
  140  history
[root@localhost ~]# 

限制历史命令数量    

vim /etc/profile  -->  export HISTSIZE=XX  -->  source /etc/profile

[root@localhost ~]# vim /etc/profile   //修改历史命令文件
[root@localhost ~]# source /etc/profile

[root@localhost ~]# source /etc/profile   //刷新

[root@localhost ~]# history  //查看十条命令
   10  echo abc1234 | passwd --stdin xy101
   11  vim /etc/profile
   12  source /etc/profile
   13  history
   14  vim /etc/profile
   15  source /etc/profile
   16  history
   17  vim /etc/profile
   18  source /etc/profile
   19  history

清空历史命令        

history -c      #临时清空
vim /etc/profile  -->  > ~/.bash_history

[root@localhost ~]# history -c   //临时清空历史命令
[root@localhost ~]# history
    1  history

[root@localhost ~]# vim /etc/profile   //进入
[root@localhost ~]# 

Connection closed.

Disconnected from remote host(CentOS 7 64 位【2】) at 04:09:41.

Type `help' to learn how to use Xshell prompt.
[D:\~]$ 

Connecting to 20.0.0.20:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Sun Apr 21 02:27:32 2024 from 20.0.0.1   //重新链接
[root@localhost ~]# history   //已生效
    1  history
[root@localhost ~]# 

 


限制su切换用户


1)将信任的用户加入到wheel组中     gpasswd wheel -a 用户名
2)修改su的PAM认证配置文件         vim /etc/pam.d/su -> 开启 auth   required   pam_wheel.so use_uid 的配置

[root@localhost ~]# groupadd sb0920  //新建组sb0920
[root@localhost ~]# 
[root@localhost ~]# gpasswd wheel -a tmt   //将用户tmt加入组sb0920
正在将用户“tmt”加入到“wheel”组中
[root@localhost ~]# 

修改su的PAM认证配置文件

[root@localhost ~]# cd /etc/pam.d/
[root@localhost pam.d]# ls
atd                     login              smtp
chfn                    other              smtp.postfix
chsh                    passwd             sshd
config-util             password-auth      sssd-shadowutils
crond                   password-auth-ac   su
cups                    pluto              sudo
fingerprint-auth        polkit-1           sudo-i
fingerprint-auth-ac     postlogin          su-l
gdm-autologin           postlogin-ac       system-auth
gdm-fingerprint         ppp                system-auth-ac
gdm-launch-environment  remote             systemd-user
gdm-password            runuser            vlock
gdm-pin                 runuser-l          vmtoolsd
gdm-smartcard           setup              xserver
ksu                     smartcard-auth
liveinst                smartcard-auth-ac
[root@localhost pam.d]# vim su
[root@localhost pam.d]# 

[root@localhost pam.d]# 
[root@localhost pam.d]# su - xy101
[xy101@localhost ~]$ 
[xy101@localhost ~]$ 
[xy101@localhost ~]$ 

[xy101@localhost ~]$ 
[xy101@localhost ~]$ 
[xy101@localhost ~]$ su - root
密码:
上一次登录:日 4月 21 23:30:07 CST 2024从 20.0.0.1pts/0 上
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# exit    //退出当前用户 
登出
[xy101@localhost ~]$ 

[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# gpasswd wheel -a yf   //yf加入wheel组中
正在将用户“yf”加入到“wheel”组中
[root@localhost ~]# id yf
uid=1004(yf) gid=1004(yf) 组=1004(yf),10(wheel)
[root@localhost ~]# 
[yf@localhost ~]$ exit   //退出
登出
[root@localhost ~]# su - yf
上一次登录:日 4月 21 23:52:31 CST 2024pts/0 上

ssh远程登录输入三次密码错误则锁定用户

vim /etc/pam.d/sshd  
auth       required     pam_tally2.so  deny=3 unlock_time=600 even_deny_root root_unlock_time=600

sudo提权 

visudo     vim /etc/sudoers (要用 wq! 强制保存)
#用户/组授权
用户名  主机名=程序列表                 #命令要用绝对路径表示,支持使用通配符 * 表示所有, ! 表示取反
%组名 主机名=程序列表
用户名  主机名=NOPASSWD: 程序列表       #NOPASSWD: 表示sudo不用密码验证

#别名设置

User_Alias  大写别名=用户1, 用户2, ...
Host_Alias  大写别名=主机名1, 主机名2, ...
Cmnd_Alias  大写别名=命令路径1, 命令路径2, ...
用户别名  主机别名=命令别名

#设置sudo日志路径

Defaults logfile = "/var/log/sudo.log"

sudo -l           #普通用户查看有哪些sudo权限    

[root@localhost log]# sudo -l
匹配 %2$s 上 %1$s 的默认条目:
    !visiblepw, always_set_home, match_group_by_gid,
    always_query_group_plugin, env_reset, env_keep="COLORS
    DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL
    PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC
    LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE
    LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

用户 root 可以在 localhost 上运行以下命令:
    (ALL) ALL
[root@localhost log]# 

终端登录安全控制 

限制root只在安全终端登录

安全终端配置:/etc/securetty

  禁止普通用户登录

建立/etc/nologin文件

删除nologin文件或重启后即恢复正常

[root@localhost ~]# 
[root@localhost ~]# vim /etc/securetty
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# touch /etc/nologin
[root@localhost ~]# ls /etc/nologin
/etc/nologin

[root@localhost ~]# rm -rf /etc/nologin
[root@localhost ~]# 

nmap命令常用的选项和扫描类型

-p:指定扫描的端口。
-n:禁用反向 DNS 解析(以加快扫描速度)。
-sS:TCP的SYN扫描(半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。
-sT:TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。
-sF:TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对SYN数据包进行简单过滤,而忽略了其他形式的 TCP 攻击包。这种类型的扫描可间接检测防火墙的健壮性。
-sU:UDP 扫描,探测目标主机提供哪些 UDP 服务,UDP 扫描的速度会比较慢。
-sP:ICMP 扫描,类似于 ping 检测,快速判断目标主机是否存活,不做其他扫描。
-P0:跳过ping检测,这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法 ping 通而放弃扫描。

 

netstat -natp        查看正在运行的使用TCP协议的网络状态信息
netstat -naup        查看正在运行的使用UDP协议的网络状态信息

示例:
#分别查看本机开放的TCP端口、UDP端口
nmap -sT 127.0.0.1
nmap -sU 127.0.0.1

#检测192.168.80.0/24网段有哪些主机提供HTTP服务
nmap -p 80 192.168.80.0/24

#检测192.168.80.0/24网段有哪些存活主机
nmap -n -sP 192.168.80.0/24
 

 

 

 netstat命令常用选项:
-a:显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口)。
-n:以数字的形式显示相关的主机地址、端口等信息。
-t:查看 TCP相关的信息。
-u:显示 UDP协议相关的信息。
-p:显示与网络连接相关联的进程号、进程名称信息(该选项需要 root 权限)。
-r:显示路由表信息。
-l:显示处于监听状态的网络连接及端口信息。

 

限制更改 GRUB 引导参数


通常情况下在系统开机进入GRUB 菜单时,按 e 键可以查看并修改GRUB 引导参数,这对服务器是一个极大的威胁。
可以为 GRUB 菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。

grub2-mkpasswd-pbkdf2             #根据提示设置GRUB 菜单的密码
PBKDF2 hash of your password is grub.pbkdf2……         #省略部分内容为经过加密生成的密码字符串

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
cp /etc/grub.d/00_header /etc/grub.d/00_header.bak

vim /etc/grub.d/00_header
cat << EOF
set superusers="root"                    #设置用户名为root
password_pbkdf2 root grub.pbkdf2……        #设置密码,省略部分内容为经过加密生成的密码字符串
EOF

grub2-mkconfig -o /boot/grub2/grub.cfg    #生成新的 grub.cfg 文件

重启系统进入 GRUB 菜单时,按 e 键将需要输入账号密码才能修改引导参数。

[root@localhost ~]# 
[root@localhost ~]# vim /etc/securetty

 

如何查看进程是否已经开启?

systemctl status 进程名
ps aux/-elf | grep 进程名 
netstat/ss -lntup | grep 进程名/:端口
lsof -i :端口  

[root@localhost ~]# 
[root@localhost ~]# ps aux |grep sshd
root       1298  0.0  0.1 112984  4308 ?        Ss   20:32   0:00 /usr/sbin/sshd -D
root       2357  0.0  0.1 161072  5644 ?        Ss   20:45   0:00 sshd: root@pts/0
root       3040  0.0  0.0 112828   980 pts/0    S+   21:43   0:00 grep --color=auto sshd
[root@localhost ~]# 


[root@localhost ~]# ps -elf |grep sshd
4 S root       1298      1  0  80   0 - 28246 poll_s 20:32 ?        00:00:00 /usr/sbin/sshd -D
4 S root       2357   1298  0  80   0 - 40268 poll_s 20:45 ?        00:00:00 sshd: root@pts/0
0 S root       3088   2366  0  80   0 - 28207 pipe_w 21:48 pts/0    00:00:00 grep --color=auto sshd
[root@localhost ~]# 

[root@localhost ~]# netstat -lntup | grep sshd  //根据进程名查看
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1298/sshd           
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      2357/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      1298/sshd           
tcp6       0      0 ::1:6010                :::*                    LISTEN      2357/sshd: root@pts 


[root@localhost ~]# ss -lntup | grep sshd
tcp    LISTEN     0      128       *:22                    *:*                   users:(("sshd",pid=1298,fd=3))
tcp    LISTEN     0      128    127.0.0.1:6010                  *:*                   users:(("sshd",pid=2357,fd=9))
tcp    LISTEN     0      128    [::]:22                 [::]:*                   users:(("sshd",pid=1298,fd=4))
tcp    LISTEN     0      128       [::1]:6010               [::]:*                   users:(("sshd",pid=2357,fd=8))
[root@localhost ~]# 
[root@localhost ~]# netstat -lntup | grep :22  //根据端口查看
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1298/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1298/sshd           
[root@localhost ~]# 

[root@localhost ~]# lsof -i :22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1298 root    3u  IPv4  27344      0t0  TCP *:ssh (LISTEN)
sshd    1298 root    4u  IPv6  27346      0t0  TCP *:ssh (LISTEN)
sshd    2357 root    3u  IPv4  36892      0t0  TCP localhost.localdomain:ssh->20.0.0.1:chromagrafx (ESTABLISHED)
[root@localhost ~]# 


如何通过端口查看进程号?

netstat -lntup | grep :端口
ss -lntup | grep :端口
lsof -i :端口  

[root@localhost ~]# netstat -lntup | grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1298/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1298/sshd   
[root@localhost ~]# ss -lntup | grep :22
tcp    LISTEN     0      128       *:22                    *:*                   users:(("sshd",pid=1298,fd=3))
tcp    LISTEN     0      128    [::]:22                 [::]:*                   users:(("sshd",pid=1298,fd=4))
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# lsof -i :22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1298 root    3u  IPv4  27344      0t0  TCP *:ssh (LISTEN)
sshd    1298 root    4u  IPv6  27346      0t0  TCP *:ssh (LISTEN)
sshd    2357 root    3u  IPv4  36892      0t0  TCP localhost.localdomain:ssh->20.0.0.1:chromagrafx (ESTABLISHED)
[root@localhost ~]# 


对新服务器做过哪些初始化操作?

安装操作系统
设置网络,比如 网卡IP、网关、路由、DNS服务器地址、双网卡绑定bond(在物理机环境中使用)
设置主机名         hostnamectl    set-hostname
设置ntp时间同步    ntpd    chronyd    ntpdate
设置防火墙规则     iptables  firewalld
关闭selinux        setenforce 0      /etc/selinux/config
精简开机启动服务   systemctl enable crond rsyslog network sshd
设置yum仓库镜像源  /etc/yum.repos.d/
磁盘使用lvm或raid   
升级linux内核

关闭selinux 

[root@localhost ~]# setenforce 0  //临时关闭

[root@localhost ~]# ll /etc/sysconfig/selinux
lrwxrwxrwx. 1 root root 17 4月  12 01:40 /etc/sysconfig/selinux -> ../selinux/config
[root@localhost ~]# 

[root@localhost ~]# vim /etc//selinux/config

 

[root@localhost ~]# ulimit -a  //显示所有资源限制
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14949
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14949
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost ~]# 
[root@localhost ~]# ulimit -n 65536   //设置同时打开文件数量65536 (通常设置2的n次方)
[root@localhost ~]# ulimit -a         //显示所有资源限制
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14949
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14949
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost ~]# 

 

对服务器初始化后做过哪些安全加固?

禁止 root 用户远程登陆        /etc/ssh/sshd_config   --> PermitRootLogin no
修改 ssh 端口号               /etc/ssh/sshd_config   --> Port
普通用户限制 su 切换用户      /etc/pam.d/su
普通用户通过 sudo 授权管理    visudo   /etc/sudoers
锁定关键系统文件              chattr +i
设置历史命令保存条数          /etc/profile   HISTSIZE
设置账户超时时间              /etc/profile   TMOUT
限制用户的登录次数            /etc/pam.d/sshd
设置用户密码强度              /etc/pam.d/system-auth
接入堡垒机或跳板机

 

 

[root@localhost ~]# ntsysv  //图形化设置

 

双网卡绑定的7种模式

一般mode=0与mode=1比较常用,mode=6负载均衡方式两块网卡都工作,不需要交换机支持,常用。

1.1 网卡负载均衡模式

网卡负载均衡模式mode=0

该模式的特点是增加了带宽,同时支持容错能力,当有某一链路出现问题时,会把所有流量切换到正常的链路上。

特点:

1.所有链路处于负载均衡状态,以轮询方式向每条链路发送报文,基于per packet方式(按数据分流)发送。

2.如在配置bond0的服务器ping baidu.com 两个网卡均会有流量发出,流量会负载到两条链路上,说明是基于per packet方式进行的轮训发送。

3.该模式的特点是增加了带宽,同时支持容错能力,当有某一链路出现问题时,会把所有流量切换到正常的链路上。

1.2 网卡容错模式

网卡容错模式mode=1

当主端口down掉时,从端口会接手主端口的状态

特点:

一个端口处于主状态,一个端口处于从状态,所有的流量都会在主链路上处理,从端口不会有任何流量。当主端口down掉时,从端口接手主状态

1.3 balance-xor需要交换机支持

需要交换机支持mode=2

通过源和目标mac做hash因子来做xor算法来选择链路

特点:

1.该模式将限定流量,以保证到达特定对端的流量总是从同一个接口是上发出。既然目的地是通过MAC地址来决定的,因此该模式在“本地”网络配置下可以工作得很好。如果所有 流量是通过单个路由器(比如 “网关”型网络配置,只有一个网关时,源和目标mac都固定了,那么这个算法算出的线路就一直是同一条,那么这种模式就没有多少意义了。),那该模式就不 是最好的选择。和网卡的负载均衡模式一样,交换机端口需要能配置为“port channel”。

2.这模式是通过源和目标mac做hash因子来做xor算法来选路的。

1.4 broadcast广播策略

广播策略mode=3

此模式需要高可靠性的网络,不允许出现任何问题。本模式提供负载均衡和容错的能力

特点:

此模式的特点是一个报文会负载两份王bond下的两个接口分别发送出去,当有对端交换机失效,我们感觉不到任何downtime,但此法过于浪费资源,在所有的slave接口上传送所有的报文。本模式提供容错能力。

1.5 IEEE 802.3ad 动态链路聚合

动态链路聚合mode=4

802.3ad模式是IEEE标准,因此所有实现了802.3ad的对端都可以很好的互操作。

802.3ad 协议包括聚合的自动配置,因此只需要很少的对交换机的手动配置(要指出的是,只有某些设备才能使用802.3ad)。

802.3ad标准也要求帧按顺序 (一定程度上)传递,因此通常单个连接不会看到包的乱序。

802.3ad也有些缺点:标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和 除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。

此外,linux bonding的802.3ad实现通过对端来分发流量(通过MAC地址的XOR值),因此在“网关”型配置下,所有外出(Outgoing)流量将使用 同一个设备。

进入(Incoming)的流量也可能在同一个设备上终止,这依赖于对端802.3ad实现里的均衡策略。在“本地”型配置下,路两将通过 bond里的设备进行分发。

BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer2" 2层模式=IP

BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer2+3" 2+3层模式 =MAC+IP

BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer3+4" 3+4层模式=IP+端口

1.6 自适应传输负载均衡模式

balance-tlb自适应传输负载均衡模式mode=5

自适应传输负载均衡:信道绑定不需要特殊的交换机支持。出口流量的分布取决于当前每个slave的负载(计算相对速度)。进口流量从当前的slave的接收。如果接收salve出错,其他的slave接管失败的slave的MAC地址继续接收。

先决条件:

每个slave的基本驱动支持Ehtool获取速率状态。

1.7 网卡虚拟化模式

网卡虚拟化mode=6

回复报文数第一个从端口1发第二个从端口2发,以此类推

特点:

此模式包含了自适应传输负载均衡模式,同时加上针对IPV4流量的接收负载均衡,而且不需要任何switch(交换机)的支持。

接收负载均衡是通过ARP协商(地址解析协议)实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。

所有端口都会收到对端的ARP请求报文,回复ARP回时,bond驱动模块会截获所发的ARP回复报文,跟进算法算到相应端口,这时会把ARP回复报文的源Mac,send源Mac都改成相应端口Mac。从抓包情况分析回复报文是第一个从端口1,第二个端口2发,以此类推。


2. bond0配置

mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。

2.1 修改两块网卡配置


# 加载bonding模块,并确认已经加载
$ modprobe --first-time bonding
$ lsmod | grep bonding
bonding               152656  0

# 进入网卡配置目录
$ cd /etc/sysconfig/network-scripts/

# 将网卡配置文件备份并删除
$ mv -f ifcfg-ens34 ifcfg-ens34.bak
$ mv -f ifcfg-ens38 ifcfg-ens38.bak

# 重新配置ens34与ens38网卡
$ vim ifcfg-ens34
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens34
MASTER=bond0
SLAVE=yes

$ vim ifcfg-ens38
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens38
MASTER=bond0
SLAVE=yes
 

2.2 配置bond0网卡

$ vim ifcfg-bond0
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond0
IPADDR=192.168.50.100
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=0"
 

2.3 bond配置文件

$ vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=0

2.4 开机自动加载bond​​​​​​

$ vim /etc/rc.local
modprobe bonding miimon=100 mode=0

2.5 验证
 

$ systemctl restart network
# 查看是否配置成功
$ ip a
3: ens34: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever


# 模拟某块网卡down
# 通过抓包来获取ping包来观察经过网卡的流量
# 一个窗口ping网关地址
$ ping 192.168.50.2

# 一个终端窗口抓取ens38去往网关的包
# 注意观察mac地址
$ tcpdump -i ens38 host 192.168.50.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens38, link-type EN10MB (Ethernet), capture size 262144 bytes
15:44:55.723646 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 1, length 64
15:44:55.723674 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 1, length 64
15:44:56.726182 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 2, length 64
15:44:56.726199 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 2, length 64
15:44:57.727318 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 3, length 64
15:44:57.727337 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 3, length 64
15:44:58.728931 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 4, length 64
15:44:58.728945 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 4, length 64
# 另一块网卡同样可以抓到

# 在虚拟机中断开ens34网卡的连接
# ping 稍断即回复通信
# 注意观察mac地址
3: ens34: <NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 qdisc pfifo_fast master bond0 state DOWN group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever

​​​​​​​


3 . bond1配置

mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。

3.1 修改两块网卡配置​​​​​​​


# 进入网卡配置目录
$ cd /etc/sysconfig/network-scripts/

# 将网卡配置文件备份并删除
$ mv -f ifcfg-ens34 ifcfg-ens34.bak
$ mv -f ifcfg-ens38 ifcfg-ens38.bak

# 重新配置ens34与ens38网卡
$ vim ifcfg-ens34
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens34
MASTER=bond1
SLAVE=yes

$ vim ifcfg-ens38
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens38
MASTER=bond1
SLAVE=yes

3.2 配置bond0网卡​​​​​​​


$ vim ifcfg-bond1
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond1
IPADDR=192.168.50.101
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=1"

3.3 bond配置文件​​​​​​​


$ vim /etc/modprobe.d/bond1.conf
alias bond1 bonding
options bond1 miimon=100 mode=1

3.4 开机自动加载bond​​​​​​​

$ vim /etc/rc.local
modprobe bonding miimon=100 mode=1

3.5 验证​​​​​​​


# 重启网卡
$ systemctl restart network
# 注意观察mac地址
$ ip a
3: ens34: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever

# 查查看bond1状态
cat /proc/net/bonding/bond1
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:20
Slave queue ID: 0

Slave Interface: ens38
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:2a
Slave queue ID: 0

4. bond6配置

4.1 修改两块网卡配置


# 进入网卡配置目录
$ cd /etc/sysconfig/network-scripts/

# 将网卡配置文件备份并删除
$ mv -f ifcfg-ens34 ifcfg-ens34.bak
$ mv -f ifcfg-ens38 ifcfg-ens38.bak

# 重新配置ens34与ens38网卡
$ vim ifcfg-ens34
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens34
MASTER=bond6
SLAVE=yes

$ vim ifcfg-ens38
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens38
MASTER=bond6
SLAVE=yes

​​​​​​​

4.2 配置bond6网卡

$ vim ifcfg-bond6
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond6
IPADDR=192.168.50.101
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=6"

4.3 bond配置文件

$ vim ifcfg-bond6
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond6
IPADDR=192.168.50.101
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=6"

4.4 开机自动加载bond

$ vim /etc/rc.local
modprobe bonding miimon=100 mode=6

4.5 验证​​​​​​​


# 重启网卡
$ systemctl restart network
# 注意观察mac地址
$ ip a
3: ens34: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond6 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond6 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
6: bond6: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond6
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever

# 查查看bond6状态
cat /proc/net/bonding/bond6
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: ens34
MII Status: up
MII Polling Interval (ms): 80
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:20
Slave queue ID: 0

Slave Interface: ens38
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:2a
Slave queue ID: 0

  • 34
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值