兮陌 / zh-CN 这里是薛叶|兮陌的个人博客空间,分享工作经验和生活,欢迎大家收藏,关注我的动态。 Mon, 03 May 2021 18:26:00 +0800 Mon, 03 May 2021 18:26:00 +0800 SELinux导致的Docker无法启动容器 /archives/208/ /archives/208/ Mon, 03 May 2021 18:26:00 +0800 兮陌 今天重启服务器之后,Docker容器无法运行,报错信息如下。

Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/*********

搜索了一波解决方案,大都说是文件系统的问题。实际上这个不是根本原因。根本原因SELinux。我关闭了SELinux。

解决方法:

  • 启用SELinux或者设置为宽松模式,不禁用就可以了。
  • 编辑/etc/sysconfig/docker,添加--selinux-enabled=false参数。
]]>
0 /archives/208/#comments /feed/archives/208/
【转】真正厉害的人,是学会了和孤独友好相处的人 /archives/204/ /archives/204/ Fri, 23 Apr 2021 14:27:00 +0800 兮陌 文/肖卓

认识许总的那一年,我刚刚大学毕业。

那个时候我正加入了大学生创业浪潮,在一家广告公司做公司的宣传资料,刚好许总也在,他看完我的资料后,对我说,他的公司也有这样的业务,想要高薪挖我过去。

那个时候我正年轻气盛,想都没想就拒绝了。要当就当自己公司的CEO啊,去给别人打工有什么鸟意思?

呵呵,我到现在还在为当时愚蠢幼稚的想法感到可笑至极。

一年后,我创业失败。那个时候真的很惨,最后宣布公司倒闭的时候,我把办公室的一些办公用品都低价卖给别人,

那种渗透到骨子里面的失落和沮丧,我到现在还记忆犹新。

长沙五一广场某地标写字楼,2813室,时隔8年这个数字还是那么熟悉,那个我亲手一点点建立的公司,要我亲自去关掉它,没有经历过的人,永远不知道这件事情有多残忍。

创业失败后,许总又找到了我,我抱着试一试的心态去了他们公司,结果大大出乎我的意料。

“看一个公司,只要看这个公司的老板是什么样的人就行”,这句话我从那个时候到现在一直都奉为金科玉律,因为很多公司的业务和架构都是相似的,唯一不同的就是执行的人,而规则都是靠人去制定的,所以看公司好不好,就看公司的老板是个什么样的人就行。

去到许总的公司,我才真正意识到什么叫真正的藏龙卧虎,他们的公司一个小小的业务员都有独当一面的能力,经理就更加不要说了。

员工的执行能力、协调能力,企业文化,规章制度等等,都比我之前的公司好太多了。

这里就先不扯远了,还是先说说许总吧。

一个三十几岁的男人,没有老婆孩子,每天8小时上班后的十几小时都是一个人生活,可想而知是有多么孤独。

可是我在他身上丝毫看不出任何孤独的影子,永远都是一副精力充沛,朝气蓬勃的样子。

他每天早上7点钟起床,去公园跑步一小时,早餐雷打不动的一个削了皮的苹果和一杯纯牛奶,一碗粥,然后去公司上班。

下班后,要么去健身房,要么去吉他学校,要么去英语学校,要么去图书馆,他永远是在一个学习的状态,且高度自律。

他酷爱历史,你很难想象一个学历并不高的人,他对那些历史典故的熟悉程度,并不亚于专门学这个专业的人。

他吉他拿到了最高的等级证书,英语溜得不行,身材一直保持很好,有一次歌唱比赛吉他弹唱他还拿到了大奖……

记得他曾经对我说过一番话:

“人的一生归根到底是在和孤独对抗的一生,越往上面走,你会发现自己越孤独。”

了解一个人不要看他忙碌的时候,你看他怎么对抗孤独就行了,有的人在孤独中堕落,而有的人在孤独中学会了和自己相处。

孤独会毁掉大多数人,成就极少数人,记住,你一定要做那个极少数的人!”

认清一个人,就看他怎么和孤独相处,因为一个人回归到孤独的状态,才是他最真实的状态,有的人在孤独中不断堕落,为了逃避孤独,每天过着空虚的生活,而有的人在孤独中渐渐找到了真实的自我,内心变得越来越淡定和从容。

这个道理我用来观察过很多人,百试百准,也包括许总,他是一个真正学会了在孤独中和自己相处的人。

我见过太多的人,他们才华横溢,学富五车,工作能力强,表达能力好,可就是没有办法和自己相处,他们因为害怕孤独,不断失去自我,常常把自己逼进一个根本不适合自己的圈子,就这样一步步被孤独侵蚀。

真正厉害的人,是学会了和孤独友好相处的人。

后来,公司在许总的带领下,越做越大,现在从当时屈居在长沙的一个小公司,变成了横跨4个省份的大集团,我也从当初的一个业务员,变成了一个分公司的副总经理。

许总是迄今为止对我影响最大的一个人,我从当初加入他们公司一干就是八年,如果说人生真的有什么贵人的话,那么许总就是我的贵人。

其实,在我年轻的时候,经常逼迫自己去合群,特别喜欢呼朋引伴,如果有哪天,我被同伴给抛下了,我会非常伤心、失落。

很多时候,我会顺着他们的观点去表达自己,不敢有自己的不同观点,我甚至会因他们的轰然大笑而强迫自己笑。

于是,我活成了别人最希望我成为的样子。

这样的状态我持续了很久很久,直到后来有一天,我尝试去做真实自我的时候,却换来他们的冷嘲热讽,他们像疏离一个怪物一样疏远我,我之前所有想融入这个圈子的努力,一瞬间全部白费。

我感到很失落,很绝望,于是从那一刻开始,我学着和孤独相处。

我周末的时候去图书馆看书,早上走的时候室友们还在宿舍睡觉,回来的时候,他们还在睡觉。

晚上我冒着雨去参加演讲比赛,走的时候他们聚在一起打牌,回来的时候,他们还在打牌。

我早上坐公交车去参加英语沙龙,他们那时刚刚从网吧通宵回来,晚上我回来的时候,他们又出发网吧开始第二晚通宵。

于是,我明白了,我和他们始终不是一路人,特立独行的我是注定要孤独的。

我开始慢慢享受独处的时光,我不再装模作样的拥有很多朋友,而是回到了孤单之中,以真正的自我开始了独自的生活。

孤独从来就不会毁掉一个人,把自己拼命挤进一个不适合自己的圈子,佯装自己不孤独才会毁掉一个人。

当我可以一个人安静的读书旅行听音乐的时候,当我可以一个人研究出来鱼的很多种烹饪方法,并且享受自己厨艺的时候,当我不再需要一遍一遍的等待别人证明存在感的时候,我发现我自己并不孤独了。

我是真实的在活着,不为了别人的认同,不为了自己的虚荣,只是仅仅为了活着这件事。

行至水穷处,坐看云起时,就这样的再也回不了头。

时至今日,我仍然庆幸自己当初就想明白了这一点,现在的他们大多数还生活在社会的最底层,而我已经远远超过了他们。

这一步,越早开始越好,将来的你,一定会感谢现在努力的自己。

是羊都群居着,是狼都孤独着,越是成功的人,越是孤独,大部分成功的人,他们表面都很有友善,可是他们却喜欢独来独往,因为他们孤独并不空虚,一个人的时候,更容易进行深度思考。

很多问题我在人群密集的地方,无法想透彻,当我一个人坐飞机或者高铁的时候,反而这些问题会有深度的思考,常常会带给我出乎意料的惊喜。

孤单往往是一个人的狂欢,而狂欢只是一群人的孤单。

人生越到后面,你越能体会到,真实和长久的愉悦,永远都只会在你的精神世界里,任何一个人群都无法提供。

凡心所向,素履所往。生如逆旅,一苇以航。

-作者-

肖卓,80后作家,兼职男模,前南方航空公司职员,现教育培训行业深耕者。桌子的文章就像你生活里的一颗阿司匹林,服下舒畅,断药副作用巨大。

]]>
0 /archives/204/#comments /feed/archives/204/
CentOS 7安装配置OpenVPN服务器 /archives/203/ /archives/203/ Mon, 19 Apr 2021 02:46:00 +0800 兮陌 概述

本文主要介绍在CentOS 7系统中如何配置OpenVPN。

一、准备工作

安装依赖的软件包。

yum install -y lzo openssl pam

执行以下命令,确认软件包已经安装成功。

rpm -qa lzo openssl pam 

二、安装OpenVPN服务

直接使用YUM安装OpenVPN。

yum install -y epel-release
yum install -y openvpn easy-rsa iptables-services

附上源码地址,有需要的可以编译安装。

OpenVPN:https://github.com/OpenVPN/openvpn

Easy-RSA:https://github.com/OpenVPN/easy-rsa

三、配置OpenVPN服务

我安装时候的版本信息如下,主要会在一些目录上会有版本号的区别,按实际情况替换。

OpenVPN:2.4.10

EasyRSA:3.0.8

1、初始化,生成证书、密钥和参数文件

Esay-RSA默认安装目录在/usr/share/easy-rsa/3.0.8,文档配置文件模板在/usr/share/doc/easy-rsa-3.0.8

文档建议我们拷贝一份到别的目录使用,以免将来升级的时候被覆盖掉。我们照做就好,目录就选择我们的OpenVPN配置目录,毕竟就是给它用的嘛。

cp -a /usr/share/easy-rsa/3.0.8 /etc/openvpn/easy-rsa

拷贝配置文件模板,安装文档要求,必须重命名为vars才可以被自动加载。

cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars

编辑配置文件vars,主要修改证书相关的参数。文档里也说了,其实啥也不改,用默认的就完事了。甚至连这个配置文件都可以不用。咱就稍微费点事,改一下吧。随便怎么定义都行,不会对证书有什么影响。

set_var EASYRSA_REQ_COUNTRY    "CN"
set_var EASYRSA_REQ_PROVINCE   "JiangSu"
set_var EASYRSA_REQ_CITY       "Nanjing"
set_var EASYRSA_REQ_ORG        "SIMAEK"
set_var EASYRSA_REQ_EMAIL      "master@simaek.com"
set_var EASYRSA_REQ_OU         "Development Dept."
说明

EASYRSA_REQ_COUNTRY "所在的国家"

EASYRSA_REQ_PROVINCE "所在的省份"

EASYRSA_REQ_CITY "所在的城市"

EASYRSA_REQ_ORG "所属的组织"

EASYRSA_REQ_EMAIL "邮件地址"

EASYRSA_REQ_OU "组织单位,部门"

说明一下我们需要创建的证书:

  • CA根证书,用于给服务器和客户端证书签名使用。
  • OpenVPN服务器证书
  • Diffie-Hellman算法用到的key

进入我们easy-rsa脚本所在目录,初始pki目录,我们创建的证书和生成的中间文件都会存放在这个目录里,默认位置为脚本执行的路径。其实可以配置,但相信大家和我一样,懒得改配置文件了。

cd /etc/openvpn/easy-rsa
./easyrsa init-pki

创建CA根证书。提示输入Common Name,名字自定义。在这部分会提示Enter New CA Key Passphrase,输入两次PEM密码,此密码必须记住,不然以后不能为证书签名。可以加nopass参数表示不用密码,但是我并不建议这么做。

./easyrsa build-ca

创建OpenVPN服务端证书。openvpn-server为自定义名称,这里建议用使用nopass参数,否则以后启动服务时需要输入密码。创建过程中需要输入之前的CA根证书PEM密码。

./easyrsa build-server-full openvpn-server nopass

生成Diffie-Hellman算法需要的密钥文件,创建Diffie-Hellman,确保key穿越不安全网络的命令,时间会有点长,耐心等待。

./easyrsa gen-dh

将生成的证书拷贝到统一的目录,个人建议拷贝/etc/openvpn/server/下和配置文件同名目录,配置文件暂时还没搞,后面再说,先创建一个目录吧,然后把需要的证书拷贝过去。

mkdir  /etc/openvpn/server/server_certs
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/server_certs
cp /etc/openvpn/easy-rsa/pki/private/ca.key /etc/openvpn/server/server_certs
cp /etc/openvpn/easy-rsa/pki/private/openvpn-server.key /etc/openvpn/server/server_certs
cp /etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt /etc/openvpn/server/server_certs
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/server_certs

生成tls-auth key,为了防止DDOS和TLS攻击,这个属于可选安全配置。强认证方式,防攻击。如果配置文件中启用此项(默认是启用的),就需要执行上述命令,并把ta.key放到/etc/openvpn/server目录。配置文件中服务端第二个参数为0,同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。【服务端有该配置,那么客户端也必须要有】。

cd /etc/openvpn/server/server_certs
openvpn --genkey --secret ta.key

2、修改OpenVPN配置文件

进入OpenVPN的配置目录,分为client和server,OpenVPN很贴心的准备了单元文件,可以直接启动这两个目录下的配置文件。我们只需要自定义配置文件的名称就好。

cd /etc/openvpn/server
# 拷贝一份配置文件
cp -a /cp /usr/share/doc/openvpn-2.4.10/sample/sample-config-files/server.conf ./

配置文件部分解释如下。

local 0.0.0.0
表示openvpn服务端的监听地址

port 1194
监听的端口,默认是1194

proto tcp
使用的协议,有udp和tcp。建议选择tcp

dev tun
使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。一般都使用tun

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
ca证书、服务端证书、服务端密钥和密钥交换文件。如果它们和server.conf在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用

server 10.8.0.0 255.255.255.0
vpn服务端为自己和客户端分配IP的地址池。
服务端自己获取网段的第一个地址(此处为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。
注意:该网段地址池不要和已有网段冲突或重复。其实一般来说是不用改的。除非当前内网使用了10.8.0.0/24的网段。

ifconfig-pool-persist ipp.txt
使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,
以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思。

server-bridge XXXXXX
使用tap模式的时候考虑此选项。

push "route 10.0.10.0 255.255.255.0"
push "route 192.168.10.0 255.255.255.0"
vpn服务端向客户端推送vpn服务端内网网段的路由配置,以便让客户端能够找到服务端内网。多条路由就写多个Push指令

client-to-client
让vpn客户端之间可以互相看见对方,即能互相通信。默认情况客户端只能看到服务端一个人;
默认是注释的,不能客户端之间相互看见

duplicate-cn
允许多个客户端使用同一个VPN帐号连接服务端
默认是注释的,不支持多个客户登录一个账号

keepalive 10 120
每10秒ping一次,120秒后没收到ping就说明对方挂了

tls-auth ta.key 0
加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的)
需要执行openvpn --genkey --secret ta.key,并把ta.key放到/etc/openvpn/server目录
服务端第二个参数为0;同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。

cipher AES-256-CBC
# 选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。

compress lz4-v2
push "compress lz4-v2"
openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。
Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令

comp-lzo
启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置

max-clients 100
并发客户端的连接数

persist-key
persist-tun
通过ping得知超时时,当重启vpn后将使用同一个密钥文件以及保持tun连接状态

status openvpn-status.log
在文件中输出当前的连接信息,每分钟截断并重写一次该文件

;log openvpn.log
;log-append openvpn.log
默认vpn的日志会记录到rsyslog中,使用这两个选项可以改变。
log指令表示每次启动vpn时覆盖式记录到指定日志文件中,
log-append则表示每次启动vpn时追加式的记录到指定日志中。
但两者只能选其一,或者不选时记录到rsyslog中

verb 3
日志记录的详细级别。

;mute 20
沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。

explicit-exit-notify 1
当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用

注释太多,可以通过egrep查看实际有效配置。

egrep -v "^$|^#|^;" server.conf

实际有效配置。

local 192.168.88.88
port 1194
proto udp
dev tun
ca server_certs/ca.crt
cert server_certs/openvpn-server.crt
key server_certs/openvpn-server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 223.5.5.5"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log openvpn.logverb 3

3、设置防火墙

禁用firewalld和SELinux。

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

执行以下命令,编辑配置文件。

vi /etc/sysctl.conf

修改成以下参数,启用IPv4转发,然后保存并退出。

net.ipv4.ip_forward = 1

执行以下命令,加载系统参数。

sysctl -p

添加以下iptables规则,确保服务器可以转发数据包到内网和外网。只需添加配置,不需要启动iptables服务。客户端连接VPN后,默认分配的10.8.0.0/24网段地址,不能直接内网机器,因此需要在iptables进行NAT配置。

方式一,所有网卡都进行NAT。

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE
iptables -nL -t nat

方式二,指定NAT。不懂的用一。

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens192 -j SNAT --to-source 192.168.88.88
iptables -nL -t nat
可以使用iptables -t nat -D POSTROUTING 1删除配置

执行以下命令,保存iptables配置。

service iptables save

启动服务,@后面跟的是配置文件名称。openvpn@server配置文件为/etc/openvpn/server.conf,openvpn-server@server配置文件为/etc/openvpn/server/server.conf,以此类推。

systemctl start openvpn-server@server # 启动
systemctl enable openvpn-server@server # 开机自启动
systemctl status openvpn-server@server # 查看服务状态

4、Windows客户端配置

生成客户端证书。

# ./easyrsa build-client-full client nopass # 无密码,实际应用中不推荐,客户端有密码可提高安全性
# ./easyrsa build-client-full zhangsan # 让你输入密码,后续VPN连接时会使用
# ./easyrsa build-client-full lisi # 让你输入密码,后续VPN连接时会使用
# ./easyrsa build-client-full wangwu # 让你输入密码,后续VPN连接时会使用

为客户端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中都会让你确认ca密码

客户端配置文件参考:openvpn-2.4.9/sample/sample-config-files/client.conf

# 文件名 windows为client.ovpn,Linux为client.conf

client
# 标识这是个客户端

dev tun
# 使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。服务端是什么客户端就是什么

proto tcp
# 使用的协议,有udp和tcp。服务端是什么客户端就是什么

remote 10.0.0.190 1194
# 服务端的地址和端口

resolv-retry infinite
# 一直尝试解析OpenVPN服务器的主机名。
# 在机器上非常有用,不是永久连接到互联网,如笔记本电脑。

nobind
# 大多数客户机不需要绑定到特定的本地端口号。

;user nobody
;group nobody
# 初始化后的降级特权(仅非windows)

persist-key
persist-tun
# 尝试在重新启动时保留某些状态。

ca ca.crt
cert client.crt
key client.key
# ca证书、客户端证书、客户端密钥
# 如果它们和client.conf或client.ovpn在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用

remote-cert-tls server
# 通过检查certicate是否具有正确的密钥使用设置来验证服务器证书。

tls-auth ta.key 1
# 加强认证方式,防攻击。服务端有配置,则客户端必须有

cipher AES-256-CBC
# 选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。

compress lz4-v2
# 服务端用的什么,客户端就用的什么
# 表示客户端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。

verb 3
# 日志级别

;mute 20
# 沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。

自动化脚本参考:

# ! /bin/bash
set -e
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VERSION=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/$EASY_RSA_VERSION/pki

for user in "$@"
do
if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
rm -rf $OVPN_USER_KEYS_DIR/$user
rm -rf $PKI_DIR/reqs/$user.req
sed -i '/'"$user"'/d' $PKI_DIR/index.txt
fi
cd $EASY_RSA_DIR/$EASY_RSA_VERSION
# 生成客户端 ssl 证书文件
./easyrsa build-client-full $user nopass
# 整理下生成的文件
mkdir -p $OVPN_USER_KEYS_DIR/$user
cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/ # CA 根证书
cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/ # 客户端证书
cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/ # 客户端证书密钥
cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
sed -i 's/admin/'"$user"'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
cp /etc/openvpn/server/certs/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key # auth-tls 文件
cd $OVPN_USER_KEYS_DIR
zip -r $user.zip $user
done
exit 0
]]>
0 /archives/203/#comments /feed/archives/203/
Linux服务器Mailx使用第三方SMTP服务器发送邮件 /archives/202/ /archives/202/ Thu, 08 Apr 2021 16:16:00 +0800 兮陌 Mailx在CentOS 7下默认安装,直接使用即可。
如果没有?

yum install mailx

为啥要使用第三方SMTP?因为自带的发送邮件,容易被当成垃圾邮件,不被邮件服务器接收。

非SSL协议使用25端口,SSL协议使用465端口,TLS协议使用587端口。我在配置的时候,不使用SSL协议几乎无法成功,原因也没有搞清楚,也没有必要纠结,为了安全还是用SSL比较好。

1、配置SMTP服务器

只需要修改一个配置文件:/etc/mail.rc,在文件最后添加如下内容。

set smtp-use-starttls # 启用SSL加密
set ssl-verify=ignore # SSL验证方式
set nss-config-dir=/root/.certs # SSL加密证书存放的位置

set from=**********@gmail.com # 发件人
set smtp=smtp.qq.com # SMTP服务器地址,默认使用加密端口,使用其他需要添加端口号
set smtp-auth-user=********* # SMTP帐号
set smtp-auth-password=********* # SMTP密码
set smtp-auth=login # 需要登录认证

2、检查sendmail服务

为什么不直接发送邮件进行测试呢?因为我觉得首先得确保所有先决条件都正常再进行发件测试,就我的经验而言,直接发件肯定会爆出很多问题,与其遇到一个挫败一次,不如提前解决好所有隐患。

systemctl status sendmail

可能出现的错误:

My unqualified host name (db-server) unknown; sleeping for retry

这是无法解析主机名的错误,一般问题出现在修改了Hostname之后,没有同时修改/etc/hosts内的主机名。添加正确的主机名即可解决。

127.0.0.1   localhost localhost.localdomain db-server

修改完毕后重新启动sendmail服务,并检查状态,确保没有异常后进行下一步。

systemctl restart sendmail
systemctl status sendmail

3、生成SSL证书

因为我们使用了SSL进行连接,所以自然需要证书来保证连接安全。还记得刚开始配置文件中的set nss-config-dir=/root/.certs吗?那就是证书存放的位置,我们在这个位置生成SSL证书。

mkdir -p /root/.certs
# 从服务器端获取证书保存到本地
echo -n | openssl s_client -connect smtp.gmail.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/gmail.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/gmail.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/gmail.crt
certutil -L -d /root/.certs

4、进行发件测试

最简单的方式,使用管道发送邮件:

echo "邮件正文" |mail -s "邮件标题" test@gmail.com

可能出现邮件正常发送,但是有报错:

Error in certificate: Peer's certificate issuer is not recognized.

解决方法,信任证书:

# 信任证书
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d /root/.certs -i /root/.certs/gmail.crt

到此结束。

5、其他发送邮件的方法

从文本文件读取邮件内容发送:

mail -s "邮件标题" test@gmail.com < mail.txt
]]>
0 /archives/202/#comments /feed/archives/202/
不爱你了 /archives/201/ /archives/201/ Tue, 06 Apr 2021 12:51:15 +0800 兮陌 你喜欢的人不一定会留在你身边,只有爱你的人才会一生一世陪伴你。没有人是要故意变心的,一个人,当他爱你的时候,是真的爱你,可是当他不爱你的时候,也是真的不爱你了。他在爱你的时候,没有办法假装不爱你;同样的,当他不再爱你的时候,也真的没有办法再假装爱你。

总以为我们很爱某个人,会一生一世爱下去,等下去。直到沧海变色,海枯石烂。当所有人都告诉我们,不要执迷,他其实并没有你想象的好,但我们,宁可相信自己给自己编织的童话,也不愿相信身边的人所说的话。总以为我们爱上一个人,我们就必须是一辈子不变心,总以为我们还能等到冥冥中的缘分再度重逢。千里姻缘一线牵,当云雾散尽,当两条相交线错开,我们才知道自己不过是当局者迷。总以为我们很爱某个人,爱到会为他做任何事,爱到华丽的背景下直到你一脸落寞的转身。谁先不爱,谁先离开。总觉得,第一个转身的人是最好的,看着最爱的人远去,我们以为就是一辈子,这一辈子,就他了,除他,我们谁都不会再爱。

心已经对感情麻木了,泪已经流尽,还有什么是自己该值得守候的了,有些东西,并不像自己想的那么脆弱。问一句,失去他,你真的会活不下去吗,也许那一秒钟会是,但是十天或者一个月,一年或者更长的时间呢,忽然某一天你突然醒悟过来自己都会说,为什么,曾经自己是那么的放不下。

其实,我们并不是放不下,我们放不下的只是一种心情,是那种不甘心。为什么,在我还爱你的时候你却不先爱了。为什么,当初你那么爱我,现在却变得这么冷漠。在心里问这些话的时候,其实我们不再是单纯的爱这个人了,我们只是爱上了自己的不甘心。骨子里,没有一个人甘心比别人差,谁都希望自己的一切都是美的,无人可比的。

爱上一个人,我们其实是爱上一种感觉,只有他才能给的感觉。不爱一个人,就是因为感觉没了。不爱了就是不爱了,再勉强也没有用。如果问你,你会怀念曾经爱过的人什么,一定不会是山盟海誓,有的其实是更多的很细小的细节,哄你,呵护你,疼你……我们会说等一个人,其实,我们等的已经不是这个人,只是一种心情,不甘心忽然在的人说离开就离开了。如果他重新回来,你,还会一如既往是爱他,包容他的一切吗,不要那么轻易的说会,用你的心说,你真的会吗?

没有人是要故意变心的,一个人,当他爱你的时候,是真的爱你,可是当他不爱你的时候,也是真的不爱你了。他在爱你的时候,没有办法假装不爱你,同样的,当他在不爱你的时候,也真的没有办法在假装爱你……

所以,何不选择就此放下,因为,我们希望我们自己幸福。

]]>
0 /archives/201/#comments /feed/archives/201/
E舞成名个人练习曲目 - 萌新瑟瑟发抖 /archives/199/ /archives/199/ Wed, 31 Mar 2021 19:05:00 +0800 兮陌 最近又开始玩起了E舞成名,感觉自己的水平这么多年一直半吊子,体力也不太行了。

最近想着,以后年纪大了就玩不动了,这次打算好好练练,看看自己极限能到哪里。

此文记录一些平时喜欢玩的曲子,真的就好久没玩了,好多歌都没有见过。每次选歌就很纠结。

歌曲星级备注
老人与海7竞速疯狂
雨道8竞速疯狂
中国话8竞速混音
Uh-Oh9竞速疯狂
跨时代11竞速疯狂
彩月9竞速疯狂
Butterfly kiss8竞速疯狂
]]>
0 /archives/199/#comments /feed/archives/199/
CentOS 7更换yum源 /archives/198/ /archives/198/ Wed, 24 Mar 2021 00:18:43 +0800 兮陌 对于常规的,使用网易163的源,对于EPEL,使用清华USTC的源。

Base

备份原来的源文件,然后下载网易的即可。

cd /etc/yum.repos.d
mv CentOS6-Base.repo CentOS6-Base.repo.bak
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

http://mirrors.163.com/.help/CentOS6-Base-163.repo

EPEL

安装完EPEL源后编辑下面两个文件。

1、epel.repo

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://centos.ustc.edu.cn/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://centos.ustc.edu.cn/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://centos.ustc.edu.cn/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

2、epel-testing.repo

[epel-testing]
name=Extra Packages for Enterprise Linux 7 - Testing - $basearch
baseurl=http://centos.ustc.edu.cn/epel/testing/7/$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-testing-debuginfo]
name=Extra Packages for Enterprise Linux 7 - Testing - $basearch - Debug
baseurl=http://centos.ustc.edu.cn/epel/testing/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-testing-source]
name=Extra Packages for Enterprise Linux 7 - Testing - $basearch - Source
baseurl=http://centos.ustc.edu.cn/epel/testing/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
]]>
0 /archives/198/#comments /feed/archives/198/
CentOS 7使用TinyProxy搭建代理服务器 /archives/197/ /archives/197/ Tue, 23 Mar 2021 23:16:47 +0800 兮陌 TinyProxy和Squid都是比较优秀的代理软件,TinyProxy比较小众,虽然没有Squid的功能丰富,但是小巧简单,也能满足普通用户的需求。Squid是一款优秀的代理软件,有很丰富的ACL管理功能,虽然squid很强大,但配置比较繁琐。

推荐直接使用yum安装,这种方式简单直接,并且自动配置好了服务脚本。

1、首先安装EPEL源。

EPEL是yum的一个软件源,里面包含了许多基本源里没有的软件,我们在需要使用EPEL时安装它就可以了。

EPEL,即Extra Packages for Enterprise Linux的简称,是为企业级Linux提供的一组高质量的额外软件包,包括但不限于Red Hat Enterprise Linux (RHEL), CentOS and Scientific Linux (SL), Oracle Enterprise Linux (OEL)。

yum -y install epel-release
yum -y install tinyproxy

2、修改配置文件/etc/tinyproxy/tinyproxy.conf

# 代理端口
Port 8888
# 允许访问的地址段,默认只允许本机进行访问
# 允许所有地址访问
# Allow *
# 允许特定的网段访问
Allow 192.1638.88.0/24

3、启动TinyProxy服务并且配置为开机自启。

systemctl start tinyproxy.service
systemctl enable tinyproxy.service

后记:个人主要用途是解决内部网络中,只有部分服务器可以连接外网,其他服务器无法连接外网的问题。其他服务器可以通过可联网的服务器代理进行连接外网。

]]>
0 /archives/197/#comments /feed/archives/197/
MINIO分布式集群搭建不完全指南 /archives/196/ /archives/196/ Fri, 19 Mar 2021 13:23:00 +0800 兮陌 一、基础环境

本文档采用二进制进行MINIO分布式集群搭建,根据官方建议要求,生产环境至少四块硬盘,这样的话可以做到,挂掉一块硬盘集群依然可以读写,挂掉两块硬盘集群依然可读。

二、四节点搭建方式

1、准备机器资源

每台主机分配两块硬盘,一块作为系统盘,另一块作为MINIO数据盘。分布式MINIO里的节点时间差不能超过3秒,你可以使用NTP来保证时间一致。

主机地址MINIO数据盘挂载路径操作系统
192.168.88.11/data/minio_dataCentOS 7.9
192.168.88.12/data/minio_dataCentOS 7.9
192.168.88.13/data/minio_dataCentOS 7.9
192.168.88.14/data/minio_dataCentOS 7.9

2、创建挂载路径

在所有的节点上创建挂载目录,并把磁盘挂载到目录上。关于磁盘的挂载,自行了解。需要注意的是分布式MINIO使用的磁盘里必须是干净的,里面没有数据。

为了便于扩容使用LVM对分区进行管理,PV为sdb1,VG为minio,LV为/dev/minio/data

mkdir -p /data/minio_data
mount /dev/minio/data /data/mini_data
记得修改/etc/fstab,开机自动挂载。

3、上传MINIO和创建启动脚本

所有节点使用统一的目录存放MINIO可执行文件和启动脚本。

mkdir -p /opt/minio

首先需要去下载MINIO:https://dl.minio.io/server/minio/release/linux-amd64/minio

将MINIO可执行文件上传到/opt/minio,然后在相同的目录创建启动脚本start.sh,脚本文件内容如下:

#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio
 
/opt/minio/minio server \
http://192.168.88.11/data/minio_data \
http://192.168.88.12/data/minio_data \
http://192.168.88.13/data/minio_data \
http://192.168.88.14/data/minio_data

另一种简洁的写法:

export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio
 
/opt/minio/minio server \
http://192.168.88.{11...14}/data/minio_data
分布式MINIO里所有的节点需要有同样的ACCESS_KEY和SECRET_KEY,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将ACCESS_KEY和SECRET_KEY引入环境变量。

另外别忘了需要赋予miniostart.sh这两个文件可执行权限。

为了方便管理MINIO,编写服务脚本,将MINIO注册为服务。

[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
 
[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/start.sh
 
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=multi-user.target

脚本编写完成后,执行下面的命令注册服务。

systemctl daemon-reload

4、启动集群

在所有节点上启动MINIO服务,并且配置为开机自动启动。

systemctl start minio.service
systemctl enable minio.service

5、访问集群

使用浏览器输入地址:http://任意节点IP:9000,用户名密码为前面设置的MINIO_ACCESS_KEYMINIO_SECRET_KEY,创建Bucket并上传文件测试。

常见的错误是Server not initialized, please try again,说明集群没有搭建成功,这个就需要你去根据日志排错了。

三、双节点、双挂载搭建方式

根据官方文档,对机器数量并没有硬性要求,只是对硬盘数量有要求,亦可采用双节点、双挂载的方式搭建,甚至可以单节点、四挂载。

这里说一下思路,如果使用两台机器搭建,那么每台机器挂载两块磁盘,启动两个MINIO进程,使用两个不同的端口即可。同理,一台机器上挂载四块磁盘,启动四个MINIO进程也是可以的。

下面的启动脚本示例,使用两台机器进行部署,两个脚本需要一起执行。

start1.sh

#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio

/opt/minio/minio server --address ":9001" \
http://192.168.88.11:9001/data/minio_data1 \
http://192.168.88.11:9002/data/minio_data2 \
http://192.168.88.12:9001/data/minio_data1 \
http://192.168.88.12:9002/data/minio_data2

start2.sh

export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio

/opt/minio/minio server --address ":9002" \
http://192.168.88.11:9001/data/minio_data1 \
http://192.168.88.11:9002/data/minio_data2 \
http://192.168.88.12:9001/data/minio_data1 \
http://192.168.88.12:9002/data/minio_data2

更多内容请阅读官方文档了解:https://docs.min.io/cn/minio-quickstart-guide.html

]]>
0 /archives/196/#comments /feed/archives/196/
Maven打包后运行文件签名不合法 /archives/195/ /archives/195/ Thu, 04 Mar 2021 20:46:06 +0800 兮陌 运行jar包时报错:
java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

这是因为在使用Maven打包的时候,导致某些包的重复引用,以至于打包之后META-INF目录下多处了一些*.SF,*.DSA,*.RSA文件,我们可以通过配置打包插件来排除这些文件。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <filters>
                    <filter>
                    <artifact>*:*</artifact>
                    <excludes>
                        <exclude>META-INF/*.SF</exclude>
                        <exclude>META-INF/*.DSA</exclude>
                        <exclude>META-INF/*.RSA</exclude>
                    </excludes>
                    </filter>
                </filters>
            </configuration>
        </plugin>
    </plugins>
</build>
]]>
0 /archives/195/#comments /feed/archives/195/