• 学习笔记-Power-Linux


    Power-Linux

    • Linux 下各种常见服务的搭建/配置指南
    • 大部分环境在 Centos7,少部分 Ubuntu
    • 主要以安装搭建为主,近一步的配置请参考官方教程

    大纲


    常见工具

    Lvm

    LVM 是 Logical Volume Manager 的缩写,中文一般翻译为 "逻辑卷管理",它是 Linux 下对磁盘分区进行管理的一种机制。LVM 是建立在磁盘分区和文件系统之间的一个逻辑层,系统管理员可以利用 LVM 在不重新对磁盘分区的情况下动态的调整分区的大小。如果系统新增了一块硬盘,通过 LVM 就可以将新增的硬盘空间直接扩展到原来的磁盘分区上。

    1. fdisk -l # 查看磁盘情况
    2. fdisk /dev/sdb # 创建系统分区
    3. n
    4. p
    5. 1
    6. 后面都是默认,直接回车
    7. t # 转换分区格式
    8. 8e
    9. w # 写入分区表

    卷组

    创建一个名为 datastore 的卷组,卷组的 PE 尺寸为 16MB;

    1. pvcreate /dev/sdb1 # 初始化物理卷
    2. vgcreate -s 16M datastore /dev/sdb1 # 创建物理卷

    逻辑卷

    逻辑卷的名称为 database 所属卷组为 datastore,该逻辑卷由 50 个 PE 组成;

    lvcreate -l 50 -n database datastore

    逻辑卷的名称为 database 所属卷组为 datastore,该逻辑卷大小为 8GB;

    1. lvcreate -L 8G -n database datastore
    2. lvdisplay

    格式化

    将新建的逻辑卷格式化为 XFS 文件系统,要求在系统启动时能够自动挂在到 /mnt/database 目录.

    1. mkfs.xfs /dev/datastore/database
    2. mkdir /mnt/database

    添加挂载的配置

    1. vim /etc/fstab
    2. + /dev/datastore/database /mnt/database/ xfs defaults 0 0

    重启验证

    1. shutdown -r now
    2. mount | grep '^/dev'

    扩容

    将 database 逻辑卷扩容至 15GB 空间大小,以满足业务需求.

    1. lvextend -L 15G /dev/datastore/database
    2. lvs # 确认有足够空间
    3. resize2fs /dev/datastore/database
    4. lvdisplay

    Net

    centos 配置网卡

    1. vim /etc/sysconfig/network-scripts/ifcfg-eth0
    2. DEVICE="enoXXXXXX"
    3. BOOTPROTO=static # 使用静态 IP,而不是由 DHCP 分配 IP
    4. IPADDR=172.16.102.61
    5. PREFIX=24
    6. ONBOOT=yes
    7. GATEWAY=172.16.102.254
    8. HOSTNAME=dns1.abc.com
    9. DNS1=223.5.5.5

    修改主机名

    1. vim /etc/hosts
    2. + 127.0.0.1 test localhost
    3. # 修改 localhost.localdomain 为 test,shutdown -r now 重启使修改生效

    修改 DNS

    1. vim /etc/resolv.conf
    2. - search localdomain
    3. + nameserver 8.8.8.8
    service network restart

    RAID

    安装

    1. yum remove mdadm # 建议先把原本的卸掉重装
    2. yum install -y mdadm

    分区

    1. fdisk /dev/sdb
    2. n 创建
    3. p 主分区
    4. 接下来一路回车选默认值
    5. w 写入
    6. fdisk /dev/sdc
    7. n 创建
    8. p 主分区
    9. 接下来一路回车选默认值
    10. w 写入

    创建阵列

    • RAID1

      1. mdadm -Cv /dev/md0 -a yes -l1 -n2 /dev/sd[b,c]1
      2. - -Cv: 创建一个阵列并打印出详细信息.
      3. - /dev/md0: 阵列名称.
      4. - -a : 同意创建设备,如不加此参数时必须先使用 mknod 命令来创建一个 RAID 设备,不过推荐使用 -a yes 参数一次性创建;
      5. - -l1 (l as in "level"): 指定阵列类型为 RAID-1 .
      6. - -n2: 指定我们将两个分区加入到阵列中去,分别为/dev/sdb1 和 /dev/sdc1
    • RAID5

      1. mdadm -Cv /dev/md0 -a yes -l5 -n3 /dev/sd[b,c,d]1
      2. cat /proc/mdstat # 查看进度
      3. mdadm -D /dev/md0 # 获取阵列信息

    格式化为 xfs

    mkfs.xfs /dev/md0

    以 UUID 的形式开机自动挂载

    1. mkdir /data/ftp_data
    2. blkid /dev/md0 # 查 UUID 值
    1. vim /etc/fstab
    2. + UUID=XXXXXXXXXXXXXXXXXXXXXXXXXX /data/ftp_data xfs defaults 0 0
    1. shutdown -r now # 重启验证
    2. mount | grep '^/dev'

    Vim

    VIM 是 Linux 系统上一款文本编辑器,它是操作文本的一款利器。

    常用操作

    1. Normal 模式下 i 进入 insert 模式
    2. :wq # 存盘+退出
    3. dd # 删除当前行,并存入剪切板
    4. p # 粘贴
    5. :q! # 强制退出
    6. :wq! # 强制保存退出
    7. :w !sudo tee % # 无 root 权限,保存编辑的文件
    8. :saveas [path/to/file] # 另存为
    9. 按下 / 即可进入查找模式,输入要查找的字符串并按下回车. Vim 会跳转到第一个匹配.按下 n 查找下一个,按下 N 查找上一个.
    10. :%s/foo/bar # 代表替换 foo 为 bar
    11. :%!xxd # 十六进制编辑模式, :%!xxd -r 切回去
    12. insert 模式按 ESC 键,返回 Normal 模式

    常用配置

    vim /etc/vim/vimrcvim /etc/vimrc 最后面直接添加你想添加的配置,下面是一些常用的 (不建议直接复制这个或者网上的,要理解每个的含义及有什么用,根据自己需要来调整)

    1. set number # 显示行号
    2. set nobackup # 覆盖文件时不备份
    3. set cursorline # 突出显示当前行
    4. set ruler # 在右下角显示光标位置的状态行
    5. set shiftwidth=4 # 设定 > 命令移动时的宽度为 4
    6. set softtabstop=4 # 使得按退格键时可以一次删掉 4 个空格
    7. set tabstop=4 # 设定 tab 长度为 4(可以改)
    8. set smartindent # 开启新行时使用智能自动缩进
    9. set ignorecase smartcase # 搜索时忽略大小写,但在有一个或以上大写字母时仍 保持对大小写敏感
    10. 下面这个在代码多的时候会比较好
    11. #set showmatch # 插入括号时,短暂地跳转到匹配的对应括号
    12. #set matchtime=2 # 短暂跳转到匹配括号的时间

    使用 vim 对比文件

    vimdiff  FILE_LEFT  FILE_RIGHT

    解决 ssh 后 vim 中不能使用小键盘的问题

    • xshell

      更改的方法: 在终端设置中选择终端类型为 linux

    • ubuntu

      1. apt-get remove vim-common
      2. apt-get install -y vim

    SpaceVim - 模块化的 Vim IDE

    how-to-exit-vim - 退出 vim 的多种方式


    Tmux

    安装

    1. # Ubuntu 或 Debian
    2. apt-get install -y tmux
    3. # CentOS 或 Fedora
    4. yum install -y tmux

    使用

    1. tmux # 进入了 Tmux 窗口,底部有一个状态栏。状态栏的左侧是窗口信息(编号和名称),右侧是系统信息
    2. # Ctrl+d 同下
    3. exit # 退出
    4. tmux info # 列出当前所有 Tmux 会话的信息
    5. tmux source-file ~/.tmux.conf # 重新加载当前的 Tmux 配置

    帮助信息

    1. Ctrl+b
    2. ? # 显示帮助信息
    3. Ctrl+b
    4. d # "最小化"tmux窗口
    5. tmux list-commands # 列出所有 Tmux 命令及其参数
    6. tmux list-keys # 列出所有快捷键,及其对应的 Tmux 命令

    新建会话

    1. tmux new -s test
    2. tmux new-session -s 'test'

    分离会话

    1. Ctrl+b
    2. d # 将当前会话与窗口分离
    3. tmux detach # 将当前会话与窗口分离

    接入会话

    1. tmux attach -t 0 # 使用会话编号
    2. tmux attach -t test # 使用会话名称

    列出所有会话

    1. tmux ls
    2. Ctrl+b
    3. s

    杀死会话

    1. tmux kill-session -t 0 # 使用会话编号
    2. tmux kill-session -t # 使用会话名称

    切换会话

    1. tmux switch -t 0 # 使用会话编号
    2. tmux switch -t # 使用会话名称

    重命名会话

    1. Ctrl+b
    2. $
    3. tmux rename-session -t 0

    历史日志

    ctl+b

    然后按 [

    水平分隔

    tmux split-window -h

    增加回滚缓冲区的大小

    echo "set-option -g history-limit 3000" >> ~/.tmux.conf   # 默认值为2000

    保存指定输出

    1. # 第 3 个会话 1000 行到 6000 行
    2. tmux capture-pane -S -6000 -E -1000 -t 3
    3. tmux save-buffer output.log
    1. # 保存所有历史输出
    2. tmux capture-pane -S -
    3. tmux save-buffer output.log

    发送按键

    1. # 给的 1 号窗格(第二个)发送 ls + 回车
    2. tmux send-keys -t test.1 ls Enter

    网络服务

    AdguardTeam

    一个 DNS 去广告、去跟踪的服务

    项目地址

    安装

    1. mkdir -p /opt/adguard && cd /opt/adguard
    2. wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.105.0-beta.2/AdGuardHome_linux_amd64.tar.gz
    3. tar -xzvf AdGuardHome_linux_amd64.tar.gz
    4. cd AdGuardHome
    5. ./AdGuardHome -s install
    6. systemctl stop firewalld

    其他管理命令

    1. ./AdGuardHome -s uninstall
    2. ./AdGuardHome -s start
    3. ./AdGuardHome -s stop
    4. ./AdGuardHome -s restart
    5. ./AdGuardHome -s status

    无误的话访问服务器 IP:3000 就可以看到管理页面了

    修改密码

    编辑 AdGuardHome.yaml 文件,修改 password 字段,修改的密码需要是 BCrypt 生成的,可以用在线网站实现 https://bcrypt-generator.com/

    1. vim AdGuardHome.yaml
    2. -- password xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    3. ++ password xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    重启服务

    ./AdGuardHome -s restart

    Tips

    配合下列项目获得更好的体验


    butterfly

    基于 websocket 和 tornado 的 web 终端

    项目地址

    安装

    pip install butterfly

    使用

    1. # 走 http,使用系统认证
    2. butterfly.server.py --host=192.168.1.1 --port=57575 --login --unsecure

    访问 IP:57575 , 在 web 页面中 Alt+s 可以切换主题样式


    Cacti

    Cacti 是一套基于 PHP,MySQL,SNMP 及 RRDTool 开发的网络流量监测图形分析工具。它的主要功能是用 snmp 服务获取数据,然后用 rrdtool 储存和更新数据,当用户需要查看数据的时候用 rrdtool 生成图表呈现给用户。

    官网

    什么是 RRDtools

    RRDtool 是指 Round Robin Database 工具(环状数据库)。Round robin 是一种处理定量数据、以及当前元素指针的技术。想象一个周边标有点的圆环--这些点就是时间存储的位置。从圆心画一条到圆周的某个点的箭头--这就是指针。就像我们在一个圆环上一样,没有起点和终点,你可以一直往下走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据集不会增大,并且不需要维护。RRDtool 处理 RRD 数据库。它用向 RRD 数据库存储数据、从 RRD 数据库中提取数据。

    搭建 lamp

    1. yum install -y yum-utils
    2. wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
    3. rpm -ivh mysql80-community-release-el7-1.noarch.rpm
    4. yum-config-manager --disable mysql80-community
    5. yum-config-manager --enable mysql57-community
    6. yum install -y mysql-community-server mysql-community-devel httpd php php-mysql php-gd libjpeg* php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-bcmath php-mhash libxml2-devel libevent-devel curl-devel net-snmp* php-snmp php-fpm
    7. systemctl enable mysqld && systemctl enable httpd

    初始化 mysql

    1. /usr/bin/mysqld -initialize -basedir=/usr/share/mysql -datadir=/var/lib/mysql/data/
    2. # 或
    3. /usr/bin/mysql -initialize -basedir=/usr/share/mysql -datadir=/var/lib/mysql/data/
    4. systemctl start mysqld
    1. vim /etc/my.cnf
    2. # 在末尾添加一行规则
    3. + skip-grant-tables
    1. systemctl restart mysqld
    2. mysql -uroot -p
    3. use mysql;
    4. update user set authentication_string=password('123456') where user='root';
    5. exit

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 123456 这类弱口令

    修改 php.ini 配置文件

    1. vim /etc/php.ini
    2. + date.timezone = "Asia/Shanghai"
    1. systemctl start httpd
    2. echo "" > /var/www/html/phpinfo.php
    3. service firewalld stop

    然后在浏览器上访问 ip/phpinfo.php 能看到 phpinfo 信息就没问题

    安装配置 cacti

    编辑 my.cnf 配置文件

    1. vim /etc/my.cn
    2. + [mysqld]
    3. + character-set-server=utf8mb4
    4. + collation-server=utf8mb4_unicode_ci
    1. systemctl restart mysqld
    2. mysql -uroot -p123456
    3. create database cacti character set utf8 ;
    4. ALTER DATABASE cacti CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    5. exit
    1. vim /etc/my.cnf
    2. # 删除末尾规则
    3. - skip-grant-tables
    1. systemctl restart mysqld
    2. mysql -uroot -p123456
    3. set global validate_password_policy=LOW;
    4. set global validate_password_length=6;
    5. alter user 'root'@'localhost' identified by '123456';
    6. grant all privileges on cacti.* to cacti@localhost identified by '1qaz@WSX';
    7. GRANT SELECT ON mysql.time_zone_name TO cacti@localhost IDENTIFIED BY '1qaz@WSX';
    8. flush privileges ;
    9. mysql_tzinfo_to_sql /usr/share/zoneinfo
    10. exit;
    11. systemctl restart mysqld

    导入 cacti 数据库脚本

    1. cd /usr/local/src/
    2. wget https://www.cacti.net/downloads/cacti-1.2.8.zip
    3. unzip cacti-1.2.8.zip
    4. mysql -uroot -p123456
    5. use cacti ;
    6. source /usr/local/src/cacti-1.2.8/cacti.sql ;
    7. exit
    1. cd /var/www/html
    2. mkdir cacti
    3. cp -r /usr/local/src/cacti-1.2.8/* /var/www/html/cacti
    1. vim /var/www/html/cacti/include/config.php
    2. - $database_type = 'mysql';
    3. - $database_default = 'cacti';
    4. - $database_hostname = 'localhost';
    5. - $database_username = 'cactiuser';
    6. - $database_password = 'cactiuser';
    7. - $database_port = '3306';
    8. - $database_ssl = false;
    9. # 把原来的配置信息修改成以下信息:
    10. + $database_type = 'mysql';
    11. + $database_default = 'cacti';
    12. + $database_hostname = 'localhost';
    13. + $database_username = 'cacti';
    14. + $database_password = '1qaz@WSX';
    15. + $database_port = '3306';
    16. + $database_ssl = false;
    1. useradd -s /sbin/nologin cacti
    2. mkdir /var/www/html/cacti/rra/log
    3. chown -R cacti /var/www/html/cacti/rra/log/

    配置定时任务

    1. crontab -e
    2. + */5 * * * * /usr/bin/php /var/www/html/cacti/poller.php > /dev/null 2>&1
    1. crontab -l # 查看是否写正确
    2. systemctl enable crond
    3. systemctl start crond

    安装其他组件

    1. cd /tmp
    2. wget https://oss.oetiker.ch/rrdtool/pub/rrdtool-1.7.0.tar.gz
    3. wget https://www.cacti.net/downloads/spine/cacti-spine-1.2.1.tar.gz
    4. yum install -y glib2-devel cairo-devel libxml2-devel pango pango-devel help2man

    安装 rrdtool 工具

    1. tar zxvf rrdtool-1.7.0.tar.gz
    2. cd rrdtool-1.7.0
    3. ./configure --prefix=/usr/local/bin/rrdtool
    4. make
    5. make install

    安装 cacti-spine 工具

    1. cd ../
    2. tar zxvf cacti-spine-1.2.1.tar.gz
    3. cd cacti-spine-1.2.1
    4. ./configure --prefix=/usr/local/spine
    5. make
    6. make install
    1. vim /usr/local/spine/etc/spine.conf
    2. + DB_Host localhost
    3. + DB_Database cacti
    4. + DB_User cacti
    5. + DB_Pass 1qaz@WSX
    6. + DB_Port 3306
    1. setenforce 0
    2. cd /var/www/html/cacti/log
    3. ls
    4. # 如果发现没有 cacti.log 文件时,可以执行一下命令:
    5. touch cacti.log
    6. chmod 777 cacti.log
    7. chmod 777 /var/www/html/cacti/resource/snmp_queries/
    8. chmod 777 /var/www/html/cacti/resource/script_server/
    9. chmod 777 /var/www/html/cacti/resource/script_queries/
    10. chmod 777 /var/www/html/cacti/scripts/
    11. chmod 777 /var/www/html/cacti/log/
    12. chmod 777 /var/www/html/cacti/cache/boost/
    13. chmod 777 /var/www/html/cacti/cache/mibcache/
    14. chmod 777 /var/www/html/cacti/cache/realtime/
    15. chmod 777 /var/www/html/cacti/cache/spikekill/

    如果出现 csrf-secret.php not writable

    1. systemctl edit php-fpm.service
    2. + [Service]
    3. + ReadWritePaths = /usr/share/webapps/cacti/include/vendor/csrf
    1. chmod 777 /var/www/html/cacti/include/vendor/csrf
    2. systemctl restart php-fpm.service

    在浏览器访问:http://ip/cacti 默认密码 admin/admin


    Chrony

    一个时间同步软件,可用于搭建类 NTP 时间服务

    官网

    简介

    它由两个程序组成:chronyd 和 chronyc.

    chronyd 是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步.它确定计算机增减时间的比率,并对此进行补偿.

    chronyc 是用来监控 chronyd 性能和配置其参数程序

    安装

    yum install -y chrony

    配置文件

    1. vim /etc/chrony.conf
    2. + server time1.aliyun.com iburst
    3. + server time2.aliyun.com iburst
    4. + server time3.aliyun.com iburst
    5. + server time4.aliyun.com iburst
    6. + server time5.aliyun.com iburst
    7. + server time6.aliyun.com iburst
    8. + server time7.aliyun.com iburst
    9. # 或
    10. + server time1.google.com iburst
    11. + server time2.google.com iburst
    12. + server time3.google.com iburst
    13. + server time4.google.com iburst

    启服务

    1. systemctl stop ntpd
    2. systemctl disable ntpd
    3. systemctl enable chronyd.service
    4. systemctl start chronyd.service

    查看同步状态

    1. chronyc sourcestats # 检查 ntp 源服务器状态
    2. chronyc sources -v # 检查 ntp 详细同步状态
    3. chronyc # 进入交互模式
    4. activity

    clash

    项目地址

    部署

    1. wget https://github.com/Dreamacro/clash/releases/download/v1.11.4/clash-linux-amd64-v1.11.4.gz
    2. gzip -d clash-linux-amd64-v1.11.4.gz
    3. mv clash-linux-amd64-v1.11.4 /usr/local/bin/clash
    4. chmod +x /usr/local/bin/clash
    5. wget https://raw.githubusercontent.com/wp-statistics/GeoLite2-Country/master/GeoLite2-Country.mmdb.gz
    6. gzip -d GeoLite2-Country.mmdb.gz
    7. mv GeoLite2-Country.mmdb ~/.config/clash/Country.mmdb
    8. vim ~/.config/clash/config.yaml

    负载均衡配置

    1. proxy-groups:
    2. - name: "test"
    3. type: load-balance
    4. proxies:
    5. - ss1
    6. - ss2
    7. - vmess1
    8. - vmess2
    9. url: 'http://www.gstatic.com/generate_204'
    10. interval: 300
    11. strategy: round-robin

    辅助项目


    cloud-torrent

    web torrent 下载服务

    项目地址

    安装

    curl https://i.jpillora.com/cloud-torrent! | bash

    运行

    cloud-torrent -o

    code-server

    在线 vscode 服务器

    项目地址

    安装

    1. # debian
    2. wget https://github.com/cdr/code-server/releases/download/v4.5.2/code-server_4.5.2_amd64.deb
    3. dpkg -i code-server_4.5.2_amd64.deb
    4. # centos
    5. wget https://github.com/cdr/code-server/releases/download/v4.5.2/code-server-4.5.2-amd64.rpm
    6. rpm -i code-server-4.5.2-amd64.rpm

    运行

    1. export PASSWORD=123456
    2. code-server --port 8080 --host 0.0.0.0 --auth password

    DHCP

    DHCP 服务程序用于为客户端主机分配可用的 IP 地址

    安装

    yum install -y dhcp

    复制一份示例

    cp /usr/share/doc/dhcp-4*/dhcpd.conf.example /etc/dhcp/dhcpd.conf

    修改配置文件

    1. vim /etc/dhcp/dhcpd.conf
    2. ddns-update-style interim; # 设置 DNS 的动态更新方式为 interim
    3. option domain-name-servers 8.8.8.8; # 指定 DNS 服务器地址
    4. default-lease-time 43200; # 指定默认租约的时间长度,单位为秒
    5. max-lease-time 86400; # 指定最大租约的时间长度
    6. # 以下为某区域的 IP 地址范围
    7. subnet 192.168.1.0 netmask 255.255.255.0 { # 定义 DHCP 作用域
    8. range 192.168.1.20 192.168.1.100; # 指定可分配的 IP 地址范围
    9. option routers 192.168.1.254; # 指定该网段的默认网关
    10. }
    1. dhcpd -t # 检测语法有无错误
    2. service dhcpd start # 开启 dhcp 服务
    3. firewall-cmd --zone=public --add-service=dhcp --permanent
    4. firewall-cmd --reload # 记得防火墙放行
    5. cat /var/lib/dhcpd/dhcpd.leases # 查看租约文件,了解租用情况

    DNS

    DNS 用于将人类可读的域名(例如,www.google.com) 进行域名解析为机器可读的 IP 地址

    安装

    yum install -y bind-*

    主配置文件

    1. vim /etc/named.conf
    2. options {
    3. listen-on port 53 { any; };
    4. listen-on-v6 port 53 { any; };
    5. allow-query { any; };
    6. }

    区域配置文件

    1. vim /etc/named.rfc1912.zones
    2. zone "abc.com" IN {
    3. type master;
    4. file "abc.localhost";
    5. };
    6. zone "1.1.1.in-addr.arpa" IN {
    7. type master;
    8. file "abc.loopback";
    9. };
    10. zone "2.1.1.in-addr.arpa" IN {
    11. type master;
    12. file "www.loopback";
    13. };

    创建区域数据文件

    1. cd /var/named/
    2. cp named.localhost abc.localhost
    3. cp named.loopback abc.loopback
    4. cp named.loopback www.loopback
    5. chown named abc.localhost
    6. chown named abc.loopback
    7. chown named www.loopback

    域名正向反向解析配置文件

    1. vim /var/named/abc.localhost
    2. $TTL 1D
    3. @ IN SOA @ rname.invalid. (
    4. 0 ; serial
    5. 1D ; refresh
    6. 1H ; retry
    7. 1W ; expire
    8. 3H ) ; minimum
    9. NS @
    10. A 127.0.0.1
    11. AAAA ::1
    12. ftp A 1.1.1.1
    13. www A 1.1.2.1
    1. vim /var/named/abc.loopback
    2. $TTL 1D
    3. @ IN SOA @ rname.invalid. (
    4. 0 ; serial
    5. 1D ; refresh
    6. 1H ; retry
    7. 1W ; expire
    8. 3H ) ; minimum
    9. NS @
    10. A 127.0.0.1
    11. AAAA ::1
    12. PTR localhost.
    13. 1 PTR ftp.abc.com.
    1. vim /var/named/www.loopback
    2. $TTL 1D
    3. @ IN SOA @ rname.invalid. (
    4. 0 ; serial
    5. 1D ; refresh
    6. 1H ; retry
    7. 1W ; expire
    8. 3H ) ; minimum
    9. NS @
    10. A 127.0.0.1
    11. AAAA ::1
    12. PTR localhost.
    13. 1 PTR www.abc.com.

    启服务

    1. named-checkconf
    2. named-checkzone abc.com abc.localhost
    3. named-checkzone abc.com abc.loopback
    4. named-checkzone abc.com www.loopback
    5. service named restart
    6. setenforce 0 # 关闭 selinux
    7. firewall-cmd --zone=public --add-service=dns --permanent
    8. firewall-cmd --reload

    更多配置案例

    dns.md


    focalboard

    Focalboard 是一个开源的、自托管的 Trello、concept 和 Asana 的替代品。

    项目地址

    自托管 Mattermost 服务器

    docker run --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview

    启动完毕后访问 127.0.0.1:8065


    frp

    快速反向代理,将本地服务器映射到公网。

    项目地址

    服务端安装

    1. wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
    2. tar -zxvf frp_0.34.3_linux_amd64.tar.gz
    3. cd frp_0.34.3_linux_amd64

    编辑 frps 配置文件

    1. vim frps.ini
    2. [common]
    3. bind_port = 7000
    4. dashboard_port = 7500
    5. dashboard_user = admin
    6. dashboard_pwd = admin

    第1行为 frps 和 frpc 之间端口,第 2 行为监控页面 web 地址,第 3.4 行为监控页面账号密码

    服务端运行

    运行 frps,-c 参数用于指定配置文件,在同级目录下的话可以直接运行 frps

    1. service firewalld stop # 先关闭防火墙
    2. ./frps -c frps.ini

    此时服务器已在运行,可以访问 服务器ip:7500 访问 web 监控界面

    客户端安装

    1. wget https://github.com/fatedier/frp/releases/download/v0.32.0/frp_0.32.0_linux_amd64.tar.gz
    2. tar -zxvf frp_0.32.0_linux_amd64.tar.gz
    3. cd frp_0.32.0_linux_amd64
    4. rm -rf frps*

    这里最后一句是 rm -rf frps* 与服务端操作的最后一句不相同。

    编辑 frpc 配置文件

    1. vim frpc.ini
    2. [common]
    3. server_addr = 1.1.1.1 # 填服务器IP
    4. server_port = 7000 # 填服务器端口
    5. # ssh的配置
    6. [ssh]
    7. type = tcp
    8. local_ip = 127.0.0.1
    9. local_port = 22
    10. remote_port = 10000
    11. use_compression = true
    12. [DSM]
    13. type = tcp
    14. local_ip = 192.168.1.1 # 群晖 NAS 在局域网中的内网 IP
    15. local_port = 5000
    16. remote_port = 10002

    这样就在本地上新增了"DSM"和"SSH"两个可供公网访问的服务了

    客户端运行

    1. ./frpc -c frpc.ini
    2. # -c 参数用于指定配置文件,在同级目录下的话 可以直接运行 .frpc

    SSH 连接测试

    ssh root@1.1.1.1 -p 10000

    这个时候相当于在连接客户端的 SSH 服务


    Kicktart

    是 Kicktart 不是 kickstarter,这玩意不能众筹,这是用于联网安装系统时给 PXE 服务提供应答文件的

    • 调用服务:PXE + TFTP +FTP + DHCP + Kicktart
    • 环境:VMWARE
    • 1台无人值守系统——RHEL 7——192.168.10.10
    • 1台客户端——未安装操作系统

    注:vmware 中做实验需要在虚拟网络编辑器中将 dhcp 服务关闭

    配置 DHCP

    DHCP 服务程序用于为客户端主机分配可用的 IP 地址,而且这是服务器与客户端主机进行文件传输的基础

    yum install -y dhcp
    1. # 这里使用的配置文件有两个主要区别:允许了 BOOTP 引导程序协议,旨在让局域网内暂时没有操作系统的主机也能获取静态 IP 地址;在配置文件的最下面加载了引导驱动文件 pxelinux.0 (这个文件会在下面的步骤中创建) ,其目的是让客户端主机获取到 IP 地址后主动获取引导驱动文件,自行进入下一步的安装过程.
    2. vim /etc/dhcp/dhcpd.conf
    3. allow booting;
    4. allow bootp;
    5. ddns-update-style interim;
    6. ignore client-updates;
    7. subnet 192.168.0.0 netmask 255.255.255.0 {
    8. option subnet-mask 255.255.255.0;
    9. option domain-name-servers 192.168.10.10;
    10. range dynamic-bootp 192.168.10.100 192.168.10.200;
    11. default-lease-time 21600;
    12. max-lease-time 43200;
    13. next-server 192.168.10.10;
    14. filename "pxelinux.0";
    15. }
    1. systemctl restart dhcpd
    2. systemctl enable dhcpd

    配置 TFTP 服务

    配置 TFTP 服务程序,为客户端主机提供引导及驱动文件.当客户端主机有了基本的驱动程序之后,再通过 vsftpd 服务程序将完整的光盘镜像文件传输过去.

    yum install -y tftp-server xinetd
    1. vim /etc/xinetd.d/tftp
    2. service tftp
    3. {
    4. socket_type = dgram
    5. protocol = udp
    6. wait = yes
    7. user = root
    8. server = /usr/sbin/in.tftpd
    9. server_args = -s /var/lib/tftpboot
    10. disable = no
    11. per_source = 11
    12. cps = 100 2
    13. flags = IPv4
    14. }
    1. systemctl restart xinetd
    2. systemctl enable xinetd
    3. firewall-cmd --permanent --add-port=69/udp # 放行 tftp
    4. firewall-cmd --reload

    配置 SYSLinux 服务

    SYSLinux 是一个用于提供引导加载的服务程序.与其说 SYSLinux 是一个服务程序,不如说更需要里面的引导文件,在安装好 SYSLinux 服务程序软件包后, /usr/share/syslinux 目录中会出现很多引导文件.

    1. yum install -y syslinux
    2. # 首先把 SYSLinux 提供的引导文件复制到 TFTP 服务程序的默认目录中,也就是 pxelinux.0,这样客户端主机就能够顺利地获取到引导文件.另外在 RHEL 7 系统光盘镜像中也有一些需要调取的引导文件.
    3. cd /var/lib/tftpboot
    4. cp /usr/share/syslinux/pxelinux.0 .
    5. mkdir /media/cdrom
    6. mount /dev/cdrom /media/cdrom
    7. # 确认光盘镜像已经被挂载到 /media/cdrom 目录后,使用复制命令将光盘镜像中自带的一些引导文件也复制到 TFTP 服务程序的默认目录中.
    8. cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} .
    9. cp /media/cdrom/isolinux/{vesamenu.c32,boot.msg} .
    10. # 在 TFTP 服务程序的目录中新建 pxelinux.cfg 目录,虽然该目录的名字带有后缀,但依然也是目录,而非文件!将系统光盘中的开机选项菜单复制到该目录中,并命名为 default.这个 default 文件就是开机时的选项菜单.
    11. mkdir pxelinux.cfg
    12. cp /media/cdrom/isolinux/isolinux.cfg pxelinux.cfg/default
    1. # 默认的开机菜单中有两个选项,要么是安装系统,要么是对安装介质进行检验.既然我们已经确定采用无人值守的方式安装系统,还需要为每台主机手动选择相应的选项,未免与我们的主旨 (无人值守安装) 相悖.现在我们编辑这个 default 文件,把第 1 行的 default 参数修改为 linux,这样系统在开机时就会默认执行那个名称为 linux 的选项了.对应的 linux 选项大约在 64 行,我们将默认的光盘镜像安装方式修改成 FTP 文件传输方式,并指定好光盘镜像的获取网址以及 Kickstart 应答文件的获取路径
    2. # 修改第 1 行和第 64 行
    3. vim pxelinux.cfg/default
    4. 1 default linux
    5. 64 append initrd=initrd.img inst.stage2=ftp://192.168.10.10 ks=ftp://192.168.10.10/pub/ks.cfg quiet

    配置 VSftpd 服务

    1. yum install -y vsftpd
    2. systemctl restart vsftpd
    3. systemctl enable vsftpd
    4. ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
    5. cp -rvf /media/cdrom/* /var/ftp
    6. firewall-cmd --permanent --add-service=ftp
    7. firewall-cmd --reload
    8. setsebool -P ftpd_connect_all_unreserved=on

    创建 KickStart 应答文件

    1. cp ~/anaconda-ks.cfg /var/ftp/pub/ks.cfg
    2. chmod +r /var/ftp/pub/ks.cfg
    1. # 修改第 7、27、35 行
    2. vim /var/ftp/pub/ks.cfg
    3. url --url=ftp://192.168.0.105
    4. timezone Asia/Shanghai --isUtc
    5. clearpart --all --initlabel
    6. # 如果觉得系统默认自带的应答文件参数较少,不能满足生产环境的需求,则可以通过 Yum 软件仓库来安装 system-config-kickstart 软件包.这是一款图形化的 Kickstart 应答文件生成工具,可以根据自己的需求生成自定义的应答文件,然后将生成的文件放到 /var/ftp/pub 目录中并将名字修改为 ks.cfg 即可.

    Source & Reference


    nps

    、一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。

    项目地址

    服务端安装

    1. mkdir nps
    2. cd nps
    3. wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
    4. tar -zxvf linux_amd64_server.tar.gz
    5. ./nps install
    6. nps start
    7. # 关闭防火墙
    8. systemctl stop firewalld

    访问 ip:8080 ,默认用户名和密码 admin/123

    客户端安装

    在服务器端新增客户端,点击客户端列表前的+号,复制启动命令

    执行启动命令,linux 直接执行即可,windows 将 ./npc 换成 npc.exe 用 cmd 执行

    使用示例


    OpenVPN

    OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包

    官网

    快速安装脚本

    centos 下安装 OpenVPN

    • 前期准备

      1. echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
      2. sysctl -p
      3. service firewalld stop
      4. setenforce 0
      5. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      6. date

      安装 OpenVPN

      1. curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
      2. yum clean all && yum makecache
      3. yum install -y openvpn

      安装 easyrsa

      1. cd /root
      2. wget https://github.com/OpenVPN/easy-rsa/archive/v3.0.7.tar.gz
      3. mv v3.0.7.tar.gz easy-rsa-3.0.7.tar
      4. tar xf easy-rsa-3.0.7.tar
      5. cd easy-rsa-3.0.7/easyrsa3
      6. cp -a vars.example vars
      1. vim vars
      2. # 国家
      3. ++ set_var EASYRSA_REQ_COUNTRY "CN"
      4. # 省
      5. ++ set_var EASYRSA_REQ_PROVINCE "BJ"
      6. # 城市
      7. ++ set_var EASYRSA_REQ_CITY "BeiJing"
      8. # 组织
      9. ++ set_var EASYRSA_REQ_ORG "zhang"
      10. # 邮箱
      11. ++ set_var EASYRSA_REQ_EMAIL "zhang@test.com"
      12. # 拥有者
      13. ++ set_var EASYRSA_REQ_OU "ZJ"
      14. # 长度
      15. ++ set_var EASYRSA_KEY_SIZE 2048
      16. # 算法
      17. ++ set_var EASYRSA_ALGO rsa
      18. # CA证书过期时间,单位天
      19. ++ set_var EASYRSA_CA_EXPIRE 36500
      20. # 签发证书的有效期是多少天,单位天
      21. ++ set_var EASYRSA_CERT_EXPIRE 36500

      初始化与创建CA根证书

      1. ./easyrsa init-pki
      2. ./easyrsa build-ca
      3. # 在这部分需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。
      4. # 还需要输入common name 通用名,如:openvpen,这个你自己随便设置个独一无二的。

      生成服务端证书

      1. ./easyrsa build-server-full server nopass
      2. # 为服务端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中会让你确认ca密码
      3. ./easyrsa gen-dh
      4. # 创建Diffie-Hellman

      生成ta.key

      1. openvpn --genkey --secret ta.key
      2. cp -a pki/ca.crt /etc/openvpn/
      3. cp -a pki/private/server.key /etc/openvpn/
      4. cp -a pki/issued/server.crt /etc/openvpn/
      5. cp -a pki/dh.pem /etc/openvpn/
      6. cp -a ta.key /etc/openvpn/

      制作 Client 端证书

      每一个登录的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接

      1. ./easyrsa gen-req zhangsan nopass
      2. ./easyrsa sign-req client zhangsan

      配置 OpenVPN 服务端

      拷贝 OpenVPN 配置文件

      cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/

      配置服务端的配置文件

      1. vim /etc/openvpn/server.conf
      2. ++ local 0.0.0.0
      3. # 表示openvpn服务端的监听地址
      4. -- proto udp
      5. ++ proto tcp
      6. -- ca ca.crt
      7. -- cert server.crt
      8. -- key server.key
      9. -- dh dh2048.pem
      10. ++ ca /etc/openvpn/ca.crt
      11. ++ cert /etc/openvpn/server.crt
      12. ++ key /etc/openvpn/server.key
      13. ++ dh /etc/openvpn/dh.pem
      14. -- tls-auth ta.key 0
      15. ++ tls-auth /etc/openvpn/ta.key 0
      16. # 服务端第二个参数为0;同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。
      17. ++ compress lz4-v2
      18. ++ push "compress lz4-v2"
      19. # openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。
      20. # Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令
      21. ++ status openvpn-status.log
      22. # 在文件中输出当前的连接信息,每分钟截断并重写一次该文件
      23. -- explicit-exit-notify 1
      24. # 当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用

      开启 openvpn 服务

      1. systemctl start openvpn@server
      2. ss -tnlp

      测试连接

      1. sz /root/easy-rsa-3.0.7/easyrsa3/pki/private/zhangsan.key
      2. sz /root/easy-rsa-3.0.7/easyrsa3/pki/issued/zhangsan.crt
      3. sz /etc/openvpn/ca.crt
      4. sz /etc/openvpn/ta.key
      1. vim zhangsan.ovpn
      2. client
      3. dev tun
      4. proto tcp
      5. remote x.x.x.x 1194
      6. resolv-retry infinite
      7. nobind
      8. ;user nobody
      9. ;group nobody
      10. persist-key
      11. persist-tun
      12. ca ca.crt
      13. cert zhangsan.crt
      14. key zhangsan.key
      15. remote-cert-tls server
      16. tls-auth ta.key 1
      17. cipher AES-256-CBC
      18. compress lz4-v2
      19. verb 3
      20. ;mute 20
      sz zhangsan.ovpn

      管理员身份运行 openvpn.exe

      将指定配置文件放入文件夹,连接

    • docker 搭建 OpenVPN

      docker 安装

      1. systemctl start docker
      2. docker pull kylemanna/openvpn:2.4
      3. mkdir -p /data/openvpn
      4. docker run -v /data/openvpn:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<你的IP>

      生成密钥文件

      1. docker run -v /data/openvpn:/etc/openvpn --rm -it kylemanna/openvpn:2.4 ovpn_initpki
      2. 输入私钥密码 (输入时是看不见的) :
      3. Enter PEM pass phrase:12345678
      4. 再输入一遍
      5. Verifying - Enter PEM pass phrase:12345678
      6. 输入一个 CA 名称 (我这里直接回车)
      7. Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
      8. 输入刚才设置的私钥密码 (输入完成后会再让输入一次)
      9. Enter pass phrase for /etc/openvpn/pki/private/ca.key:12345678

      注意 : 此处只是为了方便演示,生产环境下请不要使用类似 12345678 这类弱口令

      生成客户端证书 (这里的 user 改成你想要的名字)

      1. docker run -v /data/openvpn:/etc/openvpn --rm -it kylemanna/openvpn:2.4 easyrsa build-client-full user nopass
      2. 输入刚才设置的密码
      3. Enter pass phrase for /etc/openvpn/pki/private/ca.key:12345678

      导出客户端配置

      1. mkdir -p /data/openvpn/conf
      2. docker run -v /data/openvpn:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_getclient user > /data/openvpn/conf/user.ovpn

      启动 OpenVPN 服务

      1. docker run --name openvpn -v /data/openvpn:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
      2. service firewalld stop

      将登录的证书下载到本地

      1. yum install -y lrzsz
      2. sz /data/openvpn/conf/whsir.ovpn

      在 openvpn 的安装目录下,有个 config 目录,将服务器上的 user.ovpn,放在该目录下,运行 OpenVPN GUI,右键 whsir 连接 connect

      Source & Reference


    PowerDNS

    一种 DNS 服务器, 优点, 支持 PHP 网页管理, 支持直接在数据库中添加 DNS 地址记录, 比较灵活, 方便

    项目地址

    安装

    以 Ubuntu16.04 为例

    先配置好 mysql

    1. apt -y install mariadb-server mariadb-client
    2. service mariadb start
    3. mysql_secure_installation # 初始化下 Mysql,此时配置密码,这里举例为 123456

    为 PowerDNS 创建一个数据库,并创建一个数据库用户 powerdns,密码 123456

    1. mysql -u root -p
    2. CREATE DATABASE powerdns;
    3. GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY '123456';
    4. GRANT ALL ON powerdns.* TO 'powerdns'@'localhost.localdomain' IDENTIFIED BY '123456';
    5. FLUSH PRIVILEGES;

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 123456 这类弱口令

    创建 PowerDNS 所需的表

    1. CREATE DATABASE IF NOT EXISTS powerdns;
    2. USE powerdns;
    3. CREATE TABLE domains (
    4. id INT AUTO_INCREMENT,
    5. name VARCHAR(255) NOT NULL,
    6. master VARCHAR(128) DEFAULT NULL,
    7. last_check INT DEFAULT NULL,
    8. type VARCHAR(6) NOT NULL,
    9. notified_serial INT DEFAULT NULL,
    10. account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
    11. PRIMARY KEY (id)
    12. ) Engine=InnoDB CHARACTER SET 'latin1';
    13. CREATE UNIQUE INDEX name_index ON domains(name);
    14. CREATE TABLE records (
    15. id BIGINT AUTO_INCREMENT,
    16. domain_id INT DEFAULT NULL,
    17. name VARCHAR(255) DEFAULT NULL,
    18. type VARCHAR(10) DEFAULT NULL,
    19. content VARCHAR(64000) DEFAULT NULL,
    20. ttl INT DEFAULT NULL,
    21. prio INT DEFAULT NULL,
    22. change_date INT DEFAULT NULL,
    23. disabled TINYINT(1) DEFAULT 0,
    24. ordername VARCHAR(255) BINARY DEFAULT NULL,
    25. auth TINYINT(1) DEFAULT 1,
    26. PRIMARY KEY (id)
    27. ) Engine=InnoDB CHARACTER SET 'latin1';
    28. CREATE INDEX nametype_index ON records(name,type);
    29. CREATE INDEX domain_id ON records(domain_id);
    30. CREATE INDEX ordername ON records (ordername);
    31. CREATE TABLE supermasters (
    32. ip VARCHAR(64) NOT NULL,
    33. nameserver VARCHAR(255) NOT NULL,
    34. account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
    35. PRIMARY KEY (ip, nameserver)
    36. ) Engine=InnoDB CHARACTER SET 'latin1';
    37. CREATE TABLE comments (
    38. id INT AUTO_INCREMENT,
    39. domain_id INT NOT NULL,
    40. name VARCHAR(255) NOT NULL,
    41. type VARCHAR(10) NOT NULL,
    42. modified_at INT NOT NULL,
    43. account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
    44. comment TEXT CHARACTER SET 'utf8' NOT NULL,
    45. PRIMARY KEY (id)
    46. ) Engine=InnoDB CHARACTER SET 'latin1';
    47. CREATE INDEX comments_name_type_idx ON comments (name, type);
    48. CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
    49. CREATE TABLE domainmetadata (
    50. id INT AUTO_INCREMENT,
    51. domain_id INT NOT NULL,
    52. kind VARCHAR(32),
    53. content TEXT,
    54. PRIMARY KEY (id)
    55. ) Engine=InnoDB CHARACTER SET 'latin1';
    56. CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
    57. CREATE TABLE cryptokeys (
    58. id INT AUTO_INCREMENT,
    59. domain_id INT NOT NULL,
    60. flags INT NOT NULL,
    61. active BOOL,
    62. content TEXT,
    63. PRIMARY KEY(id)
    64. ) Engine=InnoDB CHARACTER SET 'latin1';
    65. CREATE INDEX domainidindex ON cryptokeys(domain_id);
    66. CREATE TABLE tsigkeys (
    67. id INT AUTO_INCREMENT,
    68. name VARCHAR(255),
    69. algorithm VARCHAR(50),
    70. secret VARCHAR(255),
    71. PRIMARY KEY (id)
    72. ) Engine=InnoDB CHARACTER SET 'latin1';
    73. CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
    74. exit;

    安装 PowerDNS

    apt install -y pdns-recursor pdns-server pdns-backend-mysql

    Ubuntu 18.04 附带 systemd-resolve,你需要禁用它,并删除 resolv.conf 文件,因为它绑定到端口 53 ,这将与 PowerDNS 端口冲突。

    1. systemctl disable systemd-resolved
    2. systemctl stop systemd-resolved
    3. rm /etc/resolv.conf
    1. vim /etc/powerdns/pdns.d/pdns.local.gmysql.conf
    2. launch=gmysql
    3. gmysql-host=localhost
    4. gmysql-dbname=powerdns # 改成之前创建的数据库
    5. gmysql-user=powerdns # 改成之前创建的用户
    6. gmysql-password=123456 # 改成之前创建的密码
    1. sed -i "s|# local-port=.*|local-port=5300|" /etc/powerdns/pdns.conf
    2. sed -i "s|# config-dir=.*|config-dir=/etc/powerdns|" /etc/powerdns/pdns.conf
    3. sed -i "s|# daemon=.*|daemon=yes|" /etc/powerdns/pdns.conf
    4. sed -i "s|# guardian=.*|guardian=yes|" /etc/powerdns/pdns.conf
    5. sed -i "s|# master=.*|master=yes|" /etc/powerdns/pdns.conf
    6. sed -i "s|# max-tcp-connections=.*|max-tcp-connections=20|" /etc/powerdns/pdns.conf
    7. service pdns restart

    此时记得将 /etc/resolv.conf 中的 nameserver 改为 127.0.0.1

    1. cat /etc/resolv.conf
    2. # Generated by NetworkManager
    3. search localdomain
    4. nameserver 127.0.0.1

    测试

    1. dig @127.0.0.1
    2. dig www.baidu.com
    3. pdnsutil create-zone test-zone-1
    4. pdnsutil list-zone test-zone-1
    PowerDNS-Admin

    PowerDNS-Admin 是一个具有以下高级功能的 PowerDNS Web 界面

    项目地址

    安装

    设置数据库

    1. mysql -u root -p
    2. CREATE DATABASE powerdnsadmin;
    3. GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'pdnsadminuser'@'%' IDENTIFIED BY '123456';
    4. FLUSH PRIVILEGES;
    5. quit

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 123456 这类弱口令

    1. # Install Python 3 devevelopment package
    2. apt install -y python3-dev
    3. # Install required packages for building python libraries from requirements.txt file
    4. apt install -y libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential
    5. # Install NodeJs
    6. curl -sL https://deb.nodesource.com/setup_10.x | bash -
    7. apt install -y nodejs
    8. # Install yarn to build asset files
    9. curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
    10. echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list
    11. apt update -y
    12. apt install -y yarn
    13. # Checkout source code and create virtualenv
    14. git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin
    15. cd /opt/web/powerdns-admin
    16. virtualenv -p python3 flask
    17. # Activate your python3 environment and install libraries
    18. source ./flask/bin/activate
    19. pip install -r requirements.txt

    Running PowerDNS-Admin

    1. vim configs/development.py
    2. SQLA_DB_USER = 'powerdns' # 改成之前创建的数据库
    3. SQLA_DB_PASSWORD = '123456' # 改成之前创建的用户
    4. SQLA_DB_HOST = '127.0.0.1' # 改成之前创建的密码
    5. SQLA_DB_NAME = 'powerdns'
    1. export FLASK_CONF=../configs/development.py
    2. export FLASK_APP=powerdnsadmin/__init__.py
    3. flask db upgrade
    4. # generate asset files
    5. yarn install --pure-lockfile
    6. flask assets build
    7. # run PowerDNS-Admin by command
    8. ./run.py

    现在访问 ip:9191

    注: 这对于测试环境很有效,但是对于生产环境,应该使用 gunicorn 或 uwsgi


    proxychains-ng

    通过 DLL 注入,使目标程序走代理

    项目地址

    安装

    1. git clone https://github.com/rofl0r/proxychains-ng.git
    2. cd proxychains-ng
    3. ./configure
    4. make && make install
    5. cp ./src/proxychains.conf /etc/proxychains.conf
    6. cd .. && rm -rf proxychains-ng

    编辑配置

    1. vim /etc/proxychains.conf
    2. socks5 127.0.0.1 1080 # 改成你懂的

    使用

    在需要代理的命令前加上 proxychains4 ,如 : proxychains4 wget https://www.google.com/


    ss5

    Socks5 代理服务器

    centos7

    1. yum -y install gcc gcc-c++ automake make pam-devel openldap-devel cyrus-sasl-devel openssl-devel vim
    2. wget http://jaist.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz
    3. tar -vzx -f ss5-3.8.9-8.tar.gz
    4. cd ss5-3.8.9/
    5. ./configure && make && make install
    6. chmod +x /etc/init.d/ss5
    7. echo "auth 0.0.0.0/0 - u" > /etc/opt/ss5/ss5.conf
    8. echo "permit u 0.0.0.0/0 - 0.0.0.0/0 - - - - -" >> /etc/opt/ss5/ss5.conf
    9. cat /etc/opt/ss5/ss5.conf
    10. # 自定义用户名密码
    11. echo "test1 123456" > /etc/opt/ss5/ss5.passwd
    12. # 自定义端口
    13. echo 'SS5_OPTS=" -u root -b 0.0.0.0:1080"' > /etc/sysconfig/ss5
    14. cd /root
    15. service ss5 start
    16. ss -tnlp
    curl https://ipinfo.io --proxy socks5://test1:123456@ip:port

    一键安装脚本


    SSH

    Secure Shell 是一種加密的網路傳輸協定,可在不安全的網路中為網路服務提供安全的傳輸環境。

    官网

    一般主机安装完毕后 SSH 是默认开启的,使用 /etc/init.d/ssh status 查看主机 SSH 状态

    注: ssh_config 为客户端连接到服务端的配置文件;sshd_config 为服务端的配置。

    Kali/Manjaro

    安装完毕后会自动启动,但是没有配置配置文件会无法登录,修改下配置文件

    1. echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
    2. echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
    1. systemctl start ssh # 启动ssh
    2. systemctl enable ssh # 设置为开机自启
    3. # 或
    4. /etc/init.d/ssh start # 启动ssh
    5. update-rc.d ssh enable # 设置为开机自启

    若在使用工具登录时,当输完用户名密码后提示 SSH 服务器拒绝了密码,就再试一遍.

    这时不要着急,只需要在 Kali 控制端口重新生成两个秘钥即可.

    1. ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
    2. ssh-keygen -t dsa -f /etc/ssh/ssh_host_rsa_key

    Ubuntu

    如果没有就装一下,如果你只是想登录别的机器的 SSH 只需要安装 openssh-client (ubuntu 有默认安装,如果没有则 apt install -y openssh-client) ,如果要使本机开放 SSH 服务就需要安装 openssh-server

    1. apt remove -y openssh-server
    2. apt remove -y ssh
    3. apt install -y openssh-client
    4. apt install -y openssh-server
    5. apt install -y ssh
    1. service ssh restart # 启动ssh
    2. systemctl enable ssh # 设置为开机自启

    配置允许 root 远程登录

    1. echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
    2. echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config

    Debian

    1. apt install -y openssh-client=1:7.9p1-10+deb10u1
    2. apt install -y openssh-server=1:7.9p1-10+deb10u1
    3. apt install -y ssh
    1. service ssh restart
    2. systemctl enable ssh

    配置允许 root 远程登录

    1. echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
    2. echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config

    配置文件

    详细的配置文件内容见 ssh

    加固

    本部分内容移步Secure-Linux SSH 部分

    排错

    1. 先排查是不是客户端(自己)的问题,再排查是不是服务端(对面)的问题,最后在排查是不是传输中(中间)的问题.
    2. ping 试试,如果网络层可通,那么大概率是应用层的问题,检查 SSH 配置,是否有白名单限制,或者你他娘的意大利防火墙或 selinux 就没放行
    3. 假设这么一种情况,应用层配置正常,主机一切正常,但路由器/交换机在 ACL 上禁用了 SSH 的流量,这样就是传输层的问题了.内网 IPS/IDS 阻断同理.
    4. 麻烦你看下账号密码是不是写错了谢谢.或者是不是限制只使用密钥登录的.
    5. 注意下是不是配置文件或服务看错了是 sshd 不是 ssh

    motd

    1. _ooOoo_
    2. o8888888o
    3. 88" . "88
    4. (| -_- |)
    5. O\ = /O
    6. ____/`---'\____
    7. .' \\| |// `.
    8. / \\||| : |||// \
    9. / _||||| -:- |||||- \
    10. | | \\\ - /// | |
    11. | \_| ''\---/'' | |
    12. \ .-\__ `-` ___/-. /
    13. ___`. .' /--.--\ `. . __
    14. ."" '< `.___\_<|>_/___.' >'"".
    15. | | : `- \`.;`\ _ /`;.`/ - ` : | |
    16. \ \ `-. \_ __\ /__ _/ .-` / /
    17. ======`-.____`-.___\_____/___.-`____.-'======
    18. `=---='
    19. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    20. 佛祖保佑 永不死机
    21. 心外无法 法外无心
    1. _ `-._ `-. `. \ : / .' .-' _.-' _
    2. `--._ `-._ `-. `. `. : .' .' .-' _.-' _.--'
    3. `--._ `-._ `-. `. \ : / .' .-' _.-' _.--'
    4. `--.__ `--._ `-._ `-. `. `. : .' .' .-' _.-' _.--' __.--'
    5. __ `--.__ `--._ `-._ `-. `. \:/ .' .-' _.-' _.--' __.--' __
    6. `--..__ `--.__ `--._ `-._`-.`_=_'.-'_.-' _.--' __.--' __..--'
    7. --..__ `--..__ `--.__ `--._`-q(-_-)p-'_.--' __.--' __..--' __..--
    8. ``--..__ `--..__ `--.__ `-'_) (_`-' __.--' __..--' __..--''
    9. ...___ ``--..__ `--..__`--/__/ \--'__..--' __..--'' ___...
    10. ```---...___ ``--..__`_(<_ _/)_'__..--'' ___...---'''
    11. ```-----....._____```---...___(__\_\_|_)/__)___...---'''_____.....-----'''
    1. .-. .-.
    2. .--' / \ '--.
    3. '--. \ _______ / .--'
    4. \ \ .-" "-. / /
    5. \ \ / \ / /
    6. \ / \ /
    7. \| .--. .--. |/
    8. | )/ | | \( |
    9. |/ \__/ \__/ \|
    10. / /^\ \
    11. \__ '=' __/
    12. |\ /|
    13. |\'"VUUUV"'/|
    14. \ `"""""""` /
    15. `-._____.-'
    16. / / \ \
    17. / / \ \
    18. / / \ \
    19. ,-' ( ) `-.
    20. `-'._) (__._.)

    ttyd

    用于在 web 上访问终端

    项目地址

    安装

    1. apt-get install -y cmake g++ pkg-config git vim-common libwebsockets-dev libjson-c-dev libssl-dev
    2. git clone https://github.com/tsl0922/ttyd.git
    3. cd ttyd && mkdir build && cd build
    4. cmake ..
    5. make && make install

    运行

    ttyd -p 8080 bash

    现在访问 http://localhost:8080 即可


    vnc4server

    为主机提供 VNC 服务

    安装

    1. apt-get install -y vnc4server
    2. vncpasswd # 设置vncserver密码
    3. vncserver :1 -geometry 1024x768 -depth 24 # 设置vnc连接时窗口的大小
    4. netstat -tnl | grep 5901 # 查看vnc激活状态

    windows 使用 tightVNC 测试连接,连接地址: IP:5901


    web服务-中间件

    ActiveMQ

    Apache ActiveMQ 是 Apache 软件基金会所研发的开放源代码消息中间件;由于 ActiveMQ 是一个纯 Java 程序,因此只需要操作系统支持 Java 虚拟机,ActiveMQ 便可执行.

    官网

    安装

    安装依赖 JDK

    1. cd /
    2. tar xzf jdk-8u212-linux-x64.tar.gz
    1. vim /etc/profile
    2. export JAVA_HOME=/root/jdk1.8.0_212
    3. export PATH=$PATH:$JAVA_HOME/bin
    1. source /etc/profile
    2. java -version

    下载 activemq 压缩包,这里以 5.14.5 为例

    1. wget http://archive.apache.org/dist/activemq/5.14.5/apache-activemq-5.14.5-bin.tar.gz
    2. tar -zxvf apache-activemq-5.14.5-bin.tar.gz
    3. mv apache-activemq-5.14.5 activemq
    4. cd activemq/bin/
    5. ./activemq start
    6. ps -ef| grep activemq
    1. firewall-cmd --zone=public --add-port=8161/tcp --permanent
    2. firewall-cmd --reload

    访问 127.0.0.1:8161 用户名:admin 密码:admin

    修改用户信息编辑 conf/jetty-realm.properties 即可


    Apache_httpd

    Apache HTTP Server 是 Apache 軟體基金會的一個開放原始碼的網頁伺服器軟體,可以在大多數電腦作業系統中運行。由於其跨平台和安全性,被廣泛使用,是最流行的 Web 伺服器軟體之一。

    官网

    安装

    1. yum install -y httpd
    2. yum install -y mod_ssl openssl

    简单配置

    1. vim /etc/httpd/conf/httpd.conf
    2. DocumentRoot "/var/www/html"
    3. ServerName xx.xx.xx.xx:80
    4. # 设置 Web 服务器的主机名和监听端口

    启服务

    1. vim /var/www/html/index.html
    2. Hello World!
    1. service httpd restart
    2. firewall-cmd --zone=public --add-service=http --permanent
    3. firewall-cmd --reload

    此时可以访问 ip/index.html

    虚拟主机

    配置虚拟主机文件

    1. cp /usr/share/doc/httpd-*/httpd-vhosts.conf /etc/httpd/conf.d/virthost.conf
    2. vim /etc/httpd/conf.d/virthost.conf
    3. ServerName www.abc.com
    4. # 设置 Web 服务器的主机名和监听端口
    5. DocumentRoot "/data/web_data"
    6. Require all granted
    7. Listen 192.168.1XX.33:443
    8. ServerName www.abc.com
    9. # 设置 Web 服务器的主机名和监听端口
    10. DocumentRoot "/data/web_data"
    11. SSLEngine on
    12. SSLCertificateFile /etc/httpd/ssl/httpd.crt
    13. SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
    14. Require all granted
    1. mkdir -p /data/web_data
    2. echo 'Hello World!' >/data/web_data/index.html
    3. service httpd restart
    4. firewall-cmd --zone=public --add-service=http --permanent
    5. firewall-cmd --reload

    更多配置案例

    httpd.md


    Caddy

    Caddy 伺服器是一個開源的,使用 Golang 編寫,支持 HTTP/2 的 Web 服務端。

    注 : 在新版 caddy 中以下配置已经不兼容了,请参考官方文档 https://caddyserver.com/docs/getting-started

    官网

    安装 Caddy

    1. # Debian, Ubuntu, Raspbian
    2. sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    3. curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
    4. curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
    5. sudo apt update
    6. sudo apt install caddy
    7. # Fedora, RedHat, CentOS
    8. dnf install 'dnf-command(copr)'
    9. dnf copr enable @caddy/caddy
    10. dnf install caddy
    11. # RHEL/CentOS 7:
    12. yum install yum-plugin-copr
    13. yum copr enable @caddy/caddy
    14. yum install caddy

    启动测试

    1. caddy run
    2. curl localhost:2019/config/ | jq .

    配置文件

    1. chown -R root:www-data /usr/local/bin # 设置目录数据权限
    2. touch /usr/local/caddy/Caddyfile
    3. echo -e ":80 {
    4. gzip
    5. root /usr/local/caddy/www/
    6. }" > /usr/local/caddy/Caddyfile
    7. mkdir /usr/local/caddy/www
    8. echo "

      first

      "
      >> /usr/local/caddy/www/index.html
    9. /etc/init.d/caddy start
    10. # 如果启动失败可以看 Caddy 日志: tail -f /tmp/caddy.log

    反向代理

    做一个 ip 跳转

    1. echo ":80 {
    2. gzip
    3. proxy / http://www.baidu.com
    4. }" > /usr/local/caddy/Caddyfile
    5. /etc/init.d/caddy start

    HTTPS

    为已经绑定域名的服务器自动从 Let’s Encrypt 生成和下载 HTTPS 证书,支持 HTTPS 协议访问,你只需要将绑定的 IP 换成 域名 即可

    1. echo -e "xxx.com {
    2. gzip
    3. root /usr/local/bin/www
    4. tls xxxx@xxx.com #你的邮箱
    5. }" > /usr/local/caddy/Caddyfile
    6. /etc/init.d/caddy start

    npm&Node

    npm 是 Node.js 預設的、以 JavaScript 編寫的軟體套件管理系統。

    Node.js 是能夠在伺服器端運行 JavaScript 的開放原始碼、跨平台 JavaScript 執行環境。

    官网

    包管理器方式

    • apt

      1. curl -sL https://deb.nodesource.com/setup_10.x | bash - # 添加 Node.js PPA
      2. apt-get install -y nodejs npm
    • yum

      1. yum install -y epel-release
      2. yum install -y nodejs npm

    源文件方式安装

    首先下载 NodeJS 的二进制文件,http://nodejs.org/download/ .在 Linux Binaries (.tar.gz) 行处根据自己系统的位数选择

    1. # 解压到当前文件夹下运行
    2. tar xvJf node-v12.17.0-linux-x64.tar
    3. 进入解压后的目录 bin 目录下,执行 ls 会看到两个文件 node,npm. 然后执行 ./node -v ,如果显示出 版本号说明我们下载的程序包是没有问题的.依次运行如下三条命令
    4. cd node-v12.17.0-linux-x64/bin
    5. ls
    6. ./node -v

    因为 /home/node-v12.17.0-linux-x64/bin 这个目录是不在环境变量中的,所以只能到该目录下才能 node 的程序.如果在其他的目录下执行 node 命令的话 ,必须通过绝对路径访问才可以的

    如果要在任意目录可以访问的话,需要将 node 所在的目录,添加 PATH 环境变量里面,或者通过软连接的形式将 node 和 npm 链接到系统默认的 PATH 目录下的一个
    在终端执行 echo $PATH 可以获取 PATH 变量包含的内容,系统默认的 PATH 环境变量包括 /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin: ,冒号为分隔符.所以我们可以将 node 和 npm 链接到 /usr/local/bin 目录下如下执行

    1. ln -s /home/node-v12.17.0-linux-x64/bin/node /usr/local/bin/node
    2. ln -s /home/node-v12.17.0-linux-x64/bin/npm /usr/local/bin/npm

    加速

    强制安装

    npm install --unsafe-perm=true --allow-root

    模块安装和卸载

    1. # 安装
    2. npm i -g [xxx模块]
    3. # clone 到本地安装
    4. git clone https://github.com/xxx/[xxx模块]
    5. cd [xxx模块]
    6. npm i -g
    7. # 卸载
    8. npm uninstall [xxx模块]

    forever

    forever 是一个简单的命令式 nodejs 的守护进程,能够启动,停止,重启 App 应用。forever 完全基于命令行操作,在forever进程之下,创建 node 的子进程,通过 monitor 监控 node 子进程的运行情况,一旦文件更新或进程挂掉,forever 会自动重启 node 服务器,确保应用正常运行。

    1. npm install forever -g # 全局安装
    2. forever start app.js # 启动
    3. forever stop app.js # 关闭
    4. forever start -l forever.log -o out.log -e err.log app.js # 输出日志和错误
    5. forever -w app.js # 自动监控文件变化,文件修改保存之后自动重启app.js
    6. forever -h # 查看帮助

    Nexus

    Nexus 是一种 Maven 仓库管理软件用于搭建私服,私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

    官网

    安装

    • JDK

      tar xzf jdk-8u212-linux-x64.tar.gz
      1. vim /etc/profile
      2. export JAVA_HOME=/root/jdk1.8.0_212
      3. export PATH=$PATH:$JAVA_HOME/bin
      1. source /etc/profile
      2. java -version
    • Maven

      tar xzf apache-maven-3.6.2-bin.tar.gz
      1. vim /etc/profile
      2. export MAVEN_HOME=/root/apache-maven-3.6.2
      3. export PATH=$PATH:$MAVEN_HOME/bin
      1. source /etc/profile
      2. mvn -version
    • Nexus

      1. tar -xf nexus-2.14.14-01-bundle.tar.gz -C /usr/local
      2. cd /usr/local/nexus-2.14.14-01/bin/
      3. export RUN_AS_USER=root
      4. ./nexus start
      5. firewall-cmd --add-port=8081/tcp --permanent
      6. firewall-cmd --reload
      curl http://127.0.0.1:8081/nexus/

      默认登录账号/密码为: admin/admin123


    Nginx

    Nginx 是非同步框架的網頁伺服器,也可以用作反向代理、負載平衡器和 HTTP 缓存。

    官网

    安装

    • yum 安装

      1. yum install -y nginx
      2. systemctl start nginx.service
    • Debian & Ubuntu 安装

      1. apt update
      2. apt-get -y install nginx
    • 源代码编译安装

      自己下载好包 https://nginx.org/en/download.html ,传到服务器上,这里以 1.16.1 举例

      1. wget https://nginx.org/download/nginx-1.16.1.tar.gz
      2. tar -zxvf nginx-1.16.1.tar.gz
      3. cd nginx-1.16.1/
      4. ./configure
      5. make
      6. make install
      7. cd /usr/local/nginx/sbin
      8. ./nginx

      注:源代码安装你的默认目录在 /usr/local/nginx 下,配置文件在 conf/ 中,不要搞错了

    虚拟主机

    在 /etc/nginx/conf.d/ 目录下新建一个站点的配置文件,列如:test.com.conf

    1. vim /etc/nginx/conf.d/test.com.conf
    2. server {
    3. listen 80;
    4. server_name www.test.com test.com;
    5. root /usr/share/nginx/test.com;
    6. index index.html;
    7. location / {
    8. }
    9. }

    nginx -t 检测文件是否有误

    1. mkdir /usr/share/nginx/test.com
    2. echo "hello world!" > /usr/share/nginx/test.com/index.html
    3. firewall-cmd --permanent --zone=public --add-service=http
    4. firewall-cmd --reload
    5. systemctl start nginx.service

    如果服务器网址没有注册,那么可以在本机电脑的 /etc/hosts 添加设置: 192.168.1.112 www.test.com test.com

    本地 curl 访问测试 curl www.test.com

    查看报错

    less /var/log/nginx/error.log

    更多配置案例

    Nginx.md


    php-cli

    交互式 shell

    1. php -a
    2. php > echo "hello";
    3. hello
    4. php > $x = 3;
    5. php > $y = 2;
    6. php > echo ($x + $y);

    运行 PHP 文件

    php -f test.php

    运行 web 服务器

    php -S 0.0.0.0:8080

    phpMyAdmin

    官网

    建议搭配上面的 nginx+php 扩展笔记

    创建数据库和一个用户

    1. yum install -y mariadb mariadb-server
    2. systemctl start mariadb
    3. systemctl enable mariadb
    4. mysql_secure_installation
    5. mysql -u root -p
    6. # 创建一个专给 WordPress 存数据的数据库
    7. MariaDB [(none)]> create database f8x_info; # 最后的"f8x_info"为数据库名
    8. # 创建用于 WordPress 对应用户
    9. MariaDB [(none)]> create user f8x@localhost identified by 'password'; # "f8x"对应创建的用户,"password"内填写用户的密码
    10. # 分别配置本地登录和远程登录权限
    11. MariaDB [(none)]> grant all privileges on f8x_info.* to f8x@'localhost' identified by 'password';
    12. MariaDB [(none)]> grant all privileges on f8x_info.* to f8x@'%' identified by 'password';
    13. # 刷新权限
    14. MariaDB [(none)]> flush privileges;
    15. exit;

    下载

    1. wget https://files.phpmyadmin.net/phpMyAdmin/4.8.5/phpMyAdmin-4.8.5-all-languages.zip
    2. unzip phpMyAdmin-4.8.5-all-languages.zip
    3. mv phpMyAdmin-4.8.5-all-languages phpMyAdmin
    4. cp phpMyAdmin /usr/share/nginx/test.com/
    5. cd /usr/share/nginx/test.com/phpMyAdmin
    6. cp config.sample.inc.php config.inc.php
    7. systemctl restart nginx

    访问 https://www.test.com/phpMyAdmin/index.php


    RabbitMQ

    RabbitMQ 是流行的开源消息队列系统,是 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)的标准实现,用 erlang 语言开发.RabbitMQ 据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用.

    官网

    安装

    必须要有 Erlang 环境支持,下载 erlang 软件包,这里以 erlang-19.0.4 为例

    1. wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64.rpm
    2. rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm

    安装完后输入 erl 测试

    安装 rabbitmq,这里以 v3.6.10 为例

    1. yum install -y socat
    2. wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
    3. rpm -ivh rabbitmq-server-3.6.10-1.el7.noarch.rpm

    注意:如果是重装请记得删除 /var/lib/rabbitmq 目录和 /etc/rabbitmq 目录,否则可能服务会起不来

    1. systemctl start rabbitmq-server
    2. rabbitmq-server -detached # 启动rabbitmq,-detached 代表后台守护进程方式启动
    3. rabbitmqctl status

    配置网页插件

    1. # 首先创建目录,否则可能报错:
    2. mkdir /etc/rabbitmq
    3. # 然后启用插件:
    4. rabbitmq-plugins enable rabbitmq_management
    5. # 配置防火墙
    6. firewall-cmd --permanent --add-port=15672/tcp
    7. firewall-cmd --permanent --add-port=5672/tcp
    8. firewall-cmd --reload

    访问: 127.0.0.1:15672,这个时候是没有账号密码的!

    配置 web 端访问账号密码和权限

    默认网页是不允许访问的,需要增加一个用户修改一下权限,代码如下:

    1. # 添加用户,后面两个参数分别是用户名和密码
    2. rabbitmqctl add_user [账号] [密码]
    3. rabbitmqctl set_permissions -p / [账号] ".*" ".*" ".*" # 添加权限
    4. rabbitmqctl set_user_tags [账号] administrator # 修改用户角色

    开启用户远程访问

    默认情况下,RabbitMQ 的默认的 guest 用户只允许本机访问, 如果想让 guest 用户能够远程访问的话,只需要将配置文件中的 loopback_users 列表置为空即可,
    如下:

    {loopback_users, []}

    另外关于新添加的用户,直接就可以从远程访问的,如果想让新添加的用户只能本地访问,可以将用户名添加到上面的列表, 如只允许 admin 用户本机访问.

    {loopback_users, ["admin"]}

    searx

    尊重隐私,可控的元搜索引擎.

    项目地址

    安装搭建

    注:本次在 Debian/Ubuntu 下搭建,centos 下基本一致,请参考 官方教程

    加源,安装依赖

    1. add-apt-repository universe
    2. apt-get update
    3. sudo -H apt-get install -y \
    4. python3-dev python3-babel python3-venv \
    5. uwsgi uwsgi-plugin-python3 \
    6. git build-essential libxslt-dev zlib1g-dev libffi-dev libssl-dev \
    7. shellcheck

    安装 searx

    1. cd /usr/local
    2. git clone https://github.com/asciimoo/searx.git
    3. useradd searx -d /usr/local/searx
    4. chown searx:searx -R /usr/local/searx

    测试 python 虚拟环境

    1. sudo -u searx -i
    2. cd /usr/local/searx
    3. virtualenv searx-ve
    4. . ./searx-ve/bin/activate
    5. ./manage.sh update_packages

    一些安全性配置

    1. sed -i -e "s/ultrasecretkey/`openssl rand -hex 16`/g" searx/settings.yml
    2. sed -i -e "s/debug : True/debug : False/g" searx/settings.yml
    apt-get install -y uwsgi uwsgi-plugin-python
    1. vim /etc/uwsgi/apps-available/searx.ini
    2. [uwsgi]
    3. # Who will run the code
    4. uid = searx
    5. gid = searx
    6. # disable logging for privacy
    7. disable-logging = true
    8. # Number of workers (usually CPU count)
    9. workers = 4
    10. # The right granted on the created socket
    11. chmod-socket = 666
    12. # Plugin to use and interpretor config
    13. single-interpreter = true
    14. master = true
    15. plugin = python
    16. lazy-apps = true
    17. enable-threads = true
    18. # Module to import
    19. module = searx.webapp
    20. # Virtualenv and python path
    21. virtualenv = /usr/local/searx/searx-ve/
    22. pythonpath = /usr/local/searx/
    23. chdir = /usr/local/searx/searx/
    1. cd /etc/uwsgi/apps-enabled
    2. ln -s ../apps-available/searx.ini
    3. /etc/init.d/uwsgi restart

    配置 nginx 代理

    apt-get install -y nginx
    1. vim /etc/nginx/sites-available/searx
    2. server {
    3. listen 80;
    4. server_name www.你的域名.com;
    5. root /usr/local/searx;
    6. location / {
    7. include uwsgi_params;
    8. uwsgi_pass unix:/run/uwsgi/app/searx/socket;
    9. }
    10. }
    1. ln -s /etc/nginx/sites-available/searx /etc/nginx/sites-enabled/searx
    2. service nginx restart
    3. service uwsgi restart

    现在访问 www.你的域名.com 查看你的搜索引擎服务把~

    Tips

    搜索引擎设置在 settings_et_dev.yml 文件中

    建议删除或不使用的搜索接口(由于对请求速度的影响实在太大,并且经常抽风报错)

    • archive is
    • wikipedia
    • wikidata
    • faroo
    • library genesis
    • reddit
    • startpage
    • mymemory translated

    搜索结果定向,不适合日常使用

    • etymonline
    • gigablast
    • duden
    • seznam
    • erowid

    Tomcat

    Tomcat 类似与一个 apache 的扩展型,属于 apache 软件基金会的核心项目,属于开源的轻量级 Web 应用服务器,是开发和调试 JSP 程序的首选,主要针对 Jave 语言开发的网页代码进行解析,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常做为一个 Servlet 和 JSP 容器单独运行在后端.可以这样认为,当配置正确时,Apache 为 HTML 页面服务,而 Tomcat 实际上运行 JSP 页面和 Servlet.比如 apache 可以通过 cgi 接口直接调取 Tomcat 中的程序.

    官网

    Tomcat 角色划分

    • manager-gui:允许访问 Manager APP 页面和 Server Status
    • manager-script:允许访问纯文本接口和 Server Status
    • manager-jmx:允许访问 JMX 代理接口和 Server Status
    • manager-status:仅允许访问 Server Status 页面(即 URL 路径为 /manager/status/*)
    • admin-gui: 允许访问 Host Manager,GUI 界面(即 URL 路径为 /host-manager/html)
    • admin-script:允许访问 Host Manager,文本接口,(即 URL 路径为 /host-manager/text)

    Tomcat manager 接口

    • Server Status : 查看服务器状态,包括中间件及操作系统相关信息
    • Manager App : 管理服务器上部署的应用(Application),如将 WAR file 文件部署到 tomcat 中,还可以启用或停止项目
    • Host Manager : 管理物理主机和虚拟主机,可增加、删除虚拟主机,默认未安装,要访问 host manager 需要在安装页面勾选

    部分文件介绍

    • context.xml:Tomcat 默认的数据源在这里配置,一般存放连接数据库的信息;
    • server.xml:Tomcat 访问端口、域名绑定和数据源在这里配置;
    • web.xml:Tomcat 项目初始化会去调用的文件;

    安装

    Tomcat 依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK

    JDK 安装过程 见 如下

    下载 Tomcat 安装包 https://tomcat.apache.org/download-80.cgi 将安装包上传至服务器,我这里以 8.5.46 为例

    1. tar -zvxf apache-tomcat-8.5.46.tar.gz
    2. cd apache-tomcat-8.5.46
    3. cd bin
    4. ./startup.sh

    如果访问 http://ip:8080/ 失败,查看防火墙开放端口

    1. firewall-cmd --permanent --zone=public --add-port=8080/tcp
    2. firewall-cmd --reload

    设置 tomcat 的服务器启动和关闭

    1. vim /etc/rc.d/init.d/tomcat
    2. #!/bin/bash
    3. # /etc/rc.d/init.d/tomcat
    4. # init script for tomcat precesses
    5. # processname: tomcat
    6. # description: tomcat is a j2se server
    7. # chkconfig: 2345 86 16
    8. # description: Start up the Tomcat servlet engine.
    9. if [ -f /etc/init.d/functions ]; then
    10. . /etc/init.d/functions
    11. elif [ -f /etc/rc.d/init.d/functions ]; then
    12. . /etc/rc.d/init.d/functions
    13. else
    14. echo -e "\atomcat: unable to locate functions lib. Cannot continue."
    15. exit -1
    16. fi
    17. RETVAL=$?
    18. CATALINA_HOME="/usr/local/root/tomcat" # tomcat 安装目录,你安装在什么目录下就复制什么目录
    19. case "$1" in
    20. start)
    21. if [ -f $CATALINA_HOME/bin/startup.sh ];
    22. then
    23. echo $"Starting Tomcat"
    24. $CATALINA_HOME/bin/startup.sh
    25. fi
    26. ;;
    27. stop)
    28. if [ -f $CATALINA_HOME/bin/shutdown.sh ];
    29. then
    30. echo $"Stopping Tomcat"
    31. $CATALINA_HOME/bin/shutdown.sh
    32. fi
    33. ;;
    34. *)
    35. echo $"Usage: $0 {start|stop}"
    36. exit 1
    37. ;;
    38. esac
    39. exit $RETVAL
    1. chmod 755 /etc/rc.d/init.d/tomcat
    2. chkconfig --add /etc/rc.d/init.d/tomcat

    以上所有工作顺利进行并且没有报错,则配置完成,你可以输入命令 service tomcat startservice tomcat stop 进行验证

    修改端口号

    进入 tomcat 的 conf 目录下,修改 server.xml 文件,可以修改端口,默认 8080

    设置用户名和密码登录

    修改 conf 目录下 tomcat-users.xml (部分版本是 tomcat-user.xml)

    1. service tomcat stop
    2. service tomcat start

    如果爆 403 错误,就注释掉 Tomcat/webapps/manager/META-INF/context.xml 文件中内容

    自行重启服务

    发布测试

    tomcat 默认的发布 web 项目的目录是:webapps

    将导出的 war 包直接上传到 webapps 根目录下,随着 tomcat 的启动,war 包可以自动被解析.

    然后调用路径查询是否安装成功

    隐藏 tomcat 版本号

    需要反编译后修改 catalina.jar

    cd lib

    使用 unzip catalina.jar 解压jar包

    进入org/apache/catalina/util 编辑配置文件ServerInfo.properties

    1. cd org/apache/catalina/util
    2. vim ServerInfo.properties

    修改以下几个配置项

    1. server.info=Apache Tomcat
    2. server.number=0.0.0.0
    3. server.built=Mar 9 2099 00:00:00 UTC

    将修改后的信息压缩回jar包

    1. cd ../../../../
    2. jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

    重启Tomcat


    Wordpress

    WordPress 是一个开源的内容管理系统(CMS),允许用户构建动态网站和博客.

    官网

    安装

    下载 WordPress 安装包并解压

    1. wget https://wordpress.org/latest.tar.gz
    2. tar -xzvf latest.tar.gz

    创建 WordPress 数据库和一个用户

    1. yum install -y mariadb mariadb-server
    2. systemctl start mariadb
    3. systemctl enable mariadb
    4. mysql_secure_installation
    5. mysql -u root -p
    6. # 创建一个专给 WordPress 存数据的数据库
    7. MariaDB [(none)]> create database f8x_info; # 最后的"f8x_info"为数据库名
    8. # 创建用于 WordPress 对应用户
    9. MariaDB [(none)]> create user f8x@localhost identified by 'password'; # "f8x"对应创建的用户,"password"内填写用户的密码
    10. # 分别配置本地登录和远程登录权限
    11. MariaDB [(none)]> grant all privileges on f8x_info.* to f8x@'localhost' identified by 'password';
    12. MariaDB [(none)]> grant all privileges on f8x_info.* to f8x@'%' identified by 'password';
    13. # 刷新权限
    14. MariaDB [(none)]> flush privileges;

    配置 PHP

    1. # 安装 PHP 源
    2. rpm -ivh https://mirror.webtatic.com/yum/el7/epel-release.rpm
    3. rpm -ivh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    4. # 安装 PHP7.0
    5. yum install -y php70w
    6. yum install -y php70w-mysql
    7. yum install -y httpd
    8. # 重启 Apache
    9. systemctl restart httpd
    10. # 查看 PHP 版本
    11. php -v

    设置 wp-config.php 文件

    1. cd wordpress
    2. vim wp-config-sample.php

    在标有 // ** MySQL settings - You can get this info from your web host ** // 下输入你的数据库相关信息

    1. DB_NAME
    2. 在第二步中为 WordPress 创建的数据库名称
    3. DB_USER
    4. 在第二步中创建的 WordPress 用户名
    5. DB_PASSWORD
    6. 第二步中为 WordPress 用户名设定的密码
    7. DB_HOST
    8. 第二步中设定的 hostname (通常是 localhost,但总有例外;参见编辑wp-config.php 文件中的"可能的 DB_HOST 值) .
    9. DB_CHARSET
    10. 数据库字符串,通常不可更改.
    11. DB_COLLATE
    12. 留为空白的数据库排序.

    在标有 * Authentication Unique Keys. 的版块下输入密钥的值,保存 wp-config.php 文件,也可以不管这个

    上传文件

    接下来需要决定将博客放在网站的什么位置上:

    根目录

    如果需要将文件上传到 web 服务器,可用 FTP 客户端将 wordpress 目录下所有内容 (无需上传目录本身) 上传至网站根目录

    如果文件已经在 web 服务器中且希望通过 shell 访问来安装 wordpress,可将 wordpress 目录下所有内容 (无需转移目录本身) 转移到网站根目录

    子目录

    如果需要将文件上传到 web 服务器,需将 wordpress 目录重命名,之后用 FTP 客户端将重命名后的目录上传到网站根目录下某一位置

    如果文件已经在 web 服务器中且希望通过shell访问来安装 wordpress,可将 wordpress 目录转移到网站根目录下某一位置,之后重命名 wordpress 目录

    1. mv wordpress/* /var/www/html
    2. setenforce 0 # 关闭 selinux
    3. service httpd start
    4. service firewalld stop

    运行安装脚本


    Mijisou

    基于开源项目 Searx 二次开发的操作引擎

    2019-11-17:不在推荐该开源项目,建议直接使用源项目 searx

    项目地址

    依赖

    自行安装 python3 pip redis

    安装

    1. systemctl start redis
    2. systemctl enable redis
    3. git clone https://github.com/entropage/mijisou.git
    4. cd mijisou && pip install -r requirements.txt

    配置

    1. vim searx/settings_et_dev.yml
    2. general:
    3. debug : False # Debug mode, only for development
    4. instance_name : "123搜索" # displayed name
    5. search:
    6. safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
    7. autocomplete : "" # Existing autocomplete backends: "baidu", "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default
    8. language : "zh-CN"
    9. ban_time_on_fail : 5 # ban time in seconds after engine errors
    10. max_ban_time_on_fail : 120 # max ban time in seconds after engine errors
    11. server:
    12. port : 8888
    13. bind_address : "0.0.0.0" # address to listen on
    14. secret_key : "123" # change this!
    15. base_url : False # Set custom base_url. Possible values: False or "https://your.custom.host/location/"
    16. image_proxy : False # Proxying image results through searx
    17. http_protocol_version : "1.0" # 1.0 and 1.1 are supported
    18. cache:
    19. cache_server : "127.0.0.1" # redis cache server ip address
    20. cache_port : 6379 # redis cache server port
    21. cache_time : 30 # cache 30 s
    22. cache_type : "redis" # cache type
    23. cache_db : 0 # we use db 0 in dev env
    24. ui:
    25. static_path : "" # Custom static path - leave it blank if you didn't change
    26. templates_path : "" # Custom templates path - leave it blank if you didn't change
    27. default_theme : entropage # ui theme
    28. default_locale : "" # Default interface locale - leave blank to detect from browser information or use codes from the 'locales' config section
    29. theme_args :
    30. oscar_style : logicodev # default style of oscar
    31. # searx supports result proxification using an external service: https://github.com/asciimoo/morty
    32. # uncomment below section if you have running morty proxy
    33. result_proxy:
    34. url : "" #morty proxy service
    35. key : Your_result_proxy_key
    36. server_name : ""
    37. outgoing: # communication with search engines
    38. request_timeout : 2.0 # seconds
    39. useragent_suffix : "" # suffix of searx_useragent, could contain informations like an email address to the administrator
    40. pool_connections : 100 # Number of different hosts
    41. pool_maxsize : 10 # Number of simultaneous requests by host
    42. # uncomment below section if you want to use a proxy
    43. # see http://docs.python-requests.org/en/latest/user/advanced/#proxies
    44. # SOCKS proxies are also supported: see http://docs.python-requests.org/en/master/user/advanced/#socks
    45. # proxies :
    46. # http : http://192.168.199.5:24000
    47. # http : http://192.168.199.5:3128
    48. # https: http://127.0.0.1:8080
    49. # uncomment below section only if you have more than one network interface
    50. # which can be the source of outgoing search requests
    51. # source_ips:
    52. # - 1.1.1.1
    53. # - 1.1.1.2
    54. haipproxy_redis:
    55. #host: 192.168.199.5
    56. #port: 6379
    57. #password: kckdkkdkdkddk
    58. #db: 0
    59. engines:
    60. - name : duckduckgo
    61. engine : duckduckgo
    62. shortcut : ddg
    63. - name : duckduckgo images
    64. engine : duckduckgo_images
    65. shortcut : ddi
    66. - name : twitter
    67. engine : twitter
    68. shortcut : tw
    69. - name : mojeek
    70. shortcut: mjk
    71. engine: xpath
    72. paging : True
    73. search_url : https://www.mojeek.com/search?q={query}&s={pageno}
    74. results_xpath: /html/body//div[@class="results"]/ul[@class="results-standard"]/li
    75. url_xpath : ./h2/a/@href
    76. title_xpath : ./h2
    77. content_xpath : ./p[@class="s"]
    78. suggestion_xpath : /html/body//div[@class="top-info"]/p[@class="top-info spell"]/a
    79. first_page_num : 1
    80. page_size : 10
    81. - name : torrentz
    82. engine : torrentz
    83. shortcut : tor
    84. url: https://torrentz2.eu/
    85. timeout : 3.0
    86. - name : startpage
    87. engine : startpage
    88. shortcut : sp
    89. timeout : 6.0
    90. - name : baidu
    91. engine : baidu
    92. shortcut : bd
    93. - name : baidu images
    94. engine : baidu_images
    95. shortcut : bdi
    96. - name : baidu videos
    97. engine : baidu_videos
    98. shortcut : bdv
    99. - name : sogou images
    100. engine : sogou_images
    101. shortcut : sgi
    102. - name : sogou videos
    103. engine : sogou_videos
    104. shortcut : sgv
    105. - name : 360 images
    106. engine : so_images
    107. shortcut : 360i
    108. - name : bing
    109. engine : bing
    110. shortcut : bi
    111. - name : bing images
    112. engine : bing_images
    113. shortcut : bii
    114. - name : bing videos
    115. engine : bing_videos
    116. shortcut : biv
    117. - name : bitbucket
    118. engine : xpath
    119. paging : True
    120. search_url : https://bitbucket.org/repo/all/{pageno}?name={query}
    121. url_xpath : //article[@class="repo-summary"]//a[@class="repo-link"]/@href
    122. title_xpath : //article[@class="repo-summary"]//a[@class="repo-link"]
    123. content_xpath : //article[@class="repo-summary"]/p
    124. categories : it
    125. timeout : 4.0
    126. shortcut : bb
    127. - name : free software directory
    128. engine : mediawiki
    129. shortcut : fsd
    130. categories : it
    131. base_url : https://directory.fsf.org/
    132. number_of_results : 5
    133. search_type : title
    134. timeout : 5.0
    135. - name : gentoo
    136. engine : gentoo
    137. shortcut : ge
    138. - name : gitlab
    139. engine : json_engine
    140. paging : True
    141. search_url : https://gitlab.com/api/v4/projects?search={query}&page={pageno}
    142. url_query : web_url
    143. title_query : name_with_namespace
    144. content_query : description
    145. page_size : 20
    146. categories : it
    147. shortcut : gl
    148. timeout : 10.0
    149. - name : github
    150. engine : github
    151. shortcut : gh
    152. - name : stackoverflow
    153. engine : stackoverflow
    154. shortcut : st
    155. - name : wikipedia
    156. engine : wikipedia
    157. shortcut : wp
    158. base_url : 'https://en.wikipedia.org/'
    159. locales:
    160. en : English
    161. ar : العَرَبِيَّة (Arabic)
    162. bg : Български (Bulgarian)
    163. cs : Čeština (Czech)
    164. da : Dansk (Danish)
    165. de : Deutsch (German)
    166. el_GR : Ελληνικά (Greek_Greece)
    167. eo : Esperanto (Esperanto)
    168. es : Español (Spanish)
    169. fi : Suomi (Finnish)
    170. fil : Wikang Filipino (Filipino)
    171. fr : Français (French)
    172. he : עברית (Hebrew)
    173. hr : Hrvatski (Croatian)
    174. hu : Magyar (Hungarian)
    175. it : Italiano (Italian)
    176. ja : 日本語 (Japanese)
    177. nl : Nederlands (Dutch)
    178. pl : Polski (Polish)
    179. pt : Português (Portuguese)
    180. pt_BR : Português (Portuguese_Brazil)
    181. ro : Română (Romanian)
    182. ru : Русский (Russian)
    183. sk : Slovenčina (Slovak)
    184. sl : Slovenski (Slovene)
    185. sr : српски (Serbian)
    186. sv : Svenska (Swedish)
    187. tr : Türkçe (Turkish)
    188. uk : українська мова (Ukrainian)
    189. zh : 简体中文 (Chinese, Simplified)
    190. zh_TW : 繁體中文 (Chinese, Traditional)
    191. doi_resolvers :
    192. oadoi.org : 'https://oadoi.org/'
    193. doi.org : 'https://doi.org/'
    194. doai.io : 'http://doai.io/'
    195. sci-hub.tw : 'http://sci-hub.tw/'
    196. default_doi_resolver : 'oadoi.org'
    197. sentry:
    198. dsn: https://xkdkkdkdkdkdkdkdk@sentry.xxx.com/2

    运行+caddy 反代

    1. mv searx/settings_et_dev.yml searx/settings.yml
    2. gunicorn searx.webapp:app -b 127.0.0.1:8888 -D # 一定要在mijisou目录下运行
    3. wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh
    4. echo "www.你的域名.com {
    5. gzip
    6. tls xxxx@xxx.com
    7. proxy / 127.0.0.1:8888
    8. }" >> /usr/local/caddy/Caddyfile
    9. /etc/init.d/caddy start
    10. # 如果启动失败可以看 Caddy 日志:tail -f /tmp/caddy.log

    opensearch

    1. vim /root/mijisou/searx/templates/__common__/opensearch.xml
    2. "1.0" encoding="utf-8"?>
    3. <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    4. <ShortName>{{ instance_name }}ShortName>
    5. <Description>a privacy-respecting, hackable metasearch engineDescription>
    6. <InputEncoding>UTF-8InputEncoding>
    7. <Image>{{ urljoin(host, url_for('static', filename='img/favicon.png')) }}Image>
    8. <LongName>searx metasearchLongName>
    9. {% if opensearch_method == 'get' %}
    10. <Url type="text/html" method="get" template="https://www.你的域名.com/?q={searchTerms}"/>
    11. {% if autocomplete %}
    12. <Url type="application/x-suggestions+json" method="get" template="{{ host }}autocompleter">
    13. <Param name="format" value="x-suggestions" />
    14. <Param name="q" value="{searchTerms}" />
    15. Url>
    16. {% endif %}
    17. {% else %}
    18. <Url type="text/html" method="post" template="{{ host }}">
    19. <Param name="q" value="{searchTerms}" />
    20. Url>
    21. {% if autocomplete %}
    22. <Url type="application/x-suggestions+json" method="get" template="{{ host }}autocompleter">
    23. <Param name="format" value="x-suggestions" />
    24. <Param name="q" value="{searchTerms}" />
    25. Url>
    26. {% endif %}
    27. {% endif %}
    28. OpenSearchDescription>

    修改

    配置文件中改下名字 mijisou/searx/static/themes/entropage/img 中的 logo 图标自己换一下

    管理

    1. ps -aux
    2. 看一下哪个是 gunicorn 进程
    3. kill 杀掉
    4. gunicorn searx.webapp:app -b 127.0.0.1:8888 -D # 再次强调,在 /mijisou 目录下运行

    配合 Cloudflare 的 CDN

    1. Cloudflare 创建 site
    2. 域名商改 nameserver
    3. 修改 Caddy 配置
    1. echo "www.你的域名.com:80 {
    2. gzip
    3. proxy / 127.0.0.1:8888
    4. }" >> /usr/local/caddy/Caddyfile

    磁盘占用

    服务运行一段时间后, /var/lib/redis 路径下会有一些缓存文件(貌似),直接删了就行

    redis 报错

    如果出现 "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. Resque" 可以尝试以下命令

    1. $ redis-cli
    2. > config set stop-writes-on-bgsave-error no

    1. vim /etc/redis.conf
    2. stop-writes-on-bgsave-error no

    数据库

    Relational

    Oracle

    • 机器物理内存应不少于 1GB,如果是 VMWARE 虚拟机建议不少于 1200MB.
    • 对于64位的oracle11g数据库,若程序文件和数据文件安装在同一个分区,则该分区的硬盘空间要求分别为:企业版 5.65GB、标准版 5.38GB;除此以外,还应确保 /tmp 目录所在分区的空间不少于1GB,总的来说,建议为 oracle11g 准备至少 8GB 的硬盘空间

    RPM 方式安装

    下载需要的安装包

    这里以 Oracle19c 为例

    1. yum localinstall -y oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
    2. yum localinstall -y oracle-database-ee-19c-1.0-1.x86_64.rpm

    注意安装完成之后的配置 需要使用 root 用户.

    修改字符集以及其他的配置:

    1. vim /etc/init.d/oracledb_ORCLCDB-19c
    2. export ORACLE_VERSION=19c
    3. export ORACLE_SID=ORA19C
    4. export TEMPLATE_NAME=General_Purpose.dbc
    5. export CHARSET=ZHS16GBK
    6. export PDB_NAME=ORA19CPDB
    7. export CREATE_AS_CDB=true

    复制参数文件

    1. cd /etc/sysconfig/
    2. cp oracledb_ORCLCDB-19c.conf oracledb_ORA19C-19c.conf
    3. /etc/init.d/oracledb_ORCLCDB-19c configure
    4. # 等待 Oracle 数据库执行初始化操作即可

    增加环境变量处理

    1. vim /etc/profile.d/oracle19c.sh
    2. export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
    3. export PATH=$PATH:/opt/oracle/product/19c/dbhome_1/bin
    4. export ORACLE_SID=ORA19C
    source /etc/profile.d/oracle19c.sh
    1. # 修改 Oracle 用户的密码:
    2. passwd oracle
    3. # 使用 Oracle 登录进行相关的处理
    4. su - oracle
    5. sqlplus / as sysdba
    6. # 查看 pdb 信息
    7. show pdbs
    8. # 修改密码
    9. alter user system identified by Test1234;
    10. # 启动
    11. startup
    12. exit
    13. # 启动监听器
    14. cd $ORACLE_HOME/bin
    15. lsnrctl start
    1. systemctl stop firewalld
    2. systemctl disable firewalld
    3. setenforce 0

    使用 navicat 连接测试

    默认 Oracle 数据库中的两个具有 DBA 权限的用户 Sys 和 System 的缺省密码是 manager。

    注:我在 oracle-database-ee-19c-1.0-1.x86_64 环境下,使用 Navicat Premium 12.1.18 安装 instantclient-basic-windows.x64-12.1.0.2.0 可以成功连接

    注 : 报错 ORA-03135

    把本机防火墙关掉,顺便看下数据库服务器防火墙有没有放行

    注 : 报错 ORA-28547:connection to server failed, probable Oracle Net admin error

    oci.dll 版本不对.因为 Navicat 是通过 Oracle 客户端连接 Oracle 服务器的,Oracle 的客户端分为两种,一种是标准版,一种是简洁版,即 Oracle Install Client.而我们用 Navicat 时通常会在自己的安装路径下包含多个版本的 OCI,如果使用 Navicat 连接 Oracle 服务器出现 ORA-28547 错误时,多数是因为 Navicat 本地的 OCI 版本与 Oracle 服务器服务器不符造成的.

    OCI 下载地址 : https://www.oracle.com/database/technologies/instant-client/downloads.html ,解压 instantclient-basic-win-x64

    打开 navicat,一次选择:工具->选项->环境-->OCI 环境,选择刚才解压好的 instantclient-basic-win-x64 目录中的 oci.dll 文件即可,重启 navicat

    注 : 报错 oracle library is not loaded

    还是 oci.dll 版本不对,换个低版本的 Instant Client 🤣

    注 : 报错 ORA-28040: No matching authentication protocol

    这个还是 oci.dll 版本不对,再换个高版本的 Instant Client 😂

    创建用户

    oracle 内部有两个默认的用户:systemsys。用户可直接登录到 system 用户以创建其他用户,因为 system 具有创建别的用户的权限。 在安装 oracle 时,用户或系统管理员首先可以为自己建立一个用户。

    1. 语法[创建用户]: create user 用户名 identified by 口令[即密码];
    2. 例子: create user test identified by test;
    3. 语法[更改用户]: alter user 用户名 identified by 口令[改变的口令];
    4. 例子: alter user test identified by 123456;

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 123456 这类弱口令

    创建用户的时候用户名以 c## 或者 C## 开头即可。

    1. 错误写法:create user test identified by oracle;
    2. 正确写法:create user c##test identified by oracle;

    关闭

    1. su - oracle
    2. sqlplus / as sysdba
    3. shutdown

    整个启动和关闭的过程都会记录在 alert 日志文件中。

    docker 部署

    1. # https://github.com/wnameless/docker-oracle-xe-11g
    2. docker pull wnameless/oracle-xe-11g-r2
    3. docker run -d -p 1521:1521 -e ORACLE_ALLOW_REMOTE=true wnameless/oracle-xe-11g-r2
    4. # https://hub.docker.com/r/gvenzl/oracle-xe
    5. docker pull gvenzl/oracle-xe:11
    6. docker run -d -p 1521:1521 -e ORACLE_PASSWORD=123123123 gvenzl/oracle-xe:11

    Mariadb

    官网

    安装

    • Centos下

      yum install -y mariadb mariadb-server
    • Ubuntu下

      apt -y install mariadb-server mariadb-client

    数据库初始化

    1. systemctl start mariadb
    2. mysql_secure_installation
    配置流程说明操作
    Enter current password for root (enter for none)输入 root 密码初次运行直接回车
    Set root password? [Y/n]是设置 root 密码可以 y 或者 回车
    New password输入新密码
    Re-enter new password再次输入新密码
    Remove anonymous users? [Y/n]是否删除匿名用户可以 y 或者回车 本次 y
    Disallow root login remotely? [Y/n]是否禁止 root 远程登录可以 y 或者回车 本次 n
    Remove test database and access to it? [Y/n]是否删除 test 数据库y 或者回车 本次 y
    Reload privilege tables now? [Y/n]是否重新加载权限表y 或者回车 本次 y

    配置远程访问

    Mariadb 数据库授权 root 用户能够远程访问

    1. systemctl start mariadb
    2. mysql -u root -p
    3. select User, host from mysql.user;
    4. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'toor' WITH GRANT OPTION;
    5. # 这句话的意思 ,允许任何 IP 地址(上面的 % 就是这个意思)的电脑 用 root 帐户 和密码 toor 来访问这个数据库
    6. FLUSH PRIVILEGES;
    7. exit

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 toor 这类弱口令

    • Centos下

      1. firewall-cmd --permanent --add-service=mysql
      2. firewall-cmd --reload
      3. systemctl enable mariadb
      4. systemctl restart mariadb
    • Ubuntu下

      1. vim /etc/mysql/mariadb.conf.d/50-server.cnf
      2. # 注释掉 bind-address = 127.0.0.1 这一行
      3. systemctl restart mariadb

    重置密码

    1. # 先关服务
    2. systemctl stop mariadb
    3. # 用以下命令在没有权限检查的情况下重新启动数据库
    4. mysqld_safe --skip-grant-tables &
    5. # 这里, --skip-grant-tables 选项让你在没有密码和所有权限的情况下进行连接.如果使用此选项启动服务器,它还会启用 --skip-networking 选项,这用于防止其他客户端连接到数据库服务器.并且,& 符号用于在后台运行命令,因此你可以在以下步骤中输入其他命令.请注意,上述命令很危险,并且你的数据库会变得不安全.你应该只在短时间内运行此命令以重置密码.
    6. # 接下来,以 root 用户身份登录 MySQL/MariaDB 服务器:
    7. mysql
    8. # 在 mysql > 或 MariaDB [(none)] > 提示符下,运行以下命令重置 root 用户密码:
    9. UPDATE mysql.user SET Password=PASSWORD('NEW-PASSWORD') WHERE User='root';
    10. # 使用你自己的密码替换上述命令中的 NEW-PASSWORD.
    11. # 然后,输入以下命令退出 mysql 控制台.
    12. FLUSH PRIVILEGES;
    13. exit
    14. # 最后,关闭之前使用 --skip-grant-tables 选项运行的数据库.为此,运行:
    15. mysqladmin -u root -p shutdown
    16. # 系统将要求你输入在上一步中设置的 MySQL/MariaDB 用户密码.
    17. systemctl start mariadb
    18. mysql -u root -p # 本地连接

    连接远程数据库

    mysql -u 用户名 -p密码 -h 服务器IP地址 -P 服务器端口号 -D 数据库名

    • 服务器端口标志 -P 一定要大些以区别于用户 -p,如果直接连接数据库标志 -D 也要大写;
    • 如果要直接输入密码 -p 后面不能留有空格如 -pmypassword;
    • 命令结束段没有';'分号。

    例如 : mysql -u root -p123456 -h 192.168.1.1 -P 3306 -D test

    导入 .sql 文件

    1. mysql -u root -p
    2. use [数据库]
    3. source /tmp/dbname.sql

    docker 部署

    1. docker login
    2. docker run -d -p 3306:3306 --name mariadb-test -e MYSQL_ROOT_PASSWORD=root1234 mariadb:latest
    3. # 这里密码里不能带 !

    MySQL

    官网

    安装

    和 Mariadb 差不多,看 Mariadb 的就行了

    • Ubuntu

      apt install -y mysql-server mysql-client
    • Centos

      1. yum install -y yum-utils
      2. wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
      3. rpm -ivh mysql80-community-release-el7-1.noarch.rpm
      4. yum-config-manager --disable mysql80-community
      5. yum-config-manager --enable mysql57-community
      6. yum install -y mysql-community-server mysql-community-devel

    配置

    1. systemctl enable mysqld
    2. # 初始化 mysql
    3. /usr/bin/mysqld -initialize -basedir=/usr/share/mysql -datadir=/var/lib/mysql/data/
    4. # 或
    5. /usr/bin/mysql -initialize -basedir=/usr/share/mysql -datadir=/var/lib/mysql/data/
    1. systemctl start mysqld
    2. mysql -uroot -p
    3. use mysql;
    4. update user set authentication_string=password('123456') where user='root';
    5. FLUSH PRIVILEGES;
    6. exit

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 123456 这类弱口令

    my.cnf 配置文件内容见笔记 mysql

    配置远程连接

    1. mysql -u root -p
    2. select User, host from mysql.user;
    3. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
    4. FLUSH PRIVILEGES;
    5. exit

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 123456 这类弱口令

    1. firewall-cmd --permanent --add-service=mysql
    2. firewall-cmd --reload

    远程访问报错 Table 'performance_schema.session_variables' doesn't exist

    1. mysql_upgrade -u root -p --force
    2. systemctl restart mysqld

    Postgresql

    官网

    安装

    1. yum install -y postgresql-server
    2. postgresql-setup initdb # 初始化数据库
    3. service postgresql start # 启动服务

    PostgreSQL 安装完成后,会建立一下 ‘postgres’ 用户,用于执行 PostgreSQL,数据库中也会建立一个 'postgres' 用户,默认密码为自动生成,需要在系统中改一下.

    修改用户密码

    1. sudo -u postgres psql postgres
    2. \l # 查看当前的数据库列表
    3. \password postgres # 给 postgres 用户设置密码
    4. \q # 退出数据库

    开启远程访问

    1. vim /var/lib/pgsql/data/postgresql.conf
    2. listen_addresses='*'
    1. vim /var/lib/pgsql/data/pg_hba.conf
    2. # IPv4 local connections:
    3. host all all 127.0.0.1/32 md5
    4. host all all 0.0.0.0/0 md5
    5. # 其中 0.0.0.0/0 表示运行任意 ip 地址访问.
    6. # 若设置为 192.168.1.0/24 则表示允许来自 ip 为 192.168.1.0 ~ 192.168.1.255 之间的访问.

    service postgresql restart 防火墙记得放行


    Document

    MongoDB

    官网

    安装

    1. vim /etc/yum.repos.d/mongodb-org-4.0.repo
    2. [mongodb-org-4.0]
    3. name=MongoDB Repository
    4. baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
    5. gpgcheck=1
    6. enabled=1
    7. gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
    yum install -y mongodb-org

    配置远程访问

    1. vim /etc/mongod.conf
    2. # Listen to all ip address
    3. bind_ip = 0.0.0.0
    service mongod start

    创建管理员用户

    1. mongo
    2. >use admin
    3. db.createUser(
    4. {
    5. user: "myUserAdmin",
    6. pwd: "abc123",
    7. roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
    8. }
    9. )
    10. > show dbs; # 查看数据库
    11. > db.version(); # 查看数据库版本

    启用权限管理

    1. vim /etc/mongod.conf
    2. #security
    3. security:
    4. authorization: enabled
    service mongod restart

    Key-value

    Redis

    官网

    安装

    • 包管理器方式

      在 CentOS 和 Red Hat 系统中,首先添加 EPEL 仓库,然后更新 yum 源:

      1. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
      2. yum clean all
      3. yum makecache
      4. yum install -y redis

      在 debian 中

      1. apt install -y redis-server
      2. systemctl start redis # 安装好后启动 Redis 服务即可
    • 源代码编译方式安装

      在官网下载 tar.gz 的安装包,或者通过 wget 的方式下载

      1. wget http://download.redis.io/releases/redis-5.0.5.tar.gz
      2. tar -zxvf redis-5.0.5.tar.gz
      3. cd redis-5.0.5
      4. make
      5. yum install -y tcl tcl-devel
      6. make test
      7. make MALLOC=libc
      8. make install
      1. ./usr/local/bin/redis-server
      2. ctrl+z
      3. bg
      4. redis-cli

    使用 redis-cli 进入 Redis 命令行模式操作

    1. redis-cli
    2. 127.0.0.1:6379> ping
    3. PONG
    4. 127.0.0.1:6379> exit

    开启远程访问

    为了可以使 Redis 能被远程连接,需要修改配置文件,路径为 /etc/redis.conf

    1. vim /etc/redis.conf
    2. #bind 127.0.0.1
    3. requirepass 密码 # 设置 redis 密码
    service redis restart   # 当然还要记得开防火墙

    连接测试

    redis-cli -h [ip] -p 6379 -a [PASSWORD]

    压测

    Redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能.

    1. redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
    2. # 100 个并发连接,100000 个请求,检测 host 为 localhost 端口为 6379 的 redis 服务器性能
    3. redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100
    4. # 测试存取大小为100字节的数据包的性能
    5. redis-benchmark -t set,lpush -n 100000 -q
    6. # 只测试某些操作的性能
    7. redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
    8. # 只测试某些数值存取的性能

    使用教程


    Memcached

    官网

    安装

    • 软件包安装

      1. yum install -y memcached
      2. cat /etc/sysconfig/memcached
    • 源代码编译方式安装

      在官网下载 tar.gz 的安装包,或者通过 wget 的方式下载

      1. wget http://memcached.org/latest
      2. tar -zxvf memcached-1.x.x.tar.gz
      3. cd memcached-1.x.x
      4. ./configure --prefix=/usr/local/memcached
      5. make && make test
      6. make install

    运行

    1. systemctl start memcached
    2. systemctl enable memcached
    3. firewall-cmd --add-port=11211/tcp --permanent
    4. firewall-cmd --reload

    图形

    Neo4j

    官网

    安装

    依赖 jdk,安装过程见 JDK

    下载 neo4j,这里以 2.3.9 为例

    1. tar -zvxf neo4j-community-2.3.9-unix.tar.gz
    2. cd neo4j-community-2.3.9/conf
    1. vim neo4j-server.properties
    2. org.neo4j.server.webserver.address=0.0.0.0
    1. cd ../bin
    2. firewall-cmd --permanent --zone=public --add-port=7474/tcp
    3. firewall-cmd --reload
    4. ./neo4j start

    访问 127.0.0.1:7474,初始账号密码 neo4j,进去后会要求你修改密码


    文件服务

    filebrowser

    一个在线网盘服务,只能在线看图片,在线看视频是不支持的 w

    项目地址

    安装

    1. curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash
    2. filebrowser -r /path/to/your/files

    使用

    filebrowser -a [你自己的IP] -r [文件夹路径]

    默认账号密码 admin


    NFS

    服务端

    安装

    yum install -y nfs-utils

    修改配置文件

    1. vim /etc/exports
    2. /public 192.168.xxx.xxx(ro)

    启服务

    1. mkdir /public
    2. vim /etc/selinux/config
    3. SELINUX=disabled
    4. firewall-cmd --zone=public --add-service=rpc-bind --permanent
    5. firewall-cmd --zone=public --add-service=mountd --permanent
    6. firewall-cmd --zone=public --add-port=2049/tcp --permanent
    7. firewall-cmd --zone=public --add-port=2049/udp --permanent
    8. firewall-cmd --reload
    9. service rpcbind start
    10. service nfs start

    客户端

    安装,创建用户

    1. yum install -y nfs-utils
    2. mkdir /mnt/nfsfiles
    3. useradd nfsuser1
    4. passwd nfsuser1

    验证共享是否成功

    showmount -e 192.168.xxx.xxx

    挂载共享目录

    1. vim /etc/fstab
    2. 192.168.xxx.xxx:/public /mnt/nfsfiles/ nfs defaults 0 0
    su -l nfsuser1

    验证

    服务器

    1. cd /public/
    2. echo "hello" > hello.txt

    客户端

    1. cd /mnt/nfsfiles/
    2. cat hello.txt

    更多配置案例

    nfs.md


    Samba

    官网

    服务端

    安装

    yum install -y samba

    修改配置文件

    1. vim /etc/samba/smb.conf
    2. [smbshare]
    3. path = /smbshare # 共享目录
    4. public = yes
    5. writeable=yes
    6. hosts allow = 192.168.1xx.33/32 # 允许主机
    7. hosts deny = all
    8. create mask = 0770 # 创建文件的权限为 0770;
    testparm  # 验证配置文件有没有错误

    用户配置

    1. # 添加用户,设置密码
    2. useradd smb1
    3. smbpasswd -a smb1(密码:smb123456)
    4. # 将用户添加到 samba 服务器中,并设置密码
    5. pdbedit -a smb1(密码:smb123456)
    6. # 查看 samba 数据库用户
    7. pdbedit -L

    创建共享目录,设置所有者和所属组

    1. mkdir /smbshare
    2. chown smb1:smb1 /smbshare

    关闭 selinux (需要重启)

    1. vim /etc/selinux/config
    2. SELINUX=disabled
    1. firewall-cmd --zone=public --add-service=samba --permanent
    2. firewall-cmd --reload
    3. systemctl restart smb

    客户端

    1. yum install -y samba
    2. mkdir /data/web_data
    3. mount -t cifs -o username=smb1,password='smb123456' //192.168.xx+1.xx/webdata /data/web_data

    更多配置案例

    Samba.md


    sharry

    官网

    安装

    1. cd /tmp
    2. wget https://github.com/eikek/sharry/releases/download/release%2F1.6.0/sharry-restserver-1.6.0.zip
    3. unzip sharry-restserver-1.6.0.zip
    4. mv sharry-restserver-1.6.0 sharry
    5. /tmp/sharry/bin/sharry-restserver

    访问 http://localhost:9090/


    Vsftp

    官网

    匿名访问

    参数作用
    anonymous_enable=YES允许匿名访问模式
    anon_umask=022匿名用户上传文件的umask值
    anon_upload_enable=YES允许匿名用户上传文件
    anon_mkdir_write_enable=YES允许匿名用户创建目录
    anon_other_write_enable=YES允许匿名用户修改目录名称或删除目录
    1. vim /etc/vsftpd/vsftpd.conf
    2. anonymous_enable=YES
    3. anon_umask=022
    4. anon_upload_enable=YES
    5. anon_mkdir_write_enable=YES
    6. anon_other_write_enable=YES
    1. setenforce 0 # 关闭 selinux
    2. firewall-cmd --permanent --zone=public --add-service=ftp
    3. firewall-cmd --reload
    4. systemctl restart vsftpd
    5. systemctl enable vsftpd

    现在就可以在客户端执行 ftp 命令连接到远程的 FTP 服务器了.
    在 vsftpd 服务程序的匿名开放认证模式下,其账户统一为 anonymous,密码为空.而且在连接到 FTP 服务器后,默认访问的是 /var/ftp 目录.
    我们可以切换到该目录下的 pub 目录中,然后尝试创建一个新的目录文件,以检验是否拥有写入权限:

    1. [root@linuxprobe ~]# ftp 192.168.10.10
    2. Connected to 192.168.10.10 (192.168.10.10).
    3. 220 (vsFTPd 3.0.2)
    4. Name (192.168.10.10:root): anonymous
    5. 331 Please specify the password.
    6. Password:此处敲击回车即可
    7. 230 Login successful.
    8. Remote system type is UNIX.
    9. Using binary mode to transfer files.
    10. ftp> cd pub
    11. 250 Directory successfully changed.
    12. ftp> mkdir files
    13. 257 "/pub/files" created
    14. ftp> rename files database
    15. 350 Ready for RNTO.
    16. 250 Rename successful.
    17. ftp> rmdir database
    18. 250 Remove directory operation successful.
    19. ftp> exit
    20. 221 Goodbye.

    本地用户

    参数作用
    anonymous_enable=NO禁止匿名访问模式
    local_enable=YES允许本地用户模式
    write_enable=YES设置可写权限
    local_umask=022本地用户模式创建文件的umask值
    userlist_deny=YES启用"禁止用户名单",名单文件为 ftpusers 和 user_list
    userlist_enable=YES开启用户作用名单文件功能
    1. vim /etc/vsftpd/vsftpd.conf
    2. anonymous_enable=NO
    3. local_enable=YES
    4. write_enable=YES
    5. local_umask=022
    1. setenforce 0 # 关闭 selinux
    2. firewall-cmd --permanent --zone=public --add-service=ftp
    3. firewall-cmd --reload
    4. systemctl restart vsftpd
    5. systemctl enable vsftpd

    按理来讲,现在已经完全可以本地用户的身份登录 FTP 服务器了.但是在使用 root 管理员登录后,系统提示如下的错误信息:

    1. [root@linuxprobe ~]# ftp 192.168.10.10
    2. Connected to 192.168.10.10 (192.168.10.10).
    3. 220 (vsFTPd 3.0.2)
    4. Name (192.168.10.10:root): root
    5. 530 Permission denied.
    6. Login failed.
    7. ftp>

    可见,在我们输入 root 管理员的密码之前,就已经被系统拒绝访问了.这是因为 vsftpd 服务程序所在的目录中默认存放着两个名为"用户名单"的文件 (ftpusers 和 user_list) .只要里面写有某位用户的名字,就不再允许这位用户登录到 FTP 服务器上.

    1. [root@linuxprobe ~]# cat /etc/vsftpd/user_list
    2. [root@linuxprobe ~]# cat /etc/vsftpd/ftpusers

    如果你确认在生产环境中使用 root 管理员不会对系统安全产生影响,只需按照上面的提示删除掉 root 用户名即可.我们也可以选择 ftpusers 和 user_list 文件中没有的一个普通用户尝试登录 FTP 服务器
    在采用本地用户模式登录FTP服务器后,默认访问的是该用户的家目录,也就是说,访问的是 /home/username 目录.而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况.


    虚拟用户

    安装

    yum install -y vsftpd

    认证

    创建虚拟用户文件,把这些用户名和密码存放在一个文件中.该文件内容格式是:用户名占用一行,密码占一行.

    cd /etc/vsftp
    1. vim login.list
    2. Ftpuser1
    3. 123456
    4. Ftpuser2
    5. 123456
    6. Ftpadmin
    7. 123456

    使用 db_load 命令生成 db 口令 login 数据库文件

    db_load -T -t hash -f login.list login.db

    通过修改指定的配置文件,调整对该程序的认证方式

    1. vim /etc/vsftpd/vsftpd.conf
    2. pam_service_name=vsftpd.vu # 设置 PAM 使用的名称,该名称就是 /etc/pam.d/ 目录下 vsfptd 文件的文件名
    cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.vu
    1. vim /etc/pam.d/vsftpd.vu
    2. auth required pam_userdb.so db=/etc/vsftpd/login
    3. account required pam_userdb.so db=/etc/vsftpd/login
    4. # 注意:格式是 db=/etc/vsftpd/login 这样的,一定不要去掉源文件的 .db 后缀

    配置文件

    1. vim /etc/vsftpd/vsftpd.conf
    2. anonymous_enable=NO
    3. local_enable=YES
    4. guest_enable=YES
    5. guest_username=virtual
    6. pam_service_name=vsftpd.vu
    7. allow_writeable_chroot=YES
    参数作用
    anonymous_enable=NO禁止匿名开放模式
    local_enable=YES允许本地用户模式
    guest_enable=YES开启虚拟用户模式
    guest_username=virtual指定虚拟用户账户
    pam_service_name=vsftpd.vu指定PAM文件
    allow_writeable_chroot=YES允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求

    用户配置权限文件
    所有用户主目录为 /home/ftp 宿主为 virtual 用户;

    1. useradd -d /home/ftp -s /sbin/nologin virtual
    2. chmod -Rf 755 /home/ftp/
    3. cd /home/ftp/
    4. touch testfile
    1. vim /etc/vsftpd/vsftpd.conf
    2. guest_enable=YES # 表示是否开启 vsftpd 虚拟用户的功能,yes 表示开启,no 表示不开启.
    3. guest_username=virtual # 指定虚拟用户的宿主用户
    4. user_config_dir=/etc/vsftpd/user_conf # 设定虚拟用户个人 vsftpd 服务文件存放路径
    5. allow_writeable_chroot=YES

    编辑用户权限配置文件

    1. vim Ftpadmin # 创建 Ftpadmin 这个用户的配置文件
    2. anon_upload_enable=YES
    3. anon_mkdir_wirte_enable=YES
    4. anon_other_wirte_enable=YES
    5. anon_umask=022
    6. # 要求虚拟用户具有写权限 (上传、下载、删除、重命名)
    7. # umask = 022 时,新建的目录 权限是755,文件的权限是 644
    8. # umask = 077 时,新建的目录 权限是700,文件的权限时 600
    9. # vsftpd的local_umask和anon_umask借鉴了它
    10. # 默认情况下vsftp上传之后文件的权限是600,目录权限是700
    11. # 想要修改上传之后文件的权限,有两种情况
    12. # 如果使用vsftp的是本地用户
    13. # 则要修改配置文件中的 local_umask 的值
    14. # 如果使用vsftp的是虚拟用户
    15. # 则要修改配置文件中的 anon_umask 的值

    启服务

    1. setenforce 0 # 关闭 selinux
    2. firewall-cmd --zone=public --add-service=ftp
    3. firewall-cmd --reload
    4. systemctl restart vsftpd
    5. systemctl enable vsftpd

    Source & Reference

    更多配置案例

    Vsftp.md


    编程语言

    C

    1. vim world.c
    2. #include
    3. int main(void){
    4. printf("Hello World");
    5. return 0;
    6. }
    1. gcc helloworld.c -o execFile
    2. ./execFlie

    Go

    官网

    安装

    访问 https://golang.org/dl/ 下载最新版本包,这里以 go1.13.linux-amd64.tar.gz 为例

    1. tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
    2. export PATH=$PATH:/usr/local/go/bin
    3. export GOROOT=/usr/local/go
    4. export GOPATH=$HOME/Applications/Go
    5. export GOBIN=$GOROOT/bin
    6. source $HOME/.profile
    7. source ~/.bash_profile
    8. # $GOPATH 可以包含多个工作目录,取决于你的个人情况.如果你设置了多个工作目录,那么当你在之后使用 go get (远程包安装命令) 时远程包将会被安装在第一个目录下.
    9. ln -s /usr/local/go/bin/go /usr/bin/go
    10. go version

    测试安装

    1. mkdir -p $HOME/Applications/Go
    2. cd $HOME/Applications/Go
    1. vim hello.go
    2. package main
    3. import "fmt"
    4. func main() {
    5. fmt.Printf("hello, world\n")
    6. }
    1. go build
    2. ./hello

    JDK

    oracle jdk

    • rpm 包方式安装

      下载https://www.oracle.com/technetwork/java/javase/downloads/

      1. chmod +x jdk-****.rpm
      2. yum localinstall jdk-****.rpm
      3. # 也可以
      4. rpm -ivh jdk-****.rpm
    • 使用 ppa/源方式安装 oracle 官方版本 jdk

      1. # 添加 ppa
      2. apt-get install -y python-software-properties
      3. add-apt-repository ppa:webupd8team/java
      4. apt-get update
      5. # 安装 jdk7
      6. apt-get install -y oracle-java7-installer
      7. # 安装 jdk8
      8. apt-get install -y oracle-java8-installer
    • 直接使用编译完成的

      自行下载 oracle jdk

      这里以 jdk-8u212-linux-x64.tar.gz 举例

      1. tar -xzvf jdk-8u212-linux-x64.tar.gz
      2. mkdir /usr/local/java/
      3. mv jdk1.8.0_212/ /usr/local/java
      4. export JAVA_HOME=/usr/local/java/jdk1.8.0_212
      5. export JRE_HOME=${JAVA_HOME}/jre
      6. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
      7. export PATH=${JAVA_HOME}/bin:$PATH
      8. source /etc/profile
      9. ln -s /usr/local/java/jdk1.8.0_212/bin/java /usr/bin/java

    Openjdk

    • Red Hat系

      1. yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
      2. java -version
    • Debian 系

      1. apt-get update
      2. apt-get install -y openjdk-8-jdk
      3. # 或 apt-get install openjdk-11-jdk
      4. java -version

    测试

    1. java
    2. javac

    Perl

    官网

    安装

    sh <(curl -q https://platform.activestate.com/dl/cli/install.sh) --activate-default ActiveState/ActivePerl-5.28

    安装模块

    1. cpan [module] # 安装模块
    2. cpan -T [module] # 忽略测试项安装

    PHP

    安装

    1. # 安装必要的软件包
    2. apt-get install -y php php-cli php-zip

    composer

    Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目中来。

    安装

    1. # 使用php cli toll下载Composer安装脚本
    2. php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    3. # 在/usr/local/bin目录中安装Composer
    4. apt-get composer-setup.php --install-dir=/usr/local/bin --filename=composer
    5. # 验证安装
    6. composer

    使用

    1. # 以下为 CVE-2017-9841 测试
    2. apt-get install -y php-xml php-mbstring
    3. composer require --dev phpunit/phpunit:5.6.2
    4. php -S localhost:8080 -t .

    Python3

    官网

    yum 安装

    1. yum install -y epel-release
    2. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    3. yum install -y python36 python36-devel
    4. yum install -y python-devel
    5. yum install -y python3-devel

    源代码编译方式安装

    安装依赖环境

    yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

    下载Python3

    wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

    安装python3

    1. mkdir -p /usr/local/python3
    2. tar zxvf Python-3.6.1.tgz
    3. cd Python-3.6.1
    4. ./configure --prefix=/usr/local/python3
    5. make
    6. make install 或者 make && make install

    添加到环境变量

    ln -s /usr/local/python3/bin/python3 /usr/bin/python3
    1. vim ~/.bash_profile # 永久修改变量
    2. PATH=$PATH:/usr/local/python3/bin/
    source ~/.bash_profile

    检查 Python3 及 pip3 是否正常可用

    1. python3 -V
    2. pip3 -V
    pip
    1. wget https://bootstrap.pypa.io/get-pip.py
    2. python3 get-pip.py

    debian 系可以直接用 apt 装

    apt-get install -y python-pip

    加速

    pip 指定版本安装

    检查一遍 pip 和 pip3 分别指向的 Python

    1. pip -V
    2. pip3 -V

    在 linux 安装了多版本 python 时(例如 python2.6 和 2.7),pip 安装的包不一定是用户想要的位置,此时可以用 -t 选项来指定位置

    pip install -t /usr/local/lib/python2.7/site-packages/ docker
    jupyterlab

    安装运行

    1. pip3 install jupyterlab
    2. jupyter lab --ip=0.0.0.0 --allow-root # 运行
    3. # 或
    4. jupyter lab --ip=* --allow-root # 允许所有IP访问

    管理

    1. jupyter-notebook list # 查看令牌
    2. jupyter-labextension list # 列出已安装扩展
    3. jupyter-labextension uninstall my-extension # 卸载已安装扩展

    Ruby

    官网

    安装

    下载 ruby 安装包,并进行编译安装

    1. wget https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0.tar.gz
    2. tar xvfvz ruby-3.0.0.tar.gz
    3. cd ruby-3.0.0
    4. ./configure
    5. make
    6. make install

    将 ruby 添加到环境变量,ruby 安装在/usr/local/bin/目录下,因此编辑 ~/.bash_profile文件,添加一下内容:

    1. vim ~/.bash_profile
    2. export PATH=$PATH:/usr/local/bin/
    source ~/.bash_profile  # 不要忘了生效一下

    Rust

    官网

    安装

    1. curl https://sh.rustup.rs -sSf | sh
    2. dnf install rust cargo

    测试安装

    1. rustc --version
    2. cargo --version
    3. tee hello.rs <<-'EOF'
    4. fn main() {
    5. println!("Hello, world!");
    6. }
    7. EOF
    8. rustc hello.rs # 编译程序
    9. ./hello # 运行

    使用 Cargo 构建程序

    1. cargo new helloworld # 创建一个新的包
    2. cd helloworld/
    3. cargo build # 构建包
    4. ./target/debug/helloworld # 直接运行二进制文件
    5. cargo run # 编译和运行
    6. cargo check # 查看对目录进行了哪些更改
    7. cargo clean # 清理目录

    系统监管

    aaPanel/BaoTa

    官网

    安装

    • Centos/Fedora

      wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
    • Ubuntu/Debian/Deepin

      wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

    使用

    • web: 安装完后会随机生成8位的管理路径,账号和密码,访问即可
    • shell: 使用 bt 命令

    卸载

    1. wget http://download.bt.cn/install/bt-uninstall.sh
    2. sh bt-uninstall.sh

    国际版本

    • https://www.aapanel.com/

    • Centos/Fedora

      yum install -y wget && wget -O install.sh http://www.aapanel.com/script/install_6.0_en.sh && bash install.sh aapanel
    • Ubuntu/Deepin

      wget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh && sudo bash install.sh aapanel
    • Debian

      wget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh && bash install.sh aapanel

    Jenkins

    官网

    注,Jenkins 需要 jdk 环境,请先行安装

    rpm 包方式安装

    添加 Jenkins 源:

    1. wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo
    2. rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

    使用 yum 命令安装 Jenkins:

    yum install -y jenkins

    使用 ppa/源方式安装

    1. wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | apt-key add -
    2. sed -i "1ideb https://pkg.jenkins.io/debian binary/" /etc/apt/sources.list
    3. apt-get update
    4. apt-get install -y jenkins

    安装后默认服务是启动的,默认是 8080 端口,在浏览器输入 : http://127.0.0.1:8080/即可打开主页

    查看密码

    cat /var/lib/jenkins/secrets/initialAdminPassword

    JumpServer

    官网

    安装

    以下部分内容来自 [官方文档] 在此只记录重点

    注:鉴于国内环境,下面步骤运行中还是会出现 docker pull 镜像超时的问题,你懂的,不要问我怎么解决

    curl -sSL https://github.com/jumpserver/jumpserver/releases/download/2.0.1/quick_start.sh | sh

    Loganalyzer

    日志收集系统

    安装

    这里以 LAMP 环境为例

    1. yum install -y httpd mariadb mariadb-server php php-mysql mysql-devel
    2. systemctl start mariadb
    3. systemctl restart httpd
    4. firewall-cmd --zone=public --add-service=http --permanent
    5. firewall-cmd --reload
    1. vim /etc/httpd/conf/httpd.conf
    2. DirectoryIndex index.php index.html
    1. yum install -y rsyslog-mysql
    2. cd /usr/share/doc/rsyslog-8.24.0/
    3. mysql -uroot -p < mysql-createDB.sql
    4. systemctl restart rsyslog
    5. mysql -uroot -p
    6. GRANT ALL ON Syslog.* TO 'Syslog'@'localhost' identified BY 'Syslog';
    7. FLUSH PRIVILEGES;

    注意 : 此处只是为了方便演示,生产环境下请不要使用类似 Syslog 这类弱口令

    1. vim /etc/rsyslog.conf
    2. $ModLoad immark
    3. $ModLoad imudp
    4. $UDPServerRun 514
    5. $ModLoad imtcp
    6. $ModLoad ommysql
    7. *.* :ommysql:localhost,Syslog,rsyslog,Syslog

    注:同样,这里数据库账号链接的密码自己也记得改一下

    1. wget -c http://download.adiscon.com/loganalyzer/loganalyzer-4.1.7.tar.gz
    2. tar xf loganalyzer-4.1.7.tar.gz -C /tmp/
    3. cd /tmp/loganalyzer-4.1.7/
    4. # !!注: 我这里有个删除 /var/www/html/ 下文件的操作,看清楚再执行!!
    5. rm -rf /var/www/html/*
    6. cp -a src/* /var/www/html/
    7. cp -a contrib/* /var/www/html/
    8. chmod +x /var/www/html/*.sh
    9. cd /var/www/html
    10. ./configure.sh
    echo 1 > /var/log/syslog

    然后访问 127.0.0.1 即可看到初始化安装界面,在 step3 记得选择 Enable User Database

    • Database Host:localhost
    • Database Port:3306
    • Database Name:Syslog
    • Table prefix:logcon_
    • Database User:Syslog
    • Database Password:Syslog 注: 密码自己记得改

    Supervisor

    官网

    安装

    因为 Supervisor 是 Python 开发的,安装前先检查一下系统否安装了 Python2.4 以上版本.

    pip install supervisor

    安装完成后,我们使用 echo_supervisord_conf 命令创建一个 Supervisor 配置文件

    echo_supervisord_conf > /etc/supervisord.conf

    配置

    接着在 /etc/supervisord.conf 文件最下方加入目标程序的启动项目

    1. vim /etc/supervisord.conf
    2. ; [program:xx]是被管理的进程配置参数,xx是进程的名称
    3. [program:xx]
    4. command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
    5. autostart=true ; 在 supervisord 启动的时候也自动启动
    6. startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
    7. autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为 unexpected,表示进程意外杀死后才重启
    8. startretries=3 ; 启动失败自动重试次数,默认是3
    9. user=tomcat ; 用哪个用户启动进程,默认是root
    10. priority=999 ; 进程启动优先级,默认999,值小的优先启动
    11. redirect_stderr=true ; 把 stderr 重定向到 stdout,默认 false
    12. stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认 50MB s
    13. tdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
    14. ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录 (supervisord 会自动创建日志文件)
    15. stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
    16. stopasgroup=false ;默认为 false,进程被杀死时,是否向这个进程组发送 stop 信号,包括子进程
    17. killasgroup=false ;默认为 false,向进程组发送 kill 信号,包括子进程

    注意修改 user = tomcat

    接着直接运行 Supervisor 即可让目标程序保持后台运行,运行服务时,需要指定 supervisor 配置文件

    supervisord -c /etc/supervisord.conf
    1. supervisorctl status
    2. supervisorctl stop tomcat
    3. supervisorctl start tomcat
    4. supervisorctl restart tomcat
    5. supervisorctl reread
    6. supervisorctl update

    Source & Reference


    Webmin

    官网

    安装

    在官网下载 RPM 包,上传至服务器,这里以 1.930-1 为例

    1. yum install -y perl-Net-SSLeay
    2. yum install -y perl-Encode-Detect
    3. yum install -y perl-Data-Dumper
    4. rpm -Uvh webmin-1.930-1.noarch.rpm
    5. firewall-cmd --permanent --zone=public --add-port=10000/tcp
    6. firewall-cmd --reload

    安装完直接启动,访问 https://127.0.0.1:10000 注意,带 HTTPS

    默认账号 root,密码与服务器一致

    修改密码

    /usr/libexec/webmin/changepass.pl /etc/webmin/ root 1234qwer

    Zabbix

    zabbix 是一款服务器监控软件,其由 server、agent、web 等模块组成,其中 web 模块由 PHP 编写,用来显示数据库中的结果.

    官网

    安装依赖

    1. yum install -y mysql
    2. yum install -y httpd
    3. yum install -y php
    4. yum install -y php-mysqlnd php-gd libjpeg* php-snmp php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-bcmath php-mhash php-common php-ctype php-xml php-xmlreader php-xmlwriter php-session php-mbstring php-gettext php-ldap php-mysqli --skip-broken
    5. yum install -y wget telnet net-tools python-paramiko gcc gcc-c++ dejavu-sans-fonts python-setuptools python-devel sendmail mailx net-snmp net-snmp-devel net-snmp-utils freetype-devel libpng-devel perl unbound libtasn1-devel p11-kit-devel OpenIPMI unixODBC

    设置 mysql

    1. vim /etc/my.cnf
    2. innodb_file_per_table = 1
    3. innodb_status_file = 1
    4. innodb_buffer_pool_size = 6G
    5. innodb_flush_log_at_trx_commit = 2
    6. innodb_log_buffer_size = 16M
    7. innodb_log_file_size = 64M
    8. innodb_support_xa = 0
    9. default-storage-engine = innodb
    10. bulk_insert_buffer_size = 8M
    11. join_buffer_size = 16M
    12. max_heap_table_size = 32M
    13. tmp_table_size = 32M
    14. max_tmp_tables = 48
    15. read_buffer_size = 32M
    16. read_rnd_buffer_size = 16M
    17. key_buffer_size = 32M
    18. thread_cache_size = 32
    19. innodb_thread_concurrency = 8
    20. innodb_flush_method = O_DIRECT
    21. innodb_rollback_on_timeout = 1
    22. query_cache_size = 16M
    23. query_cache_limit = 16M
    24. collation_server = utf8_bin
    25. character_set_server = utf8

    原则上 innodb_buffer_pool_size 需要设置为主机内存的 80%,如果主机内存不是 8GB,以上参数可依据相应比例进行调整,例如主机内存为 16GB,则 innodb_buffer_pool_size 建议设置为 12GB,innodb_log_buffer_size 建议设置为 32M,innodb_log_file_size 建议设置为 128M,以此类推.请注意 innodb_buffer_pool_size 的值必须是整数,例如主机内存是4G,那么 innodb_buffer_pool_size 可以设置为 3G,而不能设置为 3.2G

    1. systemctl enable mysqld && systemctl start mysqld
    2. grep 'temporary password' /var/log/mysqld.log # 获取 MySQL 的 root 初始密码
    3. mysql_secure_installation # 初始化,改下密码
    4. systemctl restart mysqld
    5. mysql -u root -p
    6. create database zabbix character set utf8;
    7. exit;
    8. mysql_upgrade -u root -p
    9. mysql -u root -p
    10. create user zabbix@'%' identified by '{mysql_zabbix_password}';
    11. grant all privileges on zabbix.* to zabbix@'%';
    12. flush privileges;
    13. exit;

    安装 zabbix

    1. rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
    2. yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-java-gateway zabbix-web
    3. cd /usr/share/doc/zabbix-server-mysql-4.2.1
    4. zcat create.sql.gz | mysql -uroot zabbix -p
    • 配置 zabbix 参数
      1. vim /etc/zabbix/zabbix_server.conf
      2. DBPassword={mysql_zabbix_password}
      3. CacheSize=512M
      4. HistoryCacheSize=128M
      5. HistoryIndexCacheSize=128M
      6. TrendCacheSize=128M
      7. ValueCacheSize=256M
      8. Timeout=30
      如果需要监控 VMware 虚拟机,则还需要设置以下选项参数:
      1. StartVMwareCollectors=2
      2. VMwareCacheSize=256M
      3. VMwareTimeout=300

    配置 Apache 中的 PHP 参数

    1. vim /etc/httpd/conf.d/zabbix.conf
    2. php_value max_execution_time 600
    3. php_value memory_limit 256M
    4. php_value post_max_size 32M
    5. php_value upload_max_filesize 32M
    6. php_value max_input_time 600
    7. php_value always_populate_raw_post_data -1
    8. date.timezone Asia/Shanghai

    配置 PHP 参数

    1. vim /etc/php.ini
    2. php_value post_max_size 32M
    3. max_execution_time 300
    4. max_input_time 300
    5. date.timezone Asia/Shanghai

    重启&起服务

    1. systemctl stop mysqld && reboot
    2. systemctl start httpd && systemctl start zabbix-server
    3. systemctl stop firewalld
    4. setenforce 0 # 关闭 selinux

    访问 http://ip地址/zabbix/setup.php

    Source & Reference


    容器&虚拟化

    Docker

    更多 Docker 相关知识参考 Docker笔记

    官网

    安装

    • 官方一条命令版(不兼容 kali)

      curl -sSL https://get.docker.com/ | sh
    • CentOS7 下安装

      1. yum install -y yum-utils device-mapper-persistent-data lvm2
      2. wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
      3. sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
      4. yum makecache fast
      5. yum install -y docker
      6. systemctl start docker
    • CentOS8 下安装

      1. dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
      2. dnf list docker-ce
      3. dnf install docker-ce --nobest -y
      4. systemctl start docker
      5. systemctl enable docker
      6. docker --version
    • debian 下安装

      1. apt remove docker docker-engine docker.io
      2. apt-get install -y \
      3. apt-transport-https \
      4. ca-certificates \
      5. curl \
      6. software-properties-common \
      7. gnupg
      8. curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | apt-key add -
      9. echo 'deb https://download.docker.com/linux/debian stretch stable'> /etc/apt/sources.list.d/
      10. apt update
      11. apt install -y docker-ce
      12. docker version
      13. systemctl start docker
      14. docker login # 一般不需要账户登录

    使用

    • 启动,暂停以及启用 Docker

      1. systemctl start docker
      2. systemctl enable docker
      3. systemctl stop docker
      4. systemctl restart docker
    • 拉取镜像

      1. docker image ls # 检查一下系统中已经有了哪些镜像
      2. docker pull nginx # 拉取一个镜像
      3. docker search nginx # 搜索 Docker Hub 中的所有 Nginx 镜像
      4. docker pull jwilder/nginx-proxy # 从非官方源拉取镜像
    • 常用命令

      1. docker version # 查看 docker 版本
      2. docker run -it [docker_image_id] bash # 运行一个容器实例
      3. docker run -d -p 物理端口1:容器端口1 -p 物理端口2:物理端口2 --name 容器名 :
      4. docker run --name=test -p 1234:1234 -itd ubuntu /bin/bash
      5. # 使用本地 1234 端口连接 docker 的 1234 端口运行 ubuntu 镜像,并将其临时命名为 test
      6. # test:为临时名称,可以自定义填写。
      7. # -p: 第一个端口为本机的端口,第二个端口为 Docker 的端口。
      8. # -itd:意思是在后台运行,交互式运行,并且输出当前的信息
      9. # /bin/bash:调用 Shell
      10. docker run -d -p 8080:80 -v 本机路径:容器路径 --name 容器名 : # 磁盘挂载
      11. docker stop [docker_name/docker_id] # 停止容器
      12. docker start [options] container [container...] # 启动一个或多个已停止的容器
      13. docker exec -it [docker_id] bash # 获取容器的 shell
      14. docker kill # 杀死容器
      15. docker commit [docker_id] [docker_image_id] # 提交并保存容器状态
      16. docker logs [options] [docker_name/docker_id] # 查看docker容器日志
      17. docker logs [options] [docker_name/docker_id] --tail 100 # 日志最后的100行
      18. docker inspect --format '{{ .NetworkSettings.IPAddress }}' [docker_name/docker_id] # 查看容器 ip 地址
      19. docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] # 标记本地镜像,将其归入某一仓库。
      20. docker tag centos centos:v1 # 给 centos 镜像打标签
      21. docker tag ubuntu:15.10 test/ubuntu:v3 # 将镜像 ubuntu:15.10 标记为 test/ubuntu:v3 镜像。
      22. docker run -itd centos:v1 # 运行 centos:v1 镜像
      23. docker rm [docker_name/docker_id] # 删除容器
      24. docker rmi $(docker images -f "dangling=true" -q) # 删除 docker 悬空镜像
      25. docker ps # 查看当前运行的 docker 容器的进程信息
      26. docker ps -a # 查看当前容器
      27. docker stats # 统计信息
      28. docker cp xxx.txt [docker_id]:/home # 复制 xxx.txt 到容器的 /home 目录下
      29. docker cp [docker_id]:/home/test.txt /tmp/xxx.txt # 复制容器 /home/text.txt 文件到宿主机 /tmp 目录
      30. docker hisotry [docker_name/docker_id] # 查看指定镜像的创建历史

    容器保活

    1. tail
    2. top
    3. tail -f /var/log/cron.log
    4. init

    加速

    更多内容

    Docker-Compose

    Docker-Compose 是一个部署多个容器的简单但是非常必要的工具.

    项目地址

    安装

    下载二进制包 https://github.com/docker/compose/releases

    然后将文件上传到 /usr/local/bin/ 文件夹下,然后将其重命名为 docker-compose,修改此文件的权限,增加可执行权限

    1. wget https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
    2. mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
    3. chmod +x /usr/local/bin/docker-compose

    或直接采用 pip 安装

    pip3 install docker-compose
    1. docker-compose build
    2. docker-compose up -d
    3. docker-compose stop
    1. docker-compose ps # 查看当前的使用 docker-compose up -d 开启的容器进程信息
    2. docker-compose up -d # 使用本地的 docker-compose.yml 开启相关的容器
    3. docker-compose down # 终止当前的使用 docker-compose up -d 开启的容器
    4. docker-compose exec [service] sh # 进入容器内

    常见报错

    • ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule

      原因是关闭防火墙之后 docker 需要重启,执行以下命令重启 docker 即可:

      1. systemctl daemon-reload
      2. service docker restart
    • ERROR: Service 'xxxxxx' failed to build : Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on xx.xx.xx.xx: server misbehaving

      dns 服务器的错误,把 dns 服务器改下就行

      1. vim /etc/resolv.conf
      2. nameserver 1.1.1.1
    • [3927] Error loading Python lib '/tmp/_MEIuQps8Y/libpython3.9.so.1.0': dlopen: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /tmp/_MEIuQps8Y/libpython3.9.so.1.0)

      python 版本的问题, 换 python3.7 以上或用 pip 安装即可

    更多内容

    Docker-Portainer

    Portainer 是 Docker 一款可视化管理用具,部署简单,推荐。

    官网

    部署

    1. docker pull portainer/portainer # 拉取镜像
    2. docker volume create portainer_data
    3. docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce # 部署

    访问 ip:9000 进入到设置密码界面.

    ctop

    用于 docker 版的 top

    仓库地址


    Kubernetes

    kubectl

    显示和查找资源

    1. kubectl get services # 列出所有 namespace 中的所有 service
    2. kubectl get pods -A # 列出所有 namespace 中的所有 pod
    3. kubectl get pods -o wide # 列出所有 pod 并显示详细信息
    4. kubectl get deployment -A # 列出所有 deployment

    与运行中的 Pod 交互

    1. kubectl logs my-pod # 获取 pod 日志(标准输出)
    2. kubectl logs -l name=myLabel # 获取含 name=myLabel 标签的 Pods 的日志(标准输出)
    3. kubectl logs my-pod --previous # 获取上个容器实例的 pod 日志(标准输出)
    4. kubectl logs my-pod -c my-container # 获取 Pod 容器的日志(标准输出, 多容器场景)
    5. kubectl logs -l name=myLabel -c my-container # 获取含 name=myLabel 标签的 Pod 容器日志(标准输出, 多容器场景)
    6. kubectl logs my-pod -c my-container --previous # 获取 Pod 中某容器的上个实例的日志(标准输出, 多容器场景)
    7. kubectl logs -f my-pod # 流式输出 Pod 的日志(标准输出)
    8. kubectl logs -f my-pod -c my-container # 流式输出 Pod 容器的日志(标准输出, 多容器场景)
    9. kubectl logs -f -l name=myLabel --all-containers # 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出)
    10. kubectl run -i --tty busybox --image=busybox:1.28 -- sh # 以交互式 Shell 运行 Pod
    11. kubectl run nginx --image=nginx -n mynamespace # 在 “mynamespace” 命名空间中运行单个 nginx Pod
    12. kubectl run nginx --image=nginx # 运行 ngins Pod 并将其规约写入到名为 pod.yaml 的文件
    13. --dry-run=client -o yaml > pod.yaml
    14. kubectl attach my-pod -i # 挂接到一个运行的容器中
    15. kubectl port-forward my-pod 5000:6000 # 在本地计算机上侦听端口 5000 并转发到 my-pod 上的端口 6000
    16. kubectl exec my-pod -- ls / # 在已有的 Pod 中运行命令(单容器场景)
    17. kubectl exec --stdin --tty my-pod -- /bin/sh # 使用交互 shell 访问正在运行的 Pod (一个容器场景)
    18. kubectl exec my-pod -c my-container -- ls / # 在已有的 Pod 中运行命令(多容器场景)
    19. kubectl top pod POD_NAME --containers # 显示给定 Pod 和其中容器的监控数据
    20. kubectl top pod POD_NAME --sort-by=cpu # 显示给定 Pod 的指标并且按照 'cpu' 或者 'memory' 排序

    从容器中复制文件和目录

    1. kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir # 将 /tmp/foo_dir 本地目录复制到远程当前命名空间中 Pod 中的 /tmp/bar_dir
    2. kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container # 将 /tmp/foo 本地文件复制到远程 Pod 中特定容器的 /tmp/bar 下
    3. kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar # 将 /tmp/foo 本地文件复制到远程 “my-namespace” 命名空间内指定 Pod 中的 /tmp/bar
    4. kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar # 将 /tmp/foo 从远程 Pod 复制到本地 /tmp/bar

    kubectl cp 要求容器镜像中存在 “tar” 二进制文件。如果 “tar” 不存在,kubectl cp 将失败

    与节点和集群进行交互

    1. kubectl cordon my-node # 标记 my-node 节点为不可调度
    2. kubectl drain my-node # 对 my-node 节点进行清空操作,为节点维护做准备
    3. kubectl uncordon my-node # 标记 my-node 节点为可以调度
    4. kubectl top node my-node # 显示给定节点的度量值
    5. kubectl cluster-info # 显示主控节点和服务的地址
    6. kubectl cluster-info dump # 将当前集群状态转储到标准输出
    7. kubectl cluster-info dump --output-directory=/path/to/cluster-state # 将当前集群状态输出到 /path/to/cluster-state
    8. # 如果已存在具有指定键和效果的污点,则替换其值为指定值。
    9. kubectl taint nodes foo dedicated=special-user:NoSchedule

    QEMU

    QEMU 是一款开源的模拟器及虚拟机监管器。QEMU 主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机监管器,模拟全系统,利用其他VMM(Xen, KVM, etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机。

    官网

    项目地址

    安装

    • Centos下

      yum install -y qemu
    • Ubuntu下

      apt-get install -y qemu

    分布式

    ZooKeeper

    这个Logo是什么鬼啊🤣🤣🤣,笑死我了

    官网

    安装

    依赖 jdk,安装过程见 JDK

    zookeeper 支持两种运行模式:独立模式(standalone)和复制模式(replicated).

    真正用于生产环境的 Zookeeper 肯定都是使用复制模式的,这样做可以避免单点问题.想要使用复制模式,但由于没有富余的机器能够使用,所以可以在单台机器上通过配置来使用复制模式,从而模拟真实的集群环境.

    由于 Zookeeper 集群是通过多数选举的方式产生 leader 的,因此,集群需要奇数个 Zookeeper 实例组成,也就是说至少需要3台(1台不能算"群").

    这里配置的为 独立模式

    1. wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
    2. mkdir /usr/local/zookeeper
    3. tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/zookeeper/
    4. cd /usr/local/zookeeper/zookeeper-3.4.14/conf/
    5. cp zoo_sample.cfg zoo.cfg

    创建数据存储目录与日志目录

    1. mkdir /usr/local/zookeeper/zookeeper-3.4.14/dataDir
    2. mkdir /usr/local/zookeeper/zookeeper-3.4.14/dataLogDir

    修改数据存储和日志目录

    1. vim /usr/local/zookeeper/zookeeper-3.4.14/conf/zoo.cfg
    2. dataDir=/usr/local/zookeeper/zookeeper-3.4.14/dataDir
    3. dataLogDir=/usr/local/zookeeper/zookeeper-3.4.14/dataLogDir
    1. # 启动
    2. /usr/local/zookeeper/zookeeper-3.4.14/bin/zkServer.sh start
    3. # 连接
    4. /usr/local/zookeeper/zookeeper-3.4.14/bin/zkCli.sh

    安全服务

    ClamAV

    一个开源防病毒引擎,用于检测木马,病毒,恶意软件和其他恶意威胁.

    官网

    编译安装

    推荐编译安装,时间长点,起码步骤不繁琐

    安装

    1. yum -y install gcc-c++ pcre-devel zlib-devel openssl-devel llvm-devel libxml2 libxml2-devel libcurl-devel libcurl
    2. wget https://www.clamav.net/downloads/production/clamav-0.102.2.tar.gz
    3. tar -zxvf clamav-0.102.2.tar.gz
    4. cd clamav-0.102.2
    5. ./configure --prefix=/opt/clamav --disable-clamonacc # 忽略 libcurl 库的更新问题
    6. make && make install
    1. # 添加用户组 clamav 和组成员 clamav
    2. groupadd clamav
    3. useradd -g clamav -s /bin/false clamav
    4. # 创建目录
    5. mkdir /opt/clamav/logs
    6. mkdir /opt/clamav/updata
    7. # 创建文件
    8. touch /opt/clamav/logs/freshclam.log
    9. touch /opt/clamav/logs/clamd.log
    10. # 初始化配置文件
    11. cp /opt/clamav/etc/clamd.conf.sample /opt/clamav/etc/clamd.conf
    12. cp /opt/clamav/etc/freshclam.conf.sample /opt/clamav/etc/freshclam.conf

    编辑配置文件

    1. vim /opt/clamav/etc/clamd.conf
    2. # Example 注释掉这一行
    3. 增加以下内容
    4. LogFile /opt/clamav/logs/clamd.log
    5. PidFile /opt/clamav/updata/clamd.pid
    6. DatabaseDirectory /opt/clamav/updata
    1. vim /opt/clamav/etc/freshclam.conf
    2. # Example 注释掉这一行

    升级病毒库

    1. mkdir -p /opt/clamav/share/clamav
    2. chown clamav:clamav /opt/clamav/share/clamav
    3. /opt/clamav/bin/freshclam

    使用

    1. /opt/clamav/bin/clamscan -h # 查看相应的帮助信息
    2. /opt/clamav/bin/clamscan -r / # 扫描计算机上的所有文件并且显示所有的文件的扫描结果
    3. /opt/clamav/bin/clamscan -r --bell -i /. # 扫描计算机上的所有文件并且显示有问题的文件的扫描结果
    4. /opt/clamav/bin/clamscan -r /home # 扫描所有用户的主目录

    yum 安装

    以下部分内容来自 [Centos7安装和使用ClamAV杀毒软件]

    1. yum install -y epel-release
    2. yum install -y clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd
    3. # 在两个配置文件 /etc/freshclam.conf 和 /etc/clamd.d/scan.conf 中移除"Example"字符
    4. cp /etc/freshclam.conf /etc/freshclam.conf.bak
    5. sed -i -e "s/^Example/#Example/" /etc/freshclam.conf
    6. cp /etc/clamd.d/scan.conf /etc/clamd.d/scan.conf.bak
    7. sed -i -e "s/^Example/#Example/" /etc/clamd.d/scan.conf

    关闭自动更新,freshclam 命令通过文件 /etc/cron.d/clamav-update 来自动运行

    但默认情况下是禁止了自动更新功能,需要移除文件 /etc/sysconfig/freshclam 最后一行的配置才能启用

    1. vim /etc/sysconfig/freshclam
    2. # FRESHCLAM_DELAY=

    定义服务器类型 (本地或者 TCP) ,在这里定义为使用本地 socket,将文件 /etc/clam.d/scan.conf 中的这一行前面的注释符号去掉:

    1. vim /etc/clamd.d/scan.conf
    2. LocalSocket /var/run/clamd.scan/clamd.sock

    下载病毒库 https://www.clamav.net/downloads 将 main.cvd\daily.cvd\bytecode.cvd 三个文件下载后上传到 /var/lib/clamav 目录下

    1. wget http://database.clamav.net/main.cvd
    2. wget http://database.clamav.net/daily.cvd
    3. wget http://database.clamav.net/bytecode.cvd
    4. mv main.cvd /var/lib/clamav -f
    5. mv daily.cvd /var/lib/clamav -f
    6. mv bytecode.cvd /var/lib/clamav -f
    1. vim /etc/freshclam.conf
    2. DatabaseDirectory /var/lib/clamav
    1. systemctl enable clamd@scan.service
    2. ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'

    更新病毒库

    1. vim /usr/lib/systemd/system/clam-freshclam.service
    2. # Run the freshclam as daemon
    3. [Unit]
    4. Description = freshclam scanner
    5. After = network.target
    6. [Service]
    7. Type = forking
    8. ExecStart = /usr/bin/freshclam -d -c 4
    9. Restart = on-failure
    10. PrivateTmp = true
    11. [Install]
    12. WantedBy=multi-user.target
    1. systemctl start clam-freshclam.service
    2. systemctl status clam-freshclam.service
    3. freshclam
    4. systemctl enable clam-freshclam.service
    5. cp /usr/share/clamav/template/clamd.conf /etc/clamd.conf
    1. vim /etc/clamd.conf
    2. TCPSocket 3310
    3. TCPAddr 127.0.0.1
    1. /usr/sbin/clamd restart
    2. clamdscan -V
    3. systemctl start clamd@scan.service
    4. systemctl status clamd@scan.service

    查看病毒库版本

    clamdscan -V

    升级病毒库

    freshclam --verbose

    查杀病毒

    1. clamscan -r /home # 扫描所有用户的主目录就使用
    2. clamscan -r --bell -i / # 扫描所有文件并且显示有问题的文件的扫描结果
    3. clamscan -r --remove # 查杀当前目录并删除感染的文件
    4. # 递归扫描 home 目录,并且记录日志
    5. clamscan -r -i /home -l /var/log/clamscan.log
    6. # 递归扫描 home 目录,将病毒文件删除,并且记录日志
    7. clamscan -r -i /home --remove -l /var/log/clamscan.log
    8. # 扫描指定目录,然后将感染文件移动到指定目录,并记录日志
    9. clamscan -r -i /home --move=/opt/infected -l /var/log/clamscan.log

    Fail2Ban

    禁止导致多次身份验证错误的主机

    项目地址

    以下部分内容来自 [如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击]

    安装

    • RHEL

      yum install -y fail2ban
    • Debian

      apt install -y fail2ban

    编辑配置文件

    1. vim /etc/fail2ban/jail.conf
    2. [DEFAULT]
    3. # 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
    4. # 用于指定哪些地址可以忽略 fail2ban 防御
    5. ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24
    6. # 客户端主机被禁止的时长 (秒) ,-1代表永远
    7. bantime = 10m
    8. # 客户端主机被禁止前允许失败的次数
    9. maxretry = 5
    10. # 间隔时间 (秒) ,间隔时间内超过最大尝试次数即被封锁
    11. findtime = 10m
    12. mta = sendmail
    13. [ssh-iptables]
    14. enabled = true
    15. filter = sshd
    16. action = iptables[name=SSH, port=ssh, protocol=tcp]
    17. sendmail-whois[name=SSH, dest=your@email.com, sender=fail2ban@email.com]
    18. # Debian 系的发行版
    19. logpath = /var/log/auth.log
    20. # Red Hat 系的发行版
    21. logpath = /var/log/secure
    22. # ssh 服务的最大尝试次数
    23. maxretry = 3

    根据上述配置,fail2ban 会自动禁止在最近 10 分钟内有超过 3 次访问尝试失败的任意 IP 地址.一旦被禁,这个 IP 地址将会在 24 小时内一直被禁止访问 SSH 服务.这个事件也会通过 sendemail 发送邮件通知.

    测试

    1. service fail2ban restart
    2. # 为了验证 fail2ban 成功运行,使用参数'ping'来运行 fail2ban-client 命令. 如果 fail2ban 服务正常运行,你可以看到"pong (嘭) "作为响应.
    3. fail2ban-client ping

    为了测试 fail2ban 是否能正常工作,尝试通过使用错误的密码来用 SSH 连接到服务器模拟一个暴力破解攻击.与此同时,监控 /var/log/fail2ban.log ,该文件记录在 fail2ban 中发生的任何敏感事件.

    1. tail -f /var/log/fail2ban.log
    2. 2019-07-24 23:33:34,369 fail2ban.jail [14760]: INFO Initiated 'pyinotify' backend
    3. 2019-07-24 23:33:34,370 fail2ban.filter [14760]: INFO maxLines: 1
    4. 2019-07-24 23:33:34,372 fail2ban.server [14760]: INFO Jail ssh-iptables is not a JournalFilter instance
    5. 2019-07-24 23:33:34,373 fail2ban.filter [14760]: INFO Added logfile: '/var/log/auth.log' (pos = 0, hash = de62b1aacfb0f9a9082c515fe3cdb77214101d93)
    6. 2019-07-24 23:33:34,377 fail2ban.filter [14760]: INFO encoding: UTF-8
    7. 2019-07-24 23:33:34,378 fail2ban.filter [14760]: INFO maxRetry: 3
    8. 2019-07-24 23:33:34,378 fail2ban.filter [14760]: INFO findtime: 600
    9. 2019-07-24 23:33:34,378 fail2ban.actions [14760]: INFO banTime: 600
    10. 2019-07-24 23:33:34,381 fail2ban.jail [14760]: INFO Jail 'sshd' started
    11. 2019-07-24 23:33:34,382 fail2ban.jail [14760]: INFO Jail 'ssh-iptables' started
    12. 2019-07-24 23:35:58,780 fail2ban.filter [14760]: INFO [ssh-iptables] Found 192.168.72.130 - 2019-07-24 23:35:58
    13. 2019-07-24 23:36:00,397 fail2ban.filter [14760]: INFO [ssh-iptables] Found 192.168.72.130 - 2019-07-24 23:36:00
    14. 2019-07-24 23:36:03,811 fail2ban.filter [14760]: INFO [sshd] Found 192.168.72.130 - 2019-07-24 23:35:58
    15. 2019-07-24 23:36:03,812 fail2ban.filter [14760]: INFO [sshd] Found 192.168.72.130 - 2019-07-24 23:36:00
    16. 2019-07-24 23:36:04,266 fail2ban.filter [14760]: INFO [sshd] Found 192.168.72.130 - 2019-07-24 23:36:04
    17. 2019-07-24 23:36:04,310 fail2ban.filter [14760]: INFO [ssh-iptables] Found 192.168.72.130 - 2019-07-24 23:36:04
    18. 2019-07-24 23:36:04,778 fail2ban.actions [14760]: NOTICE [ssh-iptables] Ban 192.168.72.130

    根据上述的日志文件,Fail2ban 通过检测 IP 地址的多次失败登录尝试,禁止了一个 IP 地址 192.168.72.130

    解禁 IP

    由于 fail2ban 的"ssh-iptables"监狱使用 iptables 来阻塞问题 IP 地址,你可以通过以下方式来检测当前 iptables 来验证禁止规则.

    1. iptables --list -n
    2. iptables -D fail2ban-SSH -s 192.168.72.130 -j DROP

    当然你可以使用上述的 iptables 命令手动地检验和管理 fail2ban 的 IP 阻塞列表,但实际上有一个适当的方法就是使用 fail2ban-client 命令行工具.这个命令不仅允许你对"ssh-iptables"监狱进行管理,同时也是一个标准的命令行接口,可以管理其他类型的 fail2ban 监狱.

    1. fail2ban-client status # 检验 fail2ban 状态
    2. fail2ban-client status ssh-iptables # 检验一个特定监狱的状态
    3. fail2ban-client set ssh-iptables unbanip 192.168.72.130 # 解锁特定的 IP 地址

    注意,如果你停止了 Fail2ban 服务,那么所有的 IP 地址都会被解锁.当你重启 Fail2ban,它会从 /etc/log/secure(或 /var/log/auth.log)中找到异常的 IP 地址列表,如果这些异常地址的发生时间仍然在禁止时间内,那么 Fail2ban 会重新将这些 IP 地址禁止.


    OpenLDAP

    OpenLDAP 是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的自由和开源的实现,在其 OpenLDAP 许可证下发行,并已经被包含在众多流行的 Linux 发行版中。

    以下部分内容来自 [Centos7 搭建openldap完整详细教程] 仅作排版处理和部分内容处理

    安装

    1. yum install -y openldap openldap-clients openldap-servers
    2. # 复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错
    3. cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
    4. # 授权给 ldap 用户,此用户 yum 安装时便会自动创建
    5. chown -R ldap. /var/lib/ldap/DB_CONFIG
    1. systemctl start slapd # 启动服务,先启动服务,配置后面再进行修改
    2. systemctl enable slapd
    3. systemctl status slapd # 查看状态,正常启动则ok

    修改配置

    openldap2.4.23 版本开始,所有配置都保存在 /etc/openldap/slapd.d 目录下的 cn=config 文件夹内,不再使用 slapd.conf 作为配置文件。配置文件的后缀为 ldif,且每个配置文件都是通过命令自动生成的,任意打开一个配置文件,在开头都会有一行注释,说明此为自动生成的文件,请勿编辑,使用 ldapmodify 命令进行修改 # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

    安装 openldap 后,会有三个命令用于修改配置文件,分别为 ldapadd, ldapmodify, ldapdelete,顾名思义就是添加,修改和删除。而需要修改或增加配置时,则需要先写一个 ldif 后缀的配置文件,然后通过命令将写的配置更新到 slapd.d 目录下的配置文件中去

    生成管理员密码

    1. slappasswd -s 123456
    2. {SSHA}qG8fxSKCrgt0KiN8cwQMzvymgQLJeh/k

    新增修改密码文件,ldif 为后缀,文件名随意,不要在 /etc/openldap/slapd.d/ 目录下创建类似文件,生成的文件为需要通过命令去动态修改 ldap 现有配置,如下

    1. cd ~
    2. vim changepwd.ldif
    3. + dn: olcDatabase={0}config,cn=config
    4. + changetype: modify
    5. + add: olcRootPW
    6. + olcRootPW: {SSHA}qG8fxSKCrgt0KiN8cwQMzvymgQLJeh/k
    • 第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。你到 /etc/openldap/slapd.d/ 目录下就能找到此文件
    • 第二行 changetype 指定类型为修改
    • 第三行 add 表示添加 olcRootPW 配置项
    • 第四行指定 olcRootPW 配置项的值

    在执行下面的命令前,你可以先查看原本的 olcDatabase={0}config 文件,里面是没有 olcRootPW 这个项的,执行命令后,你再看就会新增了 olcRootPW 项,而且内容是我们文件中指定的值加密后的字符串

    执行命令,修改 ldap 配置,通过 -f 执行文件

    ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif

    执行修改命令后,有类似如下输出则为正常

    1. SASL/EXTERNAL authentication started
    2. SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    3. SASL SSF: 0
    4. modifying entry "olcDatabase={0}config,cn=config"

    查看 olcDatabase={0}config 内容,应该会新增了一个 olcRootPW 项

    cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif

    上面就是一个完整的修改配置的过程,切记不能直接修改 /etc/openldap/slapd.d/ 目录下的配置。

    我们需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于 /etc/openldap/schema/ 目录中,schema 控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入,

    依次执行下面的命令,导入基础的一些配置,我这里将所有的都导入一下,其中 core.ldif 是默认已经加载了的,不用导入

    1. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
    2. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
    3. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
    4. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
    5. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
    6. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
    7. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
    8. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
    9. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
    10. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
    11. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
    12. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

    修改域名,新增 changedomain.ldif, 这里我自定义的域名为 fox.com,管理员用户账号为 admin。

    如果要修改,则修改文件中相应的 dc=fox,dc=com 为自己的域名

    1. vim changedomain.ldif
    2. + dn: olcDatabase={1}monitor,cn=config
    3. + changetype: modify
    4. + replace: olcAccess
    5. + olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=fox,dc=com" read by * none
    6. + dn: olcDatabase={2}hdb,cn=config
    7. + changetype: modify
    8. + replace: olcSuffix
    9. + olcSuffix: dc=fox,dc=com
    10. + dn: olcDatabase={2}hdb,cn=config
    11. + changetype: modify
    12. + replace: olcRootDN
    13. + olcRootDN: cn=admin,dc=fox,dc=com
    14. + dn: olcDatabase={2}hdb,cn=config
    15. + changetype: modify
    16. + replace: olcRootPW
    17. + olcRootPW: {SSHA}qG8fxSKCrgt0KiN8cwQMzvymgQLJeh/k
    18. + dn: olcDatabase={2}hdb,cn=config
    19. + changetype: modify
    20. + add: olcAccess
    21. + olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=fox,dc=com" write by anonymous auth by self write by * none
    22. + olcAccess: {1}to dn.base="" by * read
    23. + olcAccess: {2}to * by dn="cn=admin,dc=fox,dc=com" write by * read

    执行命令,修改配置

    ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldif

    然后,启用 memberof 功能,新增 add-memberof.ldif, 开启 memberof 支持并新增用户支持 memberof 配置

    1. vim add-memberof.ldif
    2. + dn: cn=module{0},cn=config
    3. + cn: modulle{0}
    4. + objectClass: olcModuleList
    5. + objectclass: top
    6. + olcModuleload: memberof.la
    7. + olcModulePath: /usr/lib64/openldap
    8. + dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
    9. + objectClass: olcConfig
    10. + objectClass: olcMemberOf
    11. + objectClass: olcOverlayConfig
    12. + objectClass: top
    13. + olcOverlay: memberof
    14. + olcMemberOfDangling: ignore
    15. + olcMemberOfRefInt: TRUE
    16. + olcMemberOfGroupOC: groupOfUniqueNames
    17. + olcMemberOfMemberAD: uniqueMember
    18. + olcMemberOfMemberOfAD: memberOf

    新增 refint1.ldif 文件

    1. vim refint1.ldif
    2. + dn: cn=module{0},cn=config
    3. + add: olcmoduleload
    4. + olcmoduleload: refint

    新增 refint2.ldif 文件

    1. vim refint2.ldif
    2. + dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
    3. + objectClass: olcConfig
    4. + objectClass: olcOverlayConfig
    5. + objectClass: olcRefintConfig
    6. + objectClass: top
    7. + olcOverlay: refint
    8. + olcRefintAttribute: memberof uniqueMember manager owner

    依次执行下面命令,加载配置,顺序不能错

    1. ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
    2. ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
    3. ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif

    到此,配置修改完了,在上述基础上,我们来创建一个叫做 fox company 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元,新增配置文件

    1. vim base.ldif
    2. + dn: dc=fox,dc=com
    3. + objectClass: top
    4. + objectClass: dcObject
    5. + objectClass: organization
    6. + o: Fox Company
    7. + dc: fox
    8. + dn: cn=admin,dc=fox,dc=com
    9. + objectClass: organizationalRole
    10. + cn: admin
    11. + dn: ou=People,dc=fox,dc=com
    12. + objectClass: organizationalUnit
    13. + ou: People
    14. + dn: ou=Group,dc=fox,dc=com
    15. + objectClass: organizationalRole
    16. + cn: Group

    执行命令,添加配置, 这里要注意修改域名为自己配置的域名,然后需要输入上面我们生成的密码

    1. ldapadd -x -D cn=admin,dc=fox,dc=com -W -f base.ldif
    2. # 这里是 123456

    通过以上的所有步骤,我们就设置好了一个 LDAP 目录树:其中基准 dc=fox,dc=com 是该树的根节点,其下有一个管理域 cn=admin,dc=fox,dc=com 和两个组织单元 ou=People,dc=fox,dc=com 及 ou=Group,dc=fox,dc=com。

    测试连接

    这里先关一下防火墙

    service firewalld stop

    连接工具使用 LdapAdmin

    PhpLdapAdmin

    以下部分内容来自 [LDAP安装和基本管理手记] 仅作排版处理和部分内容处理

    1. yum -y install epel-release
    2. yum -y install httpd
    3. yum -y install phpldapadmin
    1. vim /etc/httpd/conf.d/phpldapadmin.conf
    2. + Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
    3. + Alias /ldapadmin /usr/share/phpldapadmin/htdocs
    4. +
    5. +
    6. + # Apache 2.4
    7. + Require all granted
    8. + Allow from all
    9. +
    10. +
    11. + # Apache 2.2
    12. + Order Deny,Allow
    13. + Allow from all
    14. +
    15. +
    1. vim /etc/phpldapadmin/config.php
    2. # 去掉注释 并删除原来的配置
    3. + $servers->setValue('login','attr','dn');
    4. - $servers->setValue('login','attr','uid');
    1. #重启服务
    2. systemctl restart httpd

    访问 http://ip/ldapadmin,点击登录。CN 填写域信息cn=admin,dc=fox,dc=com,密码填写自己设置的密码。


    Snort

    Snort 搭建与使用内容访问 安防设施搭建使用 Snort 部分


    Suricata

    Suricata 搭建与使用内容访问 安防设施搭建使用 Suricata 部分


    tripwire

    描述

    当服务器遭到黑客攻击时,在多数情况下,黑客可能对系统文件等等一些重要的文件进行修改。对此,我们用 Tripwire 建立数据完整性监测系统。虽然 它不能抵御黑客攻击以及黑客对一些重要文件的修改,但是可以监测文件是否被修改过以及哪些文件被修改过,从而在被攻击后有的放矢的策划出解决办法。

    Tripwire 的原理是 Tripwire 被安装、配置后,将当前的系统数据状态建立成数据库,随着文件的添加、删除和修改等等变化,通过系统数据现 状与不断更新的数据库进行比较,来判定哪些文件被添加、删除和修改过。正因为初始的数据库是在 Tripwire 本体被安装、配置后建立的原因,我们务必应 该在服务器开放前,或者说操作系统刚被安装后用 Tripwire 构建数据完整性监测系统。

    Tripwire 可以对要求校验的系统文件进行类似 md5 的运行,而生成一个唯一的标识,即 "快照"snapshot。当这些系统文件的大小、inode 号、权限、时间等任意属性被修改后,再次运行 Tripwire,其会进行前后属性的对比,并生成相关的详细报告。

    项目地址

    安装

    1. yum install -y gcc-c++
    2. yum install -y glibc-headers
    3. # 下载
    4. wget https://jaist.dl.sourceforge.net/project/tripwire/tripwire-src/tripwire-2.4.2.2/tripwire-2.4.2.2-src.tar.bz2
    5. # 解压
    6. tar -jxvf tripwire-2.4.2.2-src.tar.bz2
    7. cd tripwire-2.4.2.2-src
    8. ./configure --prefix=/opt/tripwire # 设置安装目录
    9. # 编译并安装
    10. make
    11. make install
    1. license agreement. [do not accept] accept # 输入 "accept" 同意协议。
    2. Continue with installation? [y/n] y # 键入 y 继续安装。
    3. Enter the site keyfile passphrase: # 输入 "site keyfile" 口令(输入后不会显示),并且记住这个口令。
    4. Verify the site keyfile passphrase: # 再次确认 "site keyfile" 口令。
    5. Enter the local keyfile passphrase: # 输入 "local keyfile" 口令(输入后不会显示),并且记住这个口令。
    6. Verify the local keyfile passphrase: # 再次确认 "local keyfile" 口令。
    7. Please enter your site passphrase: # 输入 "site keyfile" 口令(输入后不会显示)第一次。
    8. Please enter your site passphrase: # 输入 "site keyfile" 口令(输入后不会显示)第二次。

    文件说明

    配置文件:定义数据库、策略文件和 Tripwire 可执行文件的位置:

    /opt/tripwire/etc/twcfg.txt

    策略:定义检测的对象及违规时采取的行为:

    /opt/tripwire/etc/twpol.txt

    数据库:用于存放生成的快照:

    /opt/tripwire/lib/tripwire/$(HOSTNAME).twd

    Tripwire 为了自身的安全,防止自身被篡改,也会对自身进行加密和签名处理。其中,包括两个密钥:

    • site 密钥:用于保护策略文件和配置文件,只要使用相同的策略和配置的机器,都可以使用相同的 site 密钥:
      /usr/local/tripwire/etcsite.key
    • local 密钥:用户保护数据库和分析报告,这肯定不会重复的:
      /usr/local/tripwire/etc/$(HOSTNAME)-local.key

    设置 tripwire

    编辑 twcfg.txt 文件

    1. vim /opt/tripwire/etc/twcfg.txt
    2. LOOSEDIRECTORYCHECKING =false  # 将 false 的值变为 true(不监测所属目录的数据完整性)
    3. LOOSEDIRECTORYCHECKING =true   # 变为此状态
    4. REPORTLEVEL =3  # 将3变为4(改变监测结果报告的等级)
    5. REPORTLEVEL =4  # 变为此状态

    建立加密格式

    1. cd /opt/tripwire/etc
    2. /opt/tripwire/sbin/twadmin --create-cfgfile -S site.key twcfg.txt # 从文本配置文件建立加密格式配
    3. Please enter your site passphrase: # 输入“site keyfile”口令

    初始化数据库

    1. /opt/tripwire/sbin/tripwire --init # 初始化数据库
    2. Please enter your local passphrase: # 输入“local keyfile”口令

    更新数据库

    当你更新了 twpol.txt 后需用此命令更新数据库

    1. cd /opt/tripwire
    2. ./sbin/tripwire --update-policy --secure-mode low /opt/tripwire/etc/twpol.txt
    3. Please enter your local passphrase: # 输入“local keyfile”口令
    4. Please enter your site passphrase: # 输入“site keyfile”口令

    检查文件异动

    安装完 tripwire 后你可以定期检查文件是否存在异动。加上 interactive 在当前显示结果。

    /sbin/tripwire --check --interactive

    查看报告

    所有 tripwire 的报告以 .twr 后缀保存在 lib/tripwire 目录下,需要使用 twprint 命令来转化成文本格式。

    ./sbin/twprint --print-report --twrfile /lib/tripwire/report/localhost.localdomain-20111225-154220.twr>/tmp/tripwire_readable.txt

    软件包方式安装

    还有一种方法是软件包安装

    yum -y install tripwire

    注 : 软件包安装的配置文件在 /etc/tripwire

    使用软件包安装需要手动生成密钥文件

    tripwire-setup-keyfiles

    该命令将生成两个密钥文件“site-key”和“local-key”,

    使用下面的命令从 tripwire 生成日志错误。

    sudo sh -c "tripwire --check | grep Filename > no-directory.txt"

    所有不存在系统上的目录和文件都列在文件'mo-directory.txt'中

    cat no-directory.txt

    使用以下 bash 脚本编辑 tripwire 配置'twpol.txt'

    1. for f in $(grep "Filename:" no-directory.txt | cut -f2 -d:); do
    2. sed -i "s|\($f\) |#\\1|g" /etc/tripwire/twpol.txt
    3. done

    初始化 tripwire 数据库

    1. twadmin -m P /etc/tripwire/twpol.txt # 使用 twadmin 命令重新生成并重新签署 tripwire配置
    2. tripwire --init

    其余使用和编译安装无异,更多详情请参考 https://www.howtoing.com/monitoring-and-detecting-modified-files-using-tripwire-on-centos-7


    设施配置

    f8x

    描述

    大多数场景下,在不同的云购买一些 vps 服务器用于部署红 / 蓝队设施,不能做到开箱即用,使用 f8x 可以快速部署所需要的各类服务。同时兼顾到本地 VM 虚拟机的需求,可以选择走 socket 代理进行安装部署,Proxychains-ng 也会自动安装,只需做好 Proxychains-ng 配置即可。

    项目地址

    安装

    1. wget -O f8x https://f8x.io/ && mv --force f8x /usr/local/bin/f8x && chmod +x /usr/local/bin/f8x
    2. f8x -h

    安装基础工具

    f8x -b

    安装渗透环境

    f8x -k

    安装python3.9

    f8x -py39

    安装 oraclejdk11

    f8x -oracle11

    更多内容

    terraform

    描述

    Terraform 是一个 IT 基础架构自动化编排工具。具体的说就是可以用代码来管理维护 IT 资源,比如针对 AWS,我们可以用它创建,修改,删除 S3 Bucket, Lambda, EC2 实例,Kinesis, VPC 等各种资源。并且在真正运行之前可以看到执行计划(即干运行-dryrun)。由于状态保存到文件中,因此能够离线方式查看资源情况。

    项目地址

    安装

    1. wget https://releases.hashicorp.com/terraform/1.2.1/terraform_1.2.1_linux_amd64.zip
    2. unzip terraform_1.2.1_linux_amd64.zip
    3. mv --force terraform /usr/local/bin/terraform > /dev/null 2>&1 && chmod +x /usr/local/bin/terraform
    4. terraform -h

    更多内容


    pulumi

    项目地址

    安装

    curl -fsSL https://get.pulumi.com | sh -s -- --version 3.37.2

    aliyun-cli

    下载

    1. https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz?file=aliyun-cli-linux-latest-amd64.tgz
    2. https://github.com/aliyun/aliyun-cli/releases

    各种依赖和报错

    libboost-program-options1.58.0

    1. echo "deb http://cz.archive.ubuntu.com/ubuntu xenial main" >> /etc/apt/sources.list
    2. apt update && apt install -y libboost-program-options1.58.0

    libsodium18

    1. wget https://download.opensuse.org/repositories/home:/nsec/xUbuntu_16.04/amd64/libsodium18_1.0.11-1_amd64.deb
    2. dpkg -i libsodium18_1.0.11-1_amd64.deb

    ERROR: pkg-config binary 'pkg-config' not found

    apt-get install -y pkg-config

    make: *** /lib/modules/3.10.0-1062.18.1.el7.x86_64/build: No such file or directory. Stop.

    没安装内核安装包

    1. # Ubuntu
    2. apt install -y kernel-devel
    3. # Centos
    4. yum install -y kernel-devel
    5. # 找到对应内核开发文件
    6. ls -l /usr/src/kernels/
    7. cd /lib/modules/3.10.0-1062.18.1.el7.x86_64/
    8. # 删除链接
    9. rm -r build
    10. # 重新链接
    11. ln -s /usr/src/kernels/3.10.0-1160.6.1.el7.x86_64/ build

    LuaJIT

    描述

    LuaJIT 是采用 C 语言写的 Lua 代码的解释器,LuaJIT 试图保留 Lua 的精髓--轻量级,高效和可扩展。

    官网地址

    安装

    1. wget https://luajit.org/download/LuaJIT-2.0.5.tar.gz
    2. tar -zxf LuaJIT-2.0.5.tar.gz
    3. cd LuaJIT-2.0.5/
    4. make && make install

    点击关注,共同学习!安全狗的自我修养

    github haidragon

    https://github.com/haidragon

  • 相关阅读:
    13-security其他.md
    JavaScript之事件
    HCM 初学 ( 三 ) - 快速输入PA70、PA71 浏览员工信息PA10
    SQL server查询08-20点的时间段时间
    OAK-FFC-4P全网首次测试
    介绍:C语言—atoi函数
    金九银十要来了,各大公司Java后端开发真题汇总 加油
    【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)
    业务定制型异地多活架构设计
    hzero_installer导入数据的debug
  • 原文地址:https://blog.csdn.net/sinat_35360663/article/details/127690843