another

another 查看完整档案

杭州编辑  |  填写毕业院校  |  填写所在公司/组织 github.com/zdz1715 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

another 发布了文章 · 2020-05-27

centos7 openssh升级到最新版本

注意事项

本文的环境都是系统自带的openssh,若是手动编译安装的,不保证成功。若是自带的,则升级过程中不需要卸载旧版本openssh。

安装之前可以先试试yum更新,若是可以更新,就不需要往下看了

# centos8 
$ yum update openssh -y
# 重启sshd
$ systemctl restart sshd

准备工作

系统说明

  • 系统版本:CentOS Linux release 7.7.1908 (Core)
  • openssh:OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
  • openssl: OpenSSL 1.0.2k-fips 26 Jan 2017

下载最新包

本文选择的是:
openssh-8.2p1.tar.gz
openssl-1.1.1g.tar.gz

$ wget https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.2p1.tar.gz

$ wget https://ftp.openssl.org/source/openssl-1.1.1g.tar.gz

安装telnet备用(可选)

安装新的ssh之后,只要配置好启动,就可以做到无缝切换,但是中途断开就不能连接了,为了防止这种情况,我们可以安装telnet当作备用,若是你能保证中途不会断开,此步骤可以忽略

1.安装

$ yum install telnet telnet-server -y

2.启动

$ systemctl enable telnet.socket
$ systemctl start telnet.socket

3.连接

# telnet 默认禁止root用户连接,我们先生成一个普通用户 
$ useradd testuser
$ passwd testuser

# 本地测试
$ telnet 127.0.0.1
VM_0_6_centos login: testuser
Password: 
[testuser@VM_0_6_centos ~]$ 
# 切换root
[testuser@VM_0_6_centos ~]$ su

升级openssl

备份

$ mv /usr/bin/openssl /usr/bin/openssl_old

安装

$ tar xzvf openssl-1.1.1g.tar.gz
$ cd openssl-1.1.1g/
$ ./config shared && make && make install

配置软连接

$ ln -s /usr/local/bin/openssl /usr/bin/openssl

如果执行openssl version报下面的错误

openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

则执行下面命令解决:

$ ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/
$ ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/

旧版本:

$ openssl_old version
OpenSSL 1.0.2k-fips  26 Jan 2017

升级openssh

安装所需依赖

$ yum install zlib-devel  openssl-devel  pam-devel -y

备份

$ mkdir /etc/ssh_old
$ mv /etc/ssh/* /etc/ssh_old/

解压、编译安装

$ tar xzvf openssh-8.2p1.tar.gz 
$ cd openssh-8.2p1/

$ ./configure --prefix=/usr/ --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/lib64/ --with-zlib --with-pam --with-md5-password --with-ssl-engine --with-selinux

# 安装
$ make && make install

# 验证
$  ssh -V
OpenSSH_8.2p1, OpenSSL 1.1.1g  21 Apr 2020

$ ls /etc/ssh
moduli  ssh_config  sshd_config  ssh_host_dsa_key  ssh_host_dsa_key.pub  ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub

配置

1.修改sshd_config

$ vim /etc/ssh/sshd_config

# 例子:配置root登录,   根据你以前的配置来
PermitRootLogin yes

2.启动



# 移走以前的ssh服务, 防止与新的冲突
$ mv /usr/lib/systemd/system/sshd.service /etc/ssh_old/sshd.service
$ mv /usr/lib/systemd/system/sshd.socket /etc/ssh_old/sshd.socket

# 在解压包中拷贝一些文件
$ cp -a contrib/redhat/sshd.init /etc/init.d/sshd



# 重新启动
$ /etc/init.d/sshd restart
$ systemctl daemon-reload

# 添加自启动
$ chkconfig --add sshd
$ chkconfig sshd on

可能碰到的问题:

  1. /etc/init.d/sshd restart之后报错
Reloading systemd:                                         [  确定  ]
Restarting sshd (via systemctl):  Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.
                                                           [失败]

是selinux导致,需要关闭

# 临时修改
setenforce 0
# 永久修改
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
# 重启
/etc/init.d/sshd restart
查看原文

赞 0 收藏 0 评论 0

another 发布了文章 · 2020-03-26

加密算法

简介

  • 对称加密: 加密和解密的秘钥使用的是同一个
  • 非对称加密: 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
  • hash: 单向算法

对称加密

优点: 算法公开、计算量小、加密速度快、加密效率高

缺点:如果有一方丢失密钥,数据就不安全

常见的算法:AES、DES、IDEA、RC4、RC5、RC6

非对称加密

公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

优点: 安全

缺点:速度较慢

常见的算法:RSA、ECC、DSA、Diffie-Hellman、
El Gamal

Hash(摘要算法)

单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,但不能解密,
因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的摘要算法有: MD2、MD4、MD5、HAVAL、SHA

SSL/TLS

因为每次使用非对称加密消耗的性能很多,那么能不能和对称加密结合起来呢?SSL/TLS就是一种这样的标准,我们这里先举一个例子:客户端和服务端通信

原理:客户端使用服务端的公钥来非对称加密一条密文,这条密文是对称密钥,服务端通过自己的私钥解密出来知道是对称加密的密钥后,后面通信就使用对称加密,这样安全和性能就能共存了。

风险:在服务端把公钥发送给客户端时,被中间人截获,中间人返回自己的公钥,客户端的对称密钥就会被中间人用私钥解密出来,然后中间人再用服务端的公钥加密发给服务端,这样后面的对称加密数据都会被中间人解密

解决办法:CA(证书认证机构),服务端在CA申请证书,客户端拿到公钥后去CA验证是否是服务端的公钥

查看原文

赞 0 收藏 0 评论 0

another 回答了问题 · 2020-03-25

解决关于mysql语句根据时间筛选按月分组统计数据的问题

  • 日期字段是时间戳
SELECT id,FROM_UNIXTIME(create_time,"%Y/%m") t_month FROM table GROUP BY t_month
  • 日期字段是datetime类型,同理先转成时间戳
SELECT id,FROM_UNIXTIME(UNIX_TIMESTAMP(created_at),"%Y/%m") t_month FROM table GROUP BY t_month

关注 2 回答 1

another 发布了文章 · 2020-02-14

docker 安装方式

centos8

官方文档

设置存储库

1.存储驱动若使用 devicemapper ,需依赖于device-mapper-persistent-data 和 lvm2,(若不是请忽略这一步)

$ yum install -y yum-utils device-mapper-persistent-data lvm2

# OR

$ dnf install -y device-mapper-persistent-data lvm2

2.设置稳定的存储库(阿里云源),官方库:https://download.docker.com/linux/centos/docker-ce.repo

# yum-config-manager 依赖于 yum-utils 
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# OR

$ dnf config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

注:dnf是centos8提供的包管理工具,是yum的升级版,下面都用dnf代替yum

安装Docker CE

1.安装

# 查看可安装版本
$ dnf list docker-ce --showduplicates | sort -r
# 安装指定版本
$ dnf -y install docker-ce-<VERSION_STRING>
# 安装最新版
$ dnf -y install docker-ce

若出现以下报错,请安装新版containerd.io

Error: 
 Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
# 安装新版containerd.io 
# https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ontainerd.io-1.2.13-3.2.el7.x86_64.rpm
$ dnf -y install http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm

# 安装docker-ce 
$ dnf -y install docker-ce

2.管理docker

# 启动
$ systemctl start docker

# 关闭
$ systemctl stop docker

# 开机自启
$ systemctl enable docker

3.卸载

$ dnf remove docker-ce docker-ce-cli containerd.io
# 指定版本
$ dnf remove docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 卸载老版本
$ yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

删除镜像和容器文件/var/lib/docker/(默认存放地址)

docker-compose

  • 从github上下载
# 要安装不同版本的Compose,请使用您想要使用的Compose版本替代1.25.4。
$ curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 增加执行权限
$ chmod +x /usr/local/bin/docker-compose
$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 增加执行权限
$ chmod +x /usr/local/bin/docker-compose

docker & firewalld

如果先运行dockerd再运行firewalld, 会导致 Docker 无法正常工作,容器内部无法正常访问网络

解决方案:

第一种:修改docker网络模式为host

  • docker run

在运行容器时添加参数 --network=host

$ docker run --network=host ...
  • docker compose
network_mode: "host"

第二种:将firewalld换成iptables(推荐)

# 查看firewalld是否启用
$ systemctl status firewalld
# 停止firewalld
$ systemctl stop firewalld
# 禁用firewalld(否则重启系统后会再次启动)
$ systemctl disable firewalld
# 查看是否安装iptables
$ dnf list installed | grep iptables-services
# 如果没安装则安装下
$ dnf -y install iptables-services
# 重启iptables
$ systemctl restart iptables
# 设置开机自启
$ systemctl enable iptables
# 重启docker
systemctl restart docker

第三种:关闭防火墙

# 查看firewalld是否启用 
$ systemctl status firewalld 
# 停止firewalld 
$ systemctl stop firewalld
# 禁用firewalld(否则重启系统后会再次启动) 
$ systemctl disable firewalld
# 重启docker
$ systemctl restart docker

阿里云容器镜像加速服务

提升获取Docker镜像的速度(需登录获取)

查看原文

赞 0 收藏 0 评论 0

another 发布了文章 · 2020-01-10

openvpn + pam_mysql 认证

一、安装

centos8

1.更换yum源为aliyun

# centos7 : http://mirrors.aliyun.com/repo/Centos-7.repo

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum clean all
$ yum makecache

2.关闭 SELinux,开启会限制pam_mysql远程访问数据库,客户端不需要

# 临时修改,不需重启 0 警告模式 1 强制模式 
$ setenforce 0
# 永久关闭
$ vim /etc/selinux/config
SELINUX=disabled

3.安装openvpn

$ yum install -y openvpn

# 查看安装状态
$ openvpn --version
OpenVPN 2.4.8 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov  1 2019
library versions: OpenSSL 1.0.2o-fips  27 Mar 2018, LZO 2.08
Originally developed by James Yonan
Copyright (C) 2002-2018 OpenVPN Inc
...

# 需要用到的服务
$ find /usr/lib/systemd/system | grep openvpn
/usr/lib/systemd/system/openvpn-client@.service
/usr/lib/systemd/system/openvpn-server@.service
/usr/lib/systemd/system/openvpn@.service

# 查找认证模块
$ whereis openvpn
openvpn: /usr/sbin/openvpn /usr/lib64/openvpn /etc/openvpn /usr/share/man/man8/openvpn.8.gz
$ cd /usr/lib64/openvpn/plugins/
$ ls
openvpn-plugin-auth-pam.so  openvpn-plugin-down-root.so

二、easy-rsa

用来制作ca证书,签发服务端和客户端证书(使用pam_mysql认证之后就不需要用客户端证书了,安全起见还是证书和用户名双重认证),此处使用easy-rsa3
1.下载

# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip 

$ yum install -y easy-rsa

$ whereis easy-rsa
easy-rsa: /usr/share/easy-rsa

$ cp -r /usr/share/easy-rsa/3.0.7/ /etc/openvpn/easy-rsa
cp /usr/share/doc/easy-rsa-3.0.7/vars.example /etc/openvpn/easy-rsa/

2.编辑vars文件
此文件为制作证书所用的配置文件

$ cp vars.example vars

修改以下配置,取消#注释

# 国家 
#set_var EASYRSA_REQ_COUNTRY    "CN"
# 省份
#set_var EASYRSA_REQ_PROVINCE   "Zhe Jiang"
# 城市
#set_var EASYRSA_REQ_CITY       "Hang Zhou"
# 公司名称
#set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
# 邮箱
#set_var EASYRSA_REQ_EMAIL      "me@example.net" 
# 公司部门
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

# 默认值,若不是此值,建议修改为此值,增加安全性,修改之后需要重新生成证书
#set_var EASYRSA_KEY_SIZE       2048 

# 过期时间,单位为天
#set_var EASYRSA_CA_EXPIRE      3650 

4.初始化,生成ca证书

$ ./easyrsa init-pki
# 创建ca证书,nopass 不需要密码
$ ./easyrsa build-ca nopass

三、服务端配置

1.生成服务端证书

$ cd /etc/openvpn/easy-rsa/
$ ./easyrsa build-server-full vpn-server nopass

2.创建 Diffie-Hellman
初始化PKI后,任何实体都可以创建需要它们的DH参数。这通常仅由TLS服务器使用。虽然CA PKI可以生成这个,但在服务器本身上执行它更有意义,以避免在生成后将文件发送到另一个系统

$ ./easyrsa gen-dh

3.把所需文件复制到/etc/openvpn/server下,方便管理,ca.crt文件需妥善保管

$ cp pki/private/vpn-server.key /etc/openvpn/server/
$ cp pki/issued/vpn-server.crt /etc/openvpn/server/
$ cp pki/ca.crt /etc/openvpn/server/
$ cp pki/dh.pem /etc/openvpn/server/

4.tls-auth,增加安全性

$ cd /etc/openvpn/server
# 会生成一个ta.key文件
$ openvpn --genkey --secret ta.key    

5.创建服务器文件

$ vim server.conf

配置如下,文件路径最好使用绝对路径:

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
key /etc/openvpn/server/vpn-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
# 固定客户端ip,如:/cdd/user1 内容为ifconfig-push 10.9.0.1 10.9.0.2,则固定ip10.9.0.1
client-config-dir /etc/openvpn/server/ccd
# 客户端互相可以访问
;client-to-client
# 可以多个终端登录一个账户
;duplicate-cn
# 心跳,每10s ping一次,ping不到120s之后认定客户端宕机
keepalive 10 120
# tls 加密验证,服务端为0,客户端为1
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
# 压缩
comp-lzo
# 最大连接客户端
max-clients 1000
# 使用nobody用户运行,更安全
user nobody
group nobody
# 禁止openvpn证书自动过期,以便用户保持连接
reneg-sec 0
persist-key
persist-tun
# 状态日志
status openvpn-status.log
# 日志级别 0-9,等级越高日志内容越详细
verb 3
# 当服务器重新启动时,通知客户端,以便它可以自动重新连接。只支持udp协议
explicit-exit-notify 1
# pam认证插件,后面是/etc/pam.d的文件名
# plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
# 不验证客户端的证书,但是服务端的证书还是需要的
# client-cert-not-required
# 使用客户提供的UserName作为Common Name
# username-as-common-name

6.试运行openvpn

# 配置中开启了client-config-dir,若不创建文件夹,会报错
$ mkdir /etc/openvpn/server/ccd
$ openvpn --config server.conf
...
Thu Apr 16 22:24:45 2020 MULTI: multi_init called, r=256 v=256
Thu Apr 16 22:24:45 2020 IFCONFIG POOL: base=10.235.246.4 size=62, ipv6=0
Thu Apr 16 22:24:45 2020 IFCONFIG POOL LIST
Thu Apr 16 22:24:45 2020 Initialization Sequence Completed

四、配置pam_mysql(使用证书验证,就跳过)

1.安装mysql (centos8)

$ yum install mysql-server

2.安装pam_mysql,请使用0.8.1以上版本,0.7版本有问题

$ rpm -Uvh http://repo.iotti.biz/CentOS/7/x86_64/pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm
# 安装之后在这里
 /usr/lib64/security/pam_mysql.so
 
# 修改openvpn server配置
$ vim /etc/openvpn/server/server.conf
plugin /usr/lib64/security/pam_mysql.so openvpn

报错处理,缺少mysql-community-libs-compat(依赖于mysql-community-common、mysql-community-libs)导致,请去这里找寻对应版本安装:

error: Failed dependencies:
    libmysqlclient.so.18()(64bit) is needed by pam_mysql-1:0.8.1-0.22.el7.lux.x86_64
    libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by pam_mysql-1:0.8.1-0.22.el7.lux.x86_64

3.创建/etc/pam.d/openvpn
以下只列举了一些配置,详细配置请参考官方说明

$ cd /etc/pam.d/
$ vim openvpn

auth required /usr/lib64/security/pam_mysql.so  user=your_user passwd=your_password host=your_host db=your_db table=your_table usercolumn=username passwdcolumn=password where=mysql_where crypt=1 sqllog=0

account required /usr/lib64/security/pam_mysql.so user=your_user passwd=your_password host=your_host db=your_db table=your_table usercolumn=username passwdcolumn=password where=mysql_where crypt=1 
sqllog=0

# crypt 密码加密方式 :
# 0 明文密码,1 encrypt() 加密 2 password() 加密 3 MD5 4 sha2
# where: mysql的select查询条件
#usercolumn: 用户在表中的字段
#passwdcolumn:密码在表中的字段
#sqllog:把log写入到mysql表中 0 不启用 1 启用

4.测试,安装测试工具,若有则不用安装


$ yum install  cyrus-sasl-devel  cyrus-sasl-gssapi  cyrus-sasl-md5  cyrus-sasl-plain cyrus-sasl-lib cyrus-sasl
# 开启
$ systemctl start saslauthd
# 测试,报错日志在 /var/log/secure,可以调试,要想连接远程数据库,请保证1. 数据库可以访问 2. 关闭selinux
$ testsaslauthd -u user1 -p 1234 -s openvpn 
0: OK "Success."

5.优化
基于pam_mysql v0.7新加的config_file属性来指定配置文件

auth required  /usr/lib64/security/pam_mysql.so  config_file=/etc/openvpn/server/pam_mysql.conf

account required /usr/lib64/security/pam_mysql.so config_file=/etc/openvpn/server/pam_mysql.conf

/etc/openvpn/server/pam_mysql.conf 文件如下

users.host (host)
users.database (db)
users.db_user (user)
users.db_passwd (passwd)
users.table (table)
users.update_table (update_table)
users.user_column (usercolumn)
users.password_column (passwdcolumn)
users.status_column (statcolumn)
users.password_crypt (crypt)
users.use_323_password (use_323_passwd)
users.use_md5 (md5)
users.where_clause (where)
users.disconnect_every_operation (disconnect_every_op) *1
verbose (verbose)
log.enabled (sqllog)
log.table (logtable)
log.message_column (logmsgcolumn)
log.pid_column (logpidcolumn)
log.user_column (logusercolumn)
log.host_column (loghostcolumn)
log.rhost_column (logrhostcolumn) *2
log.time_column (logtimecolumn)

五、客户端配置(证书验证)

1.生成客户端证书

$ cd /etc/openvpn/easy-rsa/
$ ./easyrsa build-client-full vpn-client nopass

2.整理证书文件

$ cp pki/private/vpn-client.key /etc/openvpn/client/
$ cp pki/issued/vpn-client.crt /etc/openvpn/client/

3.创建配置文件

client
dev tun
proto udp
# 服务端ip和端口
remote ip port
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
# 服务端开启,这里也要开启
comp-lzo
# 避免用户在操作的过程中由于证书超时而中断,如果没有设置这个参数,openvpn连接会每个小时自动断开连接
reneg-sec 0
verb 3
# ca证书,文件形式: ca 文件路径
<ca>
    ...
</ca>
#<cert>  客户端cert , 文件形式:cert 文件路径
    ...
#</cert>
#<key> 客户端key , 文件形式:key 文件路径
    ...
#</key>
# tls-auth , 文件形式:tls-auth 文件路径 1 
key-direction 1
<tls-auth>
    ...
</tls-auth>
route-nopull
# 指定客户端访问10.8.0.0网段走vpn(10.8.0.0换成你设置的网段)
route 10.8.0.0 255.255.0.0 vpn_gateway

五、客户端配置(mysql验证)

1.配置文件

client
dev tun
proto udp
# 服务端ip和端口
remote ip port
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
# 服务端开启,这里也要开启
comp-lzo
# 避免用户在操作的过程中由于证书超时而中断,如果没有设置这个参数,openvpn连接会每个小时自动断开连接
reneg-sec 0
verb 3
# ca证书,文件形式: ca 文件路径
<ca>
    ...
</ca>
#<cert>  客户端cert , 文件形式:cert 文件路径
    ...
#</cert>
#<key> 客户端key , 文件形式:key 文件路径
    ...
#</key>
# tls-auth , 文件形式:tls-auth 文件路径 1 
key-direction 1
<tls-auth>
    ...
</tls-auth>
route-nopull
# 指定客户端访问10.8.0.0网段走vpn(10.8.0.0换成你设置的网段)
route 10.8.0.0 255.255.0.0 vpn_gateway
# 提示客户端用账户和密码连接,pass.txt 记录账户和密码,就会自动连接,若不指定文件,则每次连接都会让输入账户和密码
auth-user-pass pass.txt

pass.txt格式如下:

账户
密码

六、使用systemctl管理openvpn

1.关闭防火墙

$ systemctl stop firewalld

或者开放你的服务端openvpn端口,--permanent代表永久有效,不指定重启会失效

$ firewall-cmd --zone=public --add-port=1194/udp --permanent
# 载入配置
$ firewall-cmd --reload

2.查看openvpn服务

$ cd /usr/lib/systemd/system
$ find . | grep openvpn
./openvpn-client@.service
./openvpn-server@.service
./openvpn@.service

# 这里使用openvpn-server@.service,查看服务的运行方式: 
$ vim ./openvpn-server@.service
# 可以看出使用的配置文件是 /etc/openvpn/server/%i.conf
WorkingDirectory=/etc/openvpn/server
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 
--suppress-timestamps --config %i.conf
  • 启动服务端,@后面是配置文件的名称,可以自定义,一个配置文件一个进程
$ systemctl start openvpn-server@server
  • 查看启动状态
$ systemctl status openvpn-server@server
  • 停止
$ systemctl stop openvpn-server@server
  • 开机自动运行
$ systemctl enable openvpn-server@server

3.客户端
和服务端的一样,只不过用的是openvpn-client@server,文件最好都放置在/etc/openvpn/client 里

4.迁移
在新服务器上先安装openvpn,然后把旧服务器上的/etc/openvpn/server/、/etc/openvpn/client/、/etc/openvpn/easy-rsa复制过去即可

七、windows客户端的自动连接

系统:windows server 2008 R2

  • 方法一:使用注册表来运行,缺点是只能登录了才运行

进入HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun 添加执行程序 "C:Program FilesOpenVPNbinopenvpn-gui.exe" --connect client.ovpn

  • 方法二:使用计划任务程序(推荐)

624_0.png
勾选不管用户是否登录都运行和最高权限运行
626_0.png
触发器添加启动时执行~~~~
628_0.png
添加启动要做什么,可选参数不要忘记了
630_0.png
其他设置,红框的选项可能导致任务停止,请注意取消勾选
632_0.png

八、总结

以上就是自主搭建openvpn+pam_mysql的所走过的路,文中内容可能有不严谨 or 错误的地方,请各位大佬多多指教

查看原文

赞 0 收藏 0 评论 0

another 评论了文章 · 2019-03-01

Just for fun——MySQL事务的隔离级别

事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read Uncommitted(RU)、Read Committed(RC)、Repeatable Read(RR)、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
√: 可能出现 ×: 不会出现

**脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable read××
Serializable×××

MySQL事务(InnoDB)的默认隔离级别为RR,另外MySQL通过MVCC(多版本并发控制)技术解决了环读的问题。

然后我们来看个简单而Happy的小栗子:

原料

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'wang');
INSERT INTO `user` VALUES ('2', 'meng');
INSERT INTO `user` VALUES ('3', 'salamander');

操作

Client 1
开启事务后查询数据

clipboard.png

Client 2
开启事务,改变数据

clipboard.png

然后在Client 1中再次查询

clipboard.png

发现查询数据还是不变

Client 2提交事务

clipboard.png

再次在Client 1中查询数据

clipboard.png

发现查询数据还是不变,(~。。~)

然后,你可以想象了,为什么这样呢?

查看原文

another 赞了文章 · 2019-03-01

Just for fun——MySQL事务的隔离级别

事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read Uncommitted(RU)、Read Committed(RC)、Repeatable Read(RR)、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
√: 可能出现 ×: 不会出现

**脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable read××
Serializable×××

MySQL事务(InnoDB)的默认隔离级别为RR,另外MySQL通过MVCC(多版本并发控制)技术解决了环读的问题。

然后我们来看个简单而Happy的小栗子:

原料

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'wang');
INSERT INTO `user` VALUES ('2', 'meng');
INSERT INTO `user` VALUES ('3', 'salamander');

操作

Client 1
开启事务后查询数据

clipboard.png

Client 2
开启事务,改变数据

clipboard.png

然后在Client 1中再次查询

clipboard.png

发现查询数据还是不变

Client 2提交事务

clipboard.png

再次在Client 1中查询数据

clipboard.png

发现查询数据还是不变,(~。。~)

然后,你可以想象了,为什么这样呢?

查看原文

赞 4 收藏 9 评论 2

another 赞了文章 · 2019-03-01

Just for fun——PHP GUI做一个贪吃蛇

图形用户界面(GUI) 扩展

今天阅读PHP手册的时候,看到PHP7有ui这个图形库的扩展,所以咱赶新鲜用一用

安装扩展

官方手册的安装步骤是linux的:

Requirements:
    PHP 7
    libui (use current master)
    Windows/MacOSX/Linux (GTK-3)

Install re2c:
    sudo apt install re2c

Install libui:

    git clone https://github.com/andlabs/libui.git
    cd libui
    sudo cp *.h /usr/local/include/
    cmake .
    cd out
    sudo cp * /usr/lib/

Install ui:

    Method one: use pecl:
        sudo pecl install channel://pecl.php.net/ui-2.0.0

    Method two:build source code:
        git clone https://github.com/krakjoe/ui.git
        cd ui
        phpize
        make
        sudo make install

Enable ui.so:
    sudo echo 'extension=ui.so' > /etc/php/7.0/mods-available/ui.ini
    sudo ln -s /etc/php/7.0/mods-available/ui.ini 20-ui.ini

Test:
    php -m
    git clone https://github.com/krakjoe/ui.git
    cd ui/examples/
    php snake.php

要求(文档写着)

  • PHP 7
  • libui (use current master)
  • Windows/MacOSX/Linux (GTK-3)

PECL上下载windows的dll,我用的是php7 nts 64位,所以用了这个:

clipboard.png
下载下来的文件目录结构:

clipboard.png

接下来:

  1. php_ui.dll放入到php的ext目录中,然后php.ini加入extension=php_ui.dll
  2. pthreadVC2.dll和libui.dll放入php目录中,也就是和php.exe文件同级
  3. cmd中运行php -m命令查看模块有没有正确加载

clipboard.png

clipboard.png

测试一个贪吃蛇

ui扩展下载的文件夹中有个snake.php文件(贪吃蛇游戏),到该目录下运行:

php snake.php

clipboard.png

另外还有个粒子效果的文件(starfield.php):

clipboard.png

查看原文

赞 13 收藏 17 评论 6

another 赞了文章 · 2019-03-01

Just for fun——PHP框架之简单的模板引擎

原理

使用模板引擎的好处是数据和视图分离。一个简单的PHP模板引擎原理是

  1. extract数组($data),使key对应的变量可以在此作用域起效

  2. 打开输出控制缓冲(ob_start)

  3. include模板文件,include遇到html的内容会输出,但是因为打开了缓冲,内容输出到了缓冲中

  4. ob_get_contents()读取缓冲中内容,然后关闭缓冲ob_end_clean()

实现

封装一个Template

<?php

class Template {
    private $templatePath;
    private $data;

    public function setTemplatePath($path) {
        $this->templatePath = $path;
    }

    /**
     * 设置模板变量
     * @param $key string | array
     * @param $value
     */
    public function assign($key, $value) {
        if(is_array($key)) {
            $this->data = array_merge($this->data, $key);
        } elseif(is_string($key)) {
            $this->data[$key] = $value;
        }
    }


    /**
     * 渲染模板
     * @param $template
     * @return string
     */
    public function display($template) {
        extract($this->data);
        ob_start();
        include ($this->templatePath . $template);
        $res = ob_get_contents();
        ob_end_clean();
        return $res;
    }

}

测试

test.php

<?php

 include_once './template.php';

 $template = new Template();
 $template->setTemplatePath(__DIR__ . '/template/');
 $template->assign('name', 'salamander');
 $res = $template->display('index.html');


 echo $res;

template目录下index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板测试</title>
    <style>
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }
        h1 {
            text-align: center;
            padding-top: 20px;
        }
    </style>
</head>
<body>
    <h1><?=$name?></h1>
</body>
</html>

clipboard.png

clipboard.png

Tip

为什么display要返回一个字符串呢?原因是为了更好的控制,嵌入到控制器类中。
对于循环语句怎么办呢?这个的话,请看流程控制的替代语法

查看原文

赞 7 收藏 20 评论 0

认证与成就

  • 获得 0 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-10-18
个人主页被 196 人浏览