第05周作业

  1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。

    1、禁用不安全的加密算法:在sshd_config文件中禁用不安全的加密算法,如DES和RC4等,建议只使用AES和ChaCha20等安全加密算法。
    2、限制用户登录:可以通过修改sshd_config文件中的AllowUsers或DenyUsers选项来限制哪些用户可以登录,也可以使用PAM模块限制用户登录。
    3、使用强密码策略:可以通过修改sshd_config文件中的PasswordAuthentication选项来启用强密码策略,建议设置密码最小长度、密码复杂度等。
    4、防止暴力破解:可以通过修改sshd_config文件中的MaxAuthTries选项来限制用户登录失败的次数,也可以使用Fail2ban等软件来防止暴力破解。
    5、使用公钥认证:使用公钥认证可以减少密码泄露的风险,建议禁用密码认证并启用公钥认证。
    6、修改SSH默认端口:将SSH默认端口修改为非常用端口,可以减少暴力破解的风险。
    7、定期更新OpenSSH版本:及时更新OpenSSH版本可以修复安全漏洞和提升安全性能。
    8、配置防火墙:使用防火墙可以限制SSH服务的访问范围,只允许必要的IP地址访问SSH服务端口。

    openssh免密登录:
    1. 首先在客户端生成一对密钥(ssh-keygen)

    2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

    3. 当客户端再次发送一个连接请求,包括ip、用户名

    4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:magedu

    5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

    6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

    7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

  2. 总结sudo配置文件格式,总结相关示例。

    配置文件:/etc/sudo.conf

    授权规则配置文件:

    安全编辑授权规则文件和语法检查工具

    范例:

    授权编辑规则文件的工具:/usr/bin/sudoedit

    执行授权命令:/usr/bin/sudo

    时间戳文件:/var/db/sudo

    日志文件:/var/log/secure

    4.3 sudo 命令

    4.4 sudo 授权规则配置

    配置文件:/etc/sudo.conf

    授权规则配置文件:/etc/sudoers, /etc/sudoers.d/

    sudoers 授权规则格式:

    用户 登入主机=(代表用户) 命令

    user host=(runas) command

    格式说明:

    user: 运行命令者的身份

    host: 通过哪些主机

    (runas):以哪个用户的身份

    command: 运行哪些命令

  3. 总结PAM架构及工作原理

    PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证
    PAM 架构:PAM 架构由应用程序、PAM 库、PAM 配置文件和认证模块组成。

    PAM 工作原理:

    应用程序调用 PAM 库来进行用户认证,传递用户名和密码等认证信息。
    PAM 库根据 PAM 配置文件中指定的顺序加载相应的认证模块。
    加载的认证模块按照指定的顺序依次执行。
    每个认证模块执行相应的认证操作,例如验证密码、检查双因素身份验证等。
    认证模块根据认证结果返回成功或失败状态给 PAM 库。
    PAM 库将最终的认证结果返回给应用程序,应用程序根据结果决定是否允许用户访问。

  4. 实现私有时间服务器
    //安装chrony
    root@hb-cj-rocky:~# yum -y install chrony 
    root@hb-cj-rocky:~# systemctl restart chronyd.service
    root@hb-cj-rocky:~# ps
        PID TTY          TIME CMD
       1647 pts/0    00:00:00 bash
       1687 pts/0    00:00:00 ps
    root@hb-cj-rocky:~# ps aux | grep chronyd
    chrony      1685  0.0  0.4  84168  3020 ?        S    10:33   0:00 /usr/sbin/chronyd -F 2
    root        1699  0.0  0.2   6408  2184 pts/0    S+   10:34   0:00 grep --color=auto chronyd
    root@hb-cj-rocky:~# vim /etc/chrony.conf //服务器端配置
    # Please consider joining the pool (https://www.pool.ntp.org/join.html).
    pool 2.rocky.pool.ntp.org iburst
    server cn.ntp.org.cn iburst
    server ntp.aliyun.com iburst
    server ntp.tencent.com iburst
    server time.windows.com iburst
    # Allow NTP client access from local network.
    #allow 192.168.0.0/16
    allow 0.0.0.0/0
    # Serve time even if not synchronized to a time source.
    local stratum 10
    
    root@hb-cj-rocky:~# systemctl restart chronyd //重启服务
    //客户端
    [root@rocky8 ~]# vim /etc/chrony.conf
    #pool 2.rocky.pool.ntp.org iburst
    server ntp.aliyun.com iburst
    [root@rocky8 ~]# systemctl restart chronyd
    [root@rocky8 ~]# date
    Fri Nov 10 22:26:04 CST 2023
    
  5. 总结DNS域名三级结构

    1、顶级域名(Top-Level Domain,TLD):顶级域名是一个域名的最高层次,通常表示一个国家、地区或组织类型。例如,.com表示商业组织,.org表示非赢利组织,.edu表示教育机构,.cn表示中国等。顶级域名还可以分为两种类型:国家顶级域名(Country-Code Top-Level Domain,ccTLD)和通用顶级域名(Generic Top-Level Domain,gTLD)。
    2、二级域名(Second-Level Domain,SLD):二级域名是紧接在顶级域名后面的域名部分,用于区分不同的组织或实体。例如,在“.com”顶级域名下,“baidu”就是一个二级域名,“baidu.com”就是一个完整的域名。
    3、三级域名(Third-Level Domain):三级域名是紧接在二级域名后面的域名部分,通常用于进一步区分不同的部门、区域或主机名。例如,在“baidu.com”二级域名下,“www”可以是一个三级域名,“www.baidu.com”就是一个完整的域名。
    DNS域名的三级结构可以提供更加灵活和可扩展的命名系统,使得不同的组织和实体可以通过自定义域名来展示自己的品牌和身份。同时,DNS域名的三级结构也提高了命名系统的可读性和易用性,使得用户可以更加方便地记忆和使用域名。

  6. 总结DNS服务工作原理,涉及递归和迭代查询原理

    1、用户在浏览器中输入域名,如www.baidu.com。
    2、浏览器向本地DNS服务器发送DNS查询请求。
    3、如果本地DNS服务器已经缓存了该域名对应的IP地址,则直接返回给浏览器。
    4、如果本地DNS服务器没有缓存该域名对应的IP地址,则向根域名服务器发送递归查询请求。
    5、根域名服务器返回给本地DNS服务器该域名对应的顶级域名服务器的IP地址。
    6、本地DNS服务器向顶级域名服务器发送迭代查询请求。
    7、顶级域名服务器返回给本地DNS服务器该域名对应的二级域名服务器的IP地址。
    8、本地DNS服务器向二级域名服务器发送迭代查询请求。
    9、二级域名服务器返回给本地DNS服务器该域名对应的主机名的IP地址。
    10、本地DNS服务器将IP地址返回给浏览器,并将该域名和IP地址缓存起来。

    递归查询和迭代查询是DNS服务中的两种查询方式。递归查询是指DNS服务器向其他DNS服务器发出查询请求,并要求对方返回查询结果,如果对方不能返回结果,则向更高级别的DNS服务器发出查询请求,直到获取到查询结果为止。在上述工作原理中,本地DNS服务器向根域名服务器发出的查询请求就是一种递归查询。

    迭代查询是指DNS服务器向其他DNS服务器发出查询请求,对方返回自己所知道的信息,如果对方不能返回查询结果,则DNS服务器需要向其他DNS服务器继续发出查询请求,直到获取到查询结果为止。在上述工作原理中,本地DNS服务器向顶级域名服务器和二级域名服务器发出的查询请求就是一种迭代查询。

  7. 实现私有DNS, 供本地网络主机作DNS递归查询。
    image-20240512201904294

    配置自定义域
    vim /etc/named.rfc1912.zones

    文件最后增加

    zone “yu.org” IN {
    type master;
    file “yu.org.zone”;
    };

    root@hb-cj-rocky:~# dig yu.org
    
    ; <<>> DiG 9.16.23-RH <<>> yu.org
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18341
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;yu.org.				IN	A
    
    ;; ANSWER SECTION:
    yu.org.			5	IN	A	208.91.197.128
    
    ;; Query time: 2521 msec
    ;; SERVER: 10.0.0.2#53(10.0.0.2)
    ;; WHEN: Sun May 12 12:27:40 UTC 2024
    ;; MSG SIZE  rcvd: 40
    
  8. 总结DNS服务器类型,解析答案,正反解析域,资源记录定义。

    DNS服务器类型:

    1. 递归型:负责查询其他DNS服务器,并返回请求者所需的数据
    2. 迭代型:只回答自己知道的信息,将请求进一步转发给其他DNS服务器
    3. 缓存型:缓存已查询过的域名解析结果,以便加快后续相同请求的响应速度

    DNS服务器通过查询不同级别的域名服务器来获取解析结果并返回给客户端。如果本地区域没有找到该主机记录,则会向较高层次上游查询。
    正反向解析域:正向解析就是根据主机名(如www.baidu.com)查找对应IP地址。
    反向解析是根据IP

  9. 实现DNS主从同步

    vim /etc/named.rfc1912.zones

    zone “yu.org” IN {
    type slave;
    masters {10.0.0.11}
    file “slaves/yu.org.zone”;
    };

    image-20240512223744792

    vim /var/named/smith.local.zone
    增加slave dns的解析
    slave A 10.0.0.11

    [root@Slave ~]# yum install bind bind-utils -y
    [root@Slave ~]# vim /etc/named.conf
    //
    // named.conf
    //
    // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
    // server as a caching only nameserver (as a localhost DNS resolver only).
    //
    // See /usr/share/doc/bind*/sample/ for example named configuration files.
    //
    // See the BIND Administrator's Reference Manual (ARM) for details about the
    // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
     
    options {
        listen-on port 53 { 192.168.41.191; };
        listen-on-v6 port 53 { ::1; };
        directory   "/var/named";
        dump-file   "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { 192.168.41.0/24; };
     
        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;
     
        dnssec-enable yes;
        dnssec-validation yes;
     
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.key";
     
        managed-keys-directory "/var/named/dynamic";
     
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
    };
     
    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
     
    zone "cui.com" IN {
        type slave;
        file "slaves/cui.zone";
            masters { 192.168.41.148; };
    };
     
    include "/etc/named.rfc1912.zones";
    include "/etc/named.root.key";
     
    [root@Slave ~]# systemctl enable named && systemctl start named
    [root@Slave ~]# ll /var/named/slaves/
    total 4
    -rw-r--r-- 1 named named 517 Mar 22 10:32 cui.zone
    

    named-checkconf
    named-checkzone smith.local /var/named/smith.local.zone
    systemctl restart named
    rndc reload

    实现DNS子域授权

    root@hb-cj-rocky:yum install bind bind-utils -y
    root@hb-cj-rocky:vim /etc/named.conf

  10. 基于acl实现智能DNS
    [root@localhost ~]# yum install bind bind-utils -y
    [root@localhost ~]# vim /etc/named.conf
    //
    // named.conf
    //
    // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
    // server as a caching only nameserver (as a localhost DNS resolver only).
    //
    // See /usr/share/doc/bind*/sample/ for example named configuration files.
    //
    // See the BIND Administrator's Reference Manual (ARM) for details about the
    // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
    acl "smartdns" {
         192.168.41.0/24;
    };
     
    options {
        listen-on port 53 { 192.168.41.191; };
        listen-on-v6 port 53 { ::1; };
        directory   "/var/named";
        dump-file   "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { smartdns; };
            allow-recursion { smartdns; };
     
        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;
     
        dnssec-enable yes;
        dnssec-validation yes;
     
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.key";
     
        managed-keys-directory "/var/named/dynamic";
     
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
    };
     
    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
     
    zone "." IN {
        type hint;
        file "named.ca";
    };
     
    include "/etc/named.rfc1912.zones";
    include "/etc/named.root.key";
     
    [root@localhost ~]# touch /var/named/cui.com.zone
    [root@localhost ~]# vim /var/named/cui.com.zone
    $TTL 86400
    @   IN  SOA ns1.cui.com. admin.cui.com. (
                    2021071501  ; Serial
                    3600        ; Refresh
                    1800        ; Retry
                    604800      ; Expire
                    86400       ; Minimum TTL
    )
    @   IN  NS  ns1.cui.com.
    ns1 IN  A   192.168.41.191
    www IN  A   192.168.41.148
     
    [root@localhost ~]# systemctl enable named && systemctl restart named
    
  11. 总结防火墙分类

    防火墙是一种计算机网络安全设备,用于监视和控制进出网络的数据流。防火墙通常分为以下几类:
    1、包过滤型防火墙
    包过滤型防火墙是最早的防火墙之一,它基于网络数据包的源地址、目标地址、协议类型、端口号等信息来决定是否允许通过。包过滤型防火墙具有高效率、低延迟和低成本等优点,但它只能检查数据包的头部信息,而无法深入检查数据包的内容,容易被攻击者绕过。
    2、应用层网关型防火墙
    应用层网关型防火墙是一种基于应用层协议的防火墙,它可以深入检查数据包的内容,并根据应用层协议进行过滤和控制。应用层网关型防火墙具有高度的灵活性和安全性,但也存在效率较低和复杂度较高的问题。
    3、状态检测型防火墙
    状态检测型防火墙是一种基于连接状态的防火墙,它可以检测数据包的连接状态,如建立连接、保持连接和关闭连接等,并根据连接状态决定是否允许通过。状态检测型防火墙可以有效地防止一些特定的攻击,如拒绝服务攻击和网络蠕虫攻击等。
    4、混合型防火墙
    混合型防火墙将多种防火墙技术进行组合,以提高安全性和灵活性。混合型防火墙通常包括包过滤型防火墙、应用层网关型防火墙和状态检测型防火墙等多种技术,可以根据实际需求进行灵活配置。
    总之,不同类型的防火墙各有优缺点,应根据实际需求和安全性要求选择适合的防火墙技术进行配置和使用。

  12. 总结iptable 5表5链, 基本使用,扩展模块。

    1、五个表
    filter表:默认使用该表,用于过滤数据包;
    nat表:用于网络地址转换,如端口转发、源地址转换等;
    mangle表:用于修改数据包的特定字段,如TTL、TOS、标记等;
    raw表:用于禁止某些特定的数据包被进一步处理;
    security表:用于安全框架SELinux的规则过滤。

    优先级由高到低的顺序为
    security -->raw–>mangle–>nat–>filter

    2、五个链
    INPUT链:用于处理输入数据包;
    OUTPUT链:用于处理输出数据包;
    FORWARD链:用于处理转发数据包;
    PREROUTING链:用于处理数据包进入路由之前的工作;
    POSTROUTING链:用于处理数据包离开路由之后的工作。
    3、基本使用
    查看iptables规则:iptables -L
    清除iptables规则:iptables -F
    设置默认规则:iptables -P [CHAIN] [target]
    添加规则:iptables -A [CHAIN] [OPTIONS] [target]
    删除规则:iptables -D [CHAIN] [OPTIONS] [target]
    4、扩展模块
    conntrack模块:用于跟踪连接状态;
    limit模块:用于限制数据包流量;
    mark模块:用于标记数据包;
    REJECT模块:用于拒绝数据包;
    LOG模块:用于记录数据包信息。
    总之,iptables是一种功能强大的防火墙软件,可以使用五个表和五个链来监控、过滤和修改数据包流量,以及使用扩展模块来实现更复杂的功能。熟练掌握iptables的基本使用和扩展模块,可以帮助系统管理员更好地保护计算机网络的安全。

  13. 总结iptables规则优化实践,规则保存和恢复。

    1、尽量使用已有规则:可以使用已有规则,避免重复创建规则。
    2、使用地址块:可以使用地址块来简化规则,减少重复。
    3、使用扩展模块:可以使用扩展模块来实现更复杂的规则,如限制数据包流量、标记数据包、拒绝数据包、记录数据包信息等。
    4、避免使用DROP规则:DROP规则会丢弃数据包,导致网络连接超时,建议使用REJECT规则。
    5、避免使用ACCEPT规则:尽量使用默认策略,只开放必要的端口。
    6、使用链来组织规则:可以使用链来组织规则,提高规则的可读性和可维护性。
    7、避免使用通配符:尽量避免使用通配符,如0.0.0.0/0和::/0。
    8、使用规则注释:可以使用注释来说明规则,提高规则的可读性。

    规则保存和恢复可以使用以下命令:
    保存规则:iptables-save > /etc/sysconfig/iptables
    恢复规则:iptables-restore < /etc/sysconfig/iptables
    永久保存规则:service iptables save

  14. 总结NAT转换原理, DNAT/SDNAT原理,并自行设计架构实现DNAT/SNAT。

    NAT(Network Address Translation)是一种网络地址转换技术,可以将私有IP地址转换为公共IP地址,以实现内部网络和外部网络的通信。NAT转换原理如下:
    1、SNAT(Source NAT):将私有IP地址转换为公共IP地址,以便内部网络能够访问外部网络。SNAT会修改数据包的源IP地址和源端口号,同时在NAT表中记录转换规则。
    2、DNAT(Destination NAT):将公共IP地址转换为私有IP地址,以便外部网络能够访问内部网络。DNAT会修改数据包的目标IP地址和目标端口号,同时在NAT表中记录转换规则。DNAT和SNAT的原理是类似的,都是通过修改数据包的源或目标IP地址来实现网络地址转换。具体实现流程如下:
    3、数据包到达NAT设备时,根据目标IP地址和目标端口号匹配NAT表中的转换规则。
    4、如果匹配成功,NAT设备会根据转换规则修改数据包的源或目标IP地址和端口号。
    5、如果匹配失败,NAT设备会将数据包转发到下一个设备。

    自行设计架构实现DNAT/SNAT可以采取以下步骤:
    1、配置NAT设备的网络接口,如内部网络的接口和外部网络的接口。
    2、配置NAT表,包括DNAT表和SNAT表,根据转换规则来修改数据包的源或目标IP地址。
    3、配置转发规则,将符合条件的数据包转发到相应的网络接口。
    4、测试NAT设备的功能,并根据需要进行优化和调整。

  15. 使用REDIRECT将90端口重定向80,并可以访问到80端口的服务

    可以使用以下命令将90端口重定向到80端口:
    iptables -t nat -A PREROUTING -p tcp --dport 90 -j REDIRECT --to-port 80
    这个命令会将所有流量从90端口重定向到80端口。这种方法在需要将一个端口转发到另一个端口时非常有用。如果您有多个要重定向的端口,可以将上面的命令添加到shell脚本中,以便更容易地进行管理和维护。

  16. firewalld常见区域总结。
    1. public区域:适用于公共网络,如Internet。在这个区域中,所有入站流量都被禁止,除非在规则中添加显式允许的规则。
    2. internal区域:适用于内部网络,如公司的局域网。在这个区域中,所有入站连接都是默认允许的,因此需要谨慎地添加规则以限制访问。
    3. dmz区域:适用于半信任网络区域,通常用于放置Web服务器、邮件服务器等。在这个区域中,入站流量是允许的,但需要添加规则限制流量的范围和目的。
    4. work区域:适用于工作场所网络,如办公室网络。该区域中入站流量默认是允许的,但需要添加规则限制访问。
    5. home区域:适用于家庭网络,入站流量默认情况下是允许的,但需要添加规则限制访问。
    6. trusted区域:适用于完全信任的网络。在这个区域中,所有入站和出站连接都是默认允许的,但还是需要添加规则以限制访问。!
  17. 通过ntftable来实现暴露本机80/443/ssh服务端口给指定网络访问

    ntftables是Linux内核中的一个防火墙框架,它可以使用类似iptables的规则来控制网络流量。如果您想暴露本机80、443和SSH服务端口给指定网络访问,可以按照以下步骤操作:

    1. 创建一个名为“allow_port”的ntftables表格,并在该表格中添加三个链:tcp80、tcp443和ssh。
      ntfctable create allow_port nftables
      nft add chain inet allow_port tcp80 { type filter hook input priority 0 ; }
      nft add chain inet allow_port tcp443 { type filter hook input priority 0 ; }
      nft add chain inet allow_port ssh { type filter hook input priority 0 ; }

    2. 分别在这三个链中添加规则,以允许来自指定IP地址或网络的流量通过。例如,假设您想允许来自192.168.0.0/24网络的流量,可以使用以下命令添加规则:
      nft add rule inet allow_port tcp80 ip saddr 192.168.0.0/24 tcp dport 80 accept
      nft add rule inet allow_port tcp443 ip saddr 192.168.0.0/24 tcp dport 443 accept
      nft add rule inet allow_port ssh ip saddr 192.168.0.0/24 tcp dport 22 accept

    3. 最后,将默认的INPUT策略设置为DROP,以阻止所有其他未明确允许的流量通过。可以使用以下命令来完成此操作:
      nft add rule inet filter INPUT ct state invalid drop
      nft add rule inet filter INPUT ct state { established, related } accept
      nft add rule inet filter INPUT iifname lo accept
      nft add rule inet filter INPUT ip protocol icmp accept
      nft add rule inet filter INPUT tcp flags & (fin | syn | rst | ack) == ack drop
      nft add rule inet filter INPUT tcp dport 22 ct state new,untracked jump allow_port ssh
      nft add rule inet filter INPUT tcp dport 80 ct state new,untracked jump allow_port tcp80
      nft add rule inet filter INPUT tcp dport 443 ct state new,untracked jump allow_port tcp443
      nft add rule inet filter INPUT icmp type { echo-request, echo-reply } icmpv6 type { echo-request, echo-reply } drop
      nft add rule inet filter INPUT drop

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值