• Linux入门攻坚——24、BIND编译安装、Telnet和OpenSSH


    BIND编译安装

    对于没有rpm包,需要源代码编译安装。

    1、下载源代码:bind-9.12.2-P1.tar.gz,解压:tar -xf bind-9.12.2-P1.tar.gz
    2、完善环境:
      1)增加用户组named:groupadd -g 53 named
      2)增加用户named(系统用户):useradd -r -u 53 -g  named named 
    3、执行configure:进入加压后的目录,执行
        ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --disable-ipv6 --disable-chroot --enable-threads
        make
        make install
    4、编译安装后,没有配置文件,即没有named.conf和named.rfc1912.zones等配置文件;没有rndc相关的配置文件;所以需要手工建立。同时相关命令也不能直接调用,相关库文件、头文件、资料文件需要添加到搜索路径中,即导出这些文件:

    1)导出二进制命令路径,需要将路径输出到PATH环境变量中:在/etc/profile.d/下建立named.sh文件,内容如下:  export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH
    然后重读一下文件:. /etc/profile.d/named.sh  ,然后就可以直接调用这些命令了。
      2)导出库文件,其他程序用到这些开发库,如果不导出,也无法使用,即找不到,所以要导出:
    在/etc/ld.so.conf.d/下新建named.conf文件,内容是bind的库文件位置:
    /usr/local/bind9/lib
    然后要通知系统重读此配置文件,生成库文件搜索路径:ldconfig -v
      3)导出头文件:ln -sv /usr/local/bind9/include/ /usr/include/named
      4)导出帮助手册,即man目录,即将安装的man目录加入到搜索路径中,编辑/etc/man.config文件:添加MANPATH路径:

      5)创建bind的配置文件/etc/named/named.conf,因为我们编译安装是配置了配置文件路径是/etc/named。

    1. options {
    2. directory "/var/named"; //全局配置只配置这一项就可以运行了,其他采用默认配置
    3. };
    4. zone "." IN {
    5. type hint;
    6. file "named.ca";
    7. };
    8. zone "localhost" IN {
    9. type master;
    10. file "localhost.zone";
    11. allow-update { none; };
    12. };
    13. zone "0.0.127.in-addr.arpa" IN {
    14. type master;
    15. file "named.local";
    16. allow-update { none; };
    17. };

    然后这些库文件也需要我们自己创建:/var/named/named.ca、/var/named/localhost.zone、/var/named/named.local
    根节点库文件,可以通过:dig -t NS . @ip获得,这里ip是可以连接互联网的机器:
    将结果拷贝到named.ca中:dig -t NS . @192.168.138.2 > /var/named/named.ca
    创建解析库文件:/var/named/localhost.zone:

    1. $TTL 1d
    2. @ IN SOA localhost. admin.localhost. (
    3. 2024052401
    4. 1h
    5. 5m
    6. 7d
    7. 1d )
    8. IN NS localhost.
    9. localhost. IN A 127.0.0.1

    解析库文件:/var/named/named.local
     

    1. $TTL 1d
    2. @ IN SOA localhost. admin.localhost. (
    3. 2024052401
    4. 1h
    5. 5m
    6. 7d
    7. 1d )
    8. IN NS localhost.
    9. 1 IN PTR localhost.

    6)修改文件权限:
      /var/named/下的所有文件:chmod 640 ./*   ;  chown :named *
      chmod 640 /etc/named/named.conf   ; chown :named /etc/named/named.conf
    5、启动服务,成为缓存名称服务器:
      named -u named -f -g -d 3,运行于前台
      named -u named,运行于后台

    启动过程中多次出现某目录或文件权限不够的提示,即permission denied,修改其属组权限后,系统运行正常

    6、配置rndc,使用rndc工具时,提示
    [root@study610-f2 named]# rndc reload
    rndc: neither /etc/named/rndc.conf nor /etc/named/rndc.key was found
    使用rndc-confgen产生:

    按照提示分别拷贝相关内容到rndc.conf和named.conf中

    1. # 以下为named.conf文件内容
    2. options {
    3. directory "/var/named";
    4. };
    5. zone "." IN {
    6. type hint;
    7. file "named.ca";
    8. };
    9. zone "localhost" IN {
    10. type master;
    11. file "localhost.zone";
    12. allow-update { none; };
    13. };
    14. zone "0.0.127.in-addr.arpa" IN {
    15. type master;
    16. file "named.local";
    17. allow-update { none; };
    18. };
    19. zone "mytestcc.com" IN {
    20. type master;
    21. file "mytestcc.com.zone";
    22. allow-update { none; };
    23. };
    24. # Use with the following in named.conf, adjusting the allow list as needed:
    25. key "rndc-key" {
    26. algorithm hmac-sha256;
    27. secret "JS3jsXcMavvFVDGsjokYVhvml8h5dhwnvvrZJElW0F0=";
    28. };
    29. controls {
    30. inet 127.0.0.1 port 953
    31. allow { 127.0.0.1; } keys { "rndc-key"; };
    32. };
    33. # End of named.conf
    34. # 以下为rndc.conf文件内容
    35. # Start of rndc.conf
    36. key "rndc-key" {
    37. algorithm hmac-sha256;
    38. secret "JS3jsXcMavvFVDGsjokYVhvml8h5dhwnvvrZJElW0F0=";
    39. };
    40. options {
    41. default-key "rndc-key";
    42. default-server 127.0.0.1;
    43. default-port 953;
    44. };
    45. # End of rndc.conf

    重新启动named进程,即可使用rndc进行管理。

    远程登录
    登录到主机中,经历了 本地终端——>远程终端——>安全远程终端 几个阶段,最开始,主机提供相应的硬件接口,在此接口上连接VGA和键盘,实现登录主机,即本地终端登录,此时主机不需要额外的进程来处理与终端的通讯,随着网络的发展,出现在远端通过网络登录主机的需求,要实现的是同本地终端类似的功能,因为需要通过网络连接,并且要把网络包内容并在主机上解包并并运行其中的内容,就需要额外进程来负责,分为服务器端和客户端,服务器端实现接收客户端的输入内容,与主机交互将内容交给主机执行,将主机执行结果打包反馈给客户端,客户端要实现模拟本地终端的功能,实现内容输入和接收返回内容的展示,这需要双方遵守相同的规则,即需要终端通信协议,此时交互内容是明文在网络上传递;随着网络安全威胁越来越高,上述交互很容易被窃取,于是要求安全的网络交互,就出现了安全的远程终端,随之也就有安全终端协议。

    Telnet

    一种不安全的远程终端协议telnet协议的实现,C/S架构,监听端口23/tcp。

    telnet的使用:
    1)安装:yum install telnet-server

    安装后有telnet-server.x86_64 和telnet.x86_64 两个程序包,一个是服务器端程序包,一个是客户端程序包。telnet server是一个独特的服务,工作于基于超级守护进程管理的瞬时守护进程模式。

    2)telnet server的启动:
      chkconfig telnet on
      service xinetd restart
    查看:

    xinetd叫超级守护进程,下面的没有运行级别的,像telnet叫瞬时守护进程。xinetd代瞬时守护进程监听,在有用户访问时,唤醒瞬时守护进程。像telnet进程使用的频度不高,不需要时刻监听。

    3)登录,因为telnet是明文传输,禁止使用管理员账户登录,使用普通用户登录:
    在windows上:

    OpenSSH

    ssh:secure shell ,Protocol,即是一种协议。监听在tcp的22号端口,实现安全的远程登录。
    OpenSSH:ssh协议的开源实现。dropbear是另一种实现。
    Telnet:实现远程登录,但是没有安全保护,早期的远程登录。端口23/tcp

    SSH协议版本:
      v1:基于CRC-32做MAC,不安全:易遭到man-in-middle攻击
      v2:双方主机协商选择安全的MAC方式。基于DH算法做密钥交换,基于RSA或DSA算法实现身份认证。

    两种方式的用户登录认证:  基于password、基于key
      通过ssh host登录服务器,客户端必须认证一下这台主机是不是就是要连接的那台主机,一般使用密钥对方式验证,客户端用主机的公钥解密主机发送的内容验证通过,即证明是需要的主机。关于客户端中主机的公钥,在第一次登录时,主机会发送这个公钥,在客户端会提醒是否保存这个公钥,就是让客户端使用者确定主机,接受保存后下一次访问,就会直接使用这个公钥。

    基于密钥登录:客户端生成密钥对,将公钥发送给远程主机中对应登录用户的家目录下的某个文件中,以后此用户再登录时,主机用此公钥解密客户端的信息,依此来判断客户端的合法性,而不需要输入口令。此公钥是不允许公开的。

    具体保存在~/.ssh/known_hosts中。

    OpenSSH是C/S架构,客户端(C端)有ssh,(scp,sftp),windows客户端有xshell,putty,securecrt;对于Linux下的ssh客户端,配置文件为/etc/ssh/ssh_config;服务器端(S端):sshd,配置文件为/etc/ssh/sshd_config

    客户端工具:ssh命令
      ssh [user]@host [command]:没有user,默认使用linux当前登录用户,指定了user,以指定的特定user登录。
      ssh [ -l user ] host [command]: 
      参数  -p port:远程服务器监听的端口;
               -X :支持X11转发
               -Y:支持信任的x11转发;

      客户端配置文件格式,/etc/ssh/ssh_config
        Host PATTERN
            PARAMETER VALUE

    1. # Host * # *号代表所有主机
    2. # ForwardAgent no
    3. # ForwardX11 no
    4. # RhostsRSAAuthentication no
    5. # RSAAuthentication yes
    6. # PasswordAuthentication yes
    7. # HostbasedAuthentication no
    8. # GSSAPIAuthentication no
    9. # GSSAPIDelegateCredentials no
    10. # GSSAPIKeyExchange no
    11. # GSSAPITrustDNS no
    12. # BatchMode no
    13. # CheckHostIP yes
    14. # AddressFamily any
    15. # ConnectTimeout 0
    16. # StrictHostKeyChecking ask # 第一次登录时,会提示是否接受密钥,设置no不提问
    17. # IdentityFile ~/.ssh/identity
    18. # IdentityFile ~/.ssh/id_rsa
    19. # IdentityFile ~/.ssh/id_dsa
    20. # Port 22
    21. # Protocol 2,1
    22. # Cipher 3des
    23. # Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
    24. # MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
    25. # EscapeChar ~
    26. # Tunnel no
    27. # TunnelDevice any:any
    28. # PermitLocalCommand no
    29. # VisualHostKey no
    30. Host *
    31. GSSAPIAuthentication yes
    32. # If this option is set to yes then remote X11 clients will have full access
    33. # to the original X11 display. As virtually no X11 client supports the untrusted
    34. # mode correctly we set this to yes.
    35. ForwardX11Trusted yes
    36. # Send locale-related environment variables
    37. SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    38. SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    39. SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    40. SendEnv XMODIFIERS

    基于密钥的认证(不需要密码进行登录):
      (1)在客户端生成密钥对
            ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"]
      (2) 把公钥传输至远程服务器对应用户的家目录
            ssh-copy-id [ -i [ identity_file] ] [ user@] machine
      (3)登录验证:ssh 
      (4)安全提醒:不要使用root,可以登录后切换至root

    实操:
      1)客户端生成密钥对:


      2)把公钥传输至远程服务器端对应用户的家目录

    在服务器中查看:

    注意,authorized_keys文件的权限为:-rw-------,即600,这是为了确保安全。
      3)测试:

    结果直接登录,没有提示输入密码。

    scp命令
      scp [options]  SRC ...  DEST/
      存在两种情形:
        PULL:scp [options] [user@]host:/PATH/FROM/SOMEFILE /PATH/TO/SOMEWHERE
        把远程文件拉到本地来,以哪个用户登录到哪台远程主机上去拉文件,即远程主机的用户
        PUSH:scp [options] /PATH/FROM/SOMEFILE [user@]host:/PATH/TO/SOMEWHERE
        把本地文件推送给(复制给)远程主机。也是远程主机用户。
        常用选项:
            -r :递归复制
            -p :保持源文件的属性信息
            -q :静默模式
            -P PORT:指明remote host的监听的端口;

    scp也基于ssh,因为在上一步设置了基于密钥的认证,所以复制过程也不需要输入密码。

    sftp命令
      sftp [user@]host
    同scp,也是基于ssh

    服务器端:sshd
      配置文件/etc/ssh/sshd_config

    1. # $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
    2. # This is the sshd server system-wide configuration file. See
    3. # sshd_config(5) for more information.
    4. # This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
    5. # The strategy used for options in the default sshd_config shipped with
    6. # OpenSSH is to specify options with their default value where
    7. # possible, but leave them commented. Uncommented options change a
    8. # default value.
    9. # 以#加空格开头的是注释,以#开头后无空格的是配置项,去掉#就是配置
    10. #Port 22 # sshd服务监听的端口,默认22
    11. #AddressFamily any # IP家族,any表示IPv4和IPv6
    12. #ListenAddress 0.0.0.0 # 监听本机所有IPv4地址
    13. #ListenAddress ::
    14. # Disable legacy (protocol version 1) support in the server for new
    15. # installations. In future the default will change to require explicit
    16. # activation of protocol 1
    17. Protocol 2 # 使用协议的哪个版本
    18. # Centos6上sshd的配置
    19. # HostKey for protocol version 1
    20. #HostKey /etc/ssh/ssh_host_key
    21. # HostKeys for protocol version 2
    22. #HostKey /etc/ssh/ssh_host_rsa_key
    23. #HostKey /etc/ssh/ssh_host_dsa_key
    24. # 在7.x版本,即centos7上,配置如下
    25. #HostKey /etc/ssh/ssh_host_rsa_key
    26. ##HostKey /etc/ssh/ssh_host_dsa_key
    27. #HostKey /etc/ssh/ssh_host_ecdsa_key # 在用户登录时发送给用户的公钥,即保存在客户端用户家目录.ssh下know_hosts中的公钥
    28. #HostKey /etc/ssh/ssh_host_ed25519_key
    29. # Lifetime and size of ephemeral version 1 server key
    30. #KeyRegenerationInterval 1h # 对称密钥重新生成时间间隔
    31. #ServerKeyBits 1024
    32. # Logging
    33. # obsoletes QuietMode and FascistLogging
    34. #SyslogFacility AUTH
    35. SyslogFacility AUTHPRIV # 日志使用AUTHPRIV,保存在/var/log/secure
    36. #LogLevel INFO
    37. # Authentication:
    38. #LoginGraceTime 2m # 登录的宽限时间(等待输入用户密码时间)
    39. #PermitRootLogin yes # 是否允许root直接登录,默认是可以的
    40. #StrictModes yes # 是否严格检查格式
    41. #MaxAuthTries 6 # 最大认证重试次数
    42. #MaxSessions 10 # 最大会话数
    43. #RSAAuthentication yes
    44. #PubkeyAuthentication yes
    45. #AuthorizedKeysFile .ssh/authorized_keys # 客户端采用密钥认证时,客户端的公钥在服务器端的保存位置
    46. #AuthorizedKeysCommand none
    47. #AuthorizedKeysCommandRunAs nobody
    48. # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
    49. #RhostsRSAAuthentication no
    50. # similar for protocol version 2
    51. #HostbasedAuthentication no
    52. # Change to yes if you don't trust ~/.ssh/known_hosts for
    53. # RhostsRSAAuthentication and HostbasedAuthentication
    54. #IgnoreUserKnownHosts no
    55. # Don't read the user's ~/.rhosts and ~/.shosts files
    56. #IgnoreRhosts yes
    57. # To disable tunneled clear text passwords, change to no here!
    58. #PasswordAuthentication yes
    59. #PermitEmptyPasswords no
    60. PasswordAuthentication yes # 允许基于口令认证方式登录
    61. # Change to no to disable s/key passwords
    62. #ChallengeResponseAuthentication yes
    63. ChallengeResponseAuthentication no
    64. # Kerberos options # 实现第三方统一认证的一种认证方式
    65. #KerberosAuthentication no
    66. #KerberosOrLocalPasswd yes
    67. #KerberosTicketCleanup yes
    68. #KerberosGetAFSToken no
    69. #KerberosUseKuserok yes
    70. # GSSAPI options
    71. #GSSAPIAuthentication no
    72. GSSAPIAuthentication yes
    73. #GSSAPICleanupCredentials yes
    74. GSSAPICleanupCredentials yes
    75. #GSSAPIStrictAcceptorCheck yes
    76. #GSSAPIKeyExchange no
    77. # Set this to 'yes' to enable PAM authentication, account processing,
    78. # and session processing. If this is enabled, PAM authentication will
    79. # be allowed through the ChallengeResponseAuthentication and
    80. # PasswordAuthentication. Depending on your PAM configuration,
    81. # PAM authentication via ChallengeResponseAuthentication may bypass
    82. # the setting of "PermitRootLogin without-password".
    83. # If you just want the PAM account and session checks to run without
    84. # PAM authentication, then enable this but set PasswordAuthentication
    85. # and ChallengeResponseAuthentication to 'no'.
    86. #UsePAM no
    87. UsePAM yes
    88. # Accept locale-related environment variables
    89. AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    90. AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    91. AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    92. AcceptEnv XMODIFIERS
    93. #AllowAgentForwarding yes
    94. #AllowTcpForwarding yes
    95. #GatewayPorts no
    96. #X11Forwarding no
    97. X11Forwarding yes # 允许客户端调用服务器端的图形程序
    98. #X11DisplayOffset 10
    99. #X11UseLocalhost yes
    100. #PrintMotd yes
    101. #PrintLastLog yes
    102. #TCPKeepAlive yes
    103. #UseLogin no
    104. #UsePrivilegeSeparation yes
    105. #PermitUserEnvironment no
    106. #Compression delayed
    107. #ClientAliveInterval 0
    108. #ClientAliveCountMax 3
    109. #ShowPatchLevel no
    110. #UseDNS yes # DNS的反向解析功能,默认是开启的,一般设为no,否则,客户端登录时会发生被卡住一会的现象
    111. #PidFile /var/run/sshd.pid
    112. #MaxStartups 10:30:100
    113. #PermitTunnel no
    114. #ChrootDirectory none
    115. # no default banner path
    116. #Banner none
    117. # override default of no subsystems
    118. Subsystem sftp /usr/libexec/openssh/sftp-server # 支持sftp
    119. # Example of overriding settings on a per-user basis
    120. #Match User anoncvs
    121. # X11Forwarding no
    122. # AllowTcpForwarding no
    123. # ForceCommand cvs server

    在ssh命令中使用 -X选项支持X11转发或-Y选项支持信任的x11转发

    ssh服务的最佳实践
      1、不要使用默认端口;
      2、禁止使用Protocol version 1;
      3、限制可登录用户:配置文件中AllowUsers和AllowGroups,白名单;
       实操: 添加两个用户:gentoo和centos,在没配置白名单前都能登录:

    在服务器的配置文件/etc/ssh/sshd_config的最后添加:AllowUsers root centos
    然后重载服务:service sshd restart
    再次测试登录,centos可以登录,但是gentoo无法登录:

      也可以使用黑名单:DenyUsers
      4、设定空闲会话超时时长;
      5、利用防火墙设置ssh访问策略;
      6、仅监听特定的IP地址;
      7、基于口令认证时,使用强密码策略;
            随机密码:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
      8、使用基于密钥的认证;
      9、禁止使用空密码;
      10、禁止root用户直接登录;
      11、限制ssh的访问频度和并发在线数;
      12、做好日志,经常分析;

    ssh协议的另一个实现:dropbear
      1)安装:yum install dropbear
      2)生成密钥对,启动服务:        
            dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
            dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
            dropbear -p [ip:]port -F -E

    连接测试:

      3)可以作为客户端连接其他远程主机,工具是dbclient
        dbclient root@host

    OpenSSL-重温
      三个组件:
      openssl:多用途的命令行工具;
      libcrypto:加密解密库;
      libssl:ssl协议的实现

    PKI:Public Key Instructure,公钥基础设施
      CA、RA、CRL、证书存取库

    建立私有CA(一个组织内部使用):两种方式
      OpenCA和 openssl,OpenCA比较专业,使用也比较复杂;openssl简单易用

    证书申请及签署步骤:
      1)生成申请请求;
      2)RA核验;
      3)CA签署;
      4)获取证书;

    创建私有CA:
      openssl的配置文件:/etc/pki/tls/openssl.cnf  

    安装上面配置信息创建对应的文件、目录
      1)创建所需文件,在/etc/pki/CA目录下
        # touch index.txt
        # echo 01 > serial
        确保certs 、crl、 newcerts、 private子目录存在
      2)CA自签证书,要想生存证书,要有密钥对
    # (umask 077;openssl genrsa -out private/cakey.pem 2048)   # 生成私钥,-out与配置文件一致
    # openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650  -out /etc/pki/CA/cacert.pem     # 自签证书生成
        -new:生成新证书签署请求
        -x509:专用于cA生成自签证书
        -key:生成请求时用到的私钥文件,证书需要公钥,通过私钥自动生成
        -days:证书有效期限
        -out:证书的保存路径,与配置文件中的配置保持一致
    这个文件发送给需要使用证书的客户机,导入到信任的根证书颁发机构中。
      3)发证
        (a)用到证书的主机生成证书请求
          生成私钥、利用私钥生成证书签署请求文件
        (b)把证书签署请求文件传输给CA
        (c)CA签署证书,并将证书发还给用户
        (d)查看证书中的信息:
            openssl x509 in /PATH/FROM/CERT_FILE -noout -text| -subject | -serial
        (e)吊销证书:
            <1>获取要吊销的证书的serial
            <2>CA先根据客户提交的serial与subject,对比检验是否与index.txt中信息一致;
            吊销证书:openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
            生成吊销证书的编号(第一次吊销一个证书时):echo 01 > /etc/pki/CA/crlnumber
            更新证书吊销列表:openssl ca -gencrl -out thisca.crl
            查看crl文件:openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
    实操:
      a)、 (umask 077; openssl genrsa -out httpd.key 2048)  # 生成私钥

      openssl req -new -key httpd.key -days 365 -out httpd.csr  # 生成证书签署请求文件

      b)、发送此请求文件至CA:
      scp httpd.csr root@192.168.138.139:/tmp

      c)、CA签发证书
      openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
    出现错误:

    原因分析:在前面安装python时,对openssl进行了编译安装,所以现在的openssl使用的是编译安装后的高版本,其配置文件使用的是/usr/local/openssl/ssl目录下的openssl.cnf
    错误排除:修改/usr/local/openssl/ssl/openssl.cnf配置文件,将其中的dir = ./demoCA,修改为dir=/etc/pki/CA应该就可以了。排查前面的操作,除了这个配置文件,其他都是在/etc/pki/CA目录下,所以openssl的配置文件只修改ca的目录配置即可。

    再次签发:

    证书签发成功。

    生成的证书应该保存在/etc/pki/CA/certs下。

    d)客户端取回证书:scp /tmp/httpd.crt root@192.168.138.138:/tmp

    e)查看证书信息:

    f)吊销证书:

    至此,证书签发完毕。

  • 相关阅读:
    Ubuntu配置全局系统代理(常用工具配置)
    Redis篇---第五篇
    AIOps指标异常检测之无监督算法
    完善多云平台软件体系,VMware再探索下一代企业IT架构
    Python爬虫——BautifulSoup 节点信息
    vue 两种路由模式具体实现
    Flink 维表关联
    Sermant在异地多活场景下的实践
    动态规划(Dynamic Programming)
    【微服务】Nacos服务发现源码分析
  • 原文地址:https://blog.csdn.net/kaoa000/article/details/139139688