最近在部署一个大型的zabbix监控,遭遇了mysql连接数不足的情况,在增加mysql的最大连接数的过程中,发现还是有点繁琐的,于是在这里记录下来。

参考:https://pjstrnad.com/mariadb-raise-number-of-connections/

首先,去编辑/etc/my.cnf,或者相应的mysql服务器配置文件。

在[mysqld]一节下方增加以下内容:

open_files_limit=12000
max_connections=10000

对应的两个参数可以根据实际需要修改。此时重启mysql服务器,发现设置并未生效,或者说生效了一半,只增加到了214,原因是systemd本身存在限制导致的。
接下来修改/etc/security/limits.conf,如果没有,就新建一个,插入以下内容。

mysql soft nofile 4096
mysql hard nofile 10240

然后创建systemd启动文件的配置

mkdir -p /etc/systemd/system/mariadb.service.d
vi /etc/systemd/system/mariadb.service.d/limits.conf

然后插入以下内容

[Service]
LimitNOFILE=infinity

完成后就可以重启MySQL服务器了

systemctl daemon-reload
systemctl restart mariadb

主页在这里:http://radicale.org/

显着无聊,在LEDE的软件源里面到处找有什么有趣的服务,结果发现了一个叫做radicale的个人CalDAV/CardDAV服务器,直接装了跑起来之后总有点问题,于是稍微研究了一下,大概是由缺失了htpasswd的原因导致的,抓log也没报任何错误,但就是没法正常工作。最后还是去官网直接看部署过程才终于搞起来。

软件使用python编写,最新的版本使用python3,目前就我所知,软件包的需求最少也有python3、pip、htpasswd,及其所有所需软件包。功能上非常简陋,但核心的功能一个不漏,源码包不到100K,还自带一个简陋的web控制页面,可以用来新增文件夹。

安装过程就和官网所说,非常简单,最少只需要2条命令就能跑起来,不过想要用得好一点就还是需要进行一些配置。

先安装radicale

python3 -m pip install --upgrade radicale

然后pip就会搞定全部的需求,官方同时推荐对密码使用bcrypt进行加密,如果使用bcrypt加密,同时使用pip安装bcrypt。同时,根据不同的发行版,把htpasswd装上,LEDE由于没有将htpasswd从apache中拆出来,所以我就把apache装上就可以用了。

好了,服务器已经安装完,进入配置环节,radicale会自动尝试从“/etc/radicale/config~/.config/radicale/config或者是尝试从系统变量中读取RADICALE_CONFIG来找到配置文件,所以直接放在/etc/radicale/config就好,当然,可以直接加参数来运行,不过我觉得没有多少人会每次都加上一堆参数来运行的吧(笑)。

创建好配置文件,就向里面填入以下内容:

[auth]
type = htpasswd
htpasswd_filename = /path/to/users
htpasswd_encryption = plain
delay = 1

[server]
hosts = 0.0.0.0:5232
max_connections = 20
max_content_length = 10000000
timeout = 10
daemon = True
pid = /var/run/radicale.pid
ssl = True
certificate = /path/to/cert
key = /path/to/key
realm = Radicale - Password Required

[storage]
filesystem_folder = /path/to/storage

[rights]
type = authenticated

根据个人需求,可以酌情修改,比如说想要规模大一点,可以对权限进行更加详细的设定,比如说哪些人能读哪些人能写,参考这里
同时可以根据需要,抓取更加详尽的log,可以参考这里
在这个例子里面,我就参考LEDE默认的那个,直接用plain存储用户名和密码,同时使用SSL对通信进行加密,证书的做法有太多,这里就不详述。
users文件可以使用htpasswd来创建,大概的格式就是用户名:密码,如果用明文的话可以直接编辑users文件来修改密码。

创建好用户名和密码之后,可以尝试使用浏览器来访问https://your.domain:5232/,会自动跳转到一个非常简陋的web控制页面能够创建、编辑、删除包括地址簿、日历、todo清单等文件夹,根据我的测试来说暂时是没法在客户端创建这些文件夹的,所以现在web控制页面建好,然后就可以到客户端添加详细的条目了。

不得不承认,不愧是服务器血统,这权限管理真的严格的,搭建好的owncloud报告没法发邮件,经过一番bing之后,找到了答案。

参考:http://stackoverflow.com/questions/25517281/swiftmailer-connection-could-not-be-established-with-host-smtp-gmail-com-conne

解决办法如下:

  1.  检查httpd_can_sendmail 是否设置为on
    getsebool httpd_can_sendmail
    • 如果返回的输出是 httpd_can_sendmail –> off , 运行
      setsebool -P httpd_can_sendmail 1
    • 如果你看到 httpd_can_sendmail –> on 那么跳到下一步
  2.  检查 httpd_can_network_connect 是否为on
    getsebool httpd_can_network_connect
    • 如果返回的输出是 httpd_can_network_connect –> off ,运行
      setsebool -P httpd_can_network_connect 1
    • 如果你看到 httpd_can_network_connect –> on 那么就跳到下一步
  3. 在服务器地址直接填ip而不是域名。

第三步感觉是另外的问题,而不是SELinux的权限阻止了邮件发送。

参考:https://wiki.openwrt.org/doc/howto/tftp.pxe-server

http://ftp.nl.debian.org/debian/dists/jessie/main/installer-i386/current/images/netboot/pxelinux.cfg/default

在家里做了个PXE服务器

刚才把那台10年历史的老电脑翻了出来,着磨着这烂XP也该换掉了,想了想,打算换成debian,由于懒得做安装盘于是果断选择走PXE,大概是因为后来主板换过了,居然支持PXE启动,好了。着手安装。

看了一下debian的安装wiki,教程里面自带一份pxelinux.cfg/default的配置文件,但是我不想覆盖掉之前的版本,于是展开了看一下

debian-installer/i386/boot-screens/menu.cfg

这个文件,里面指向了四个文件

include debian-installer/i386/boot-screens/adtxt.cfg
include debian-installer/i386/boot-screens/amdadtxt.cfg
include debian-installer/i386/boot-screens/adgtk.cfg
include debian-installer/i386/boot-screens/amdadgtk.cfg

于是在adtxt.cfg里面找到了kernel和append字段

kernel debian-installer/i386/linux
append priority=low vga=788 initrd=debian-installer/i386/initrd.gz ---
include debian-installer/i386/boot-screens/rqtxt.cfg

果断的选择将这俩字段添加到之前的default里面,然后net installer就跑起来了。没有nfs服务器出场的机会呢。

SMB自从openwrt的barrier_breaker对ipv6的支持变得非常好之后,开始对自己房间的网络更新到ipv6。

不得不说,ipv6的本地地址是个好东西,这个fe80开头的地址,由于继承了MAC地址的唯一性,所以可以直接使用而不会产生冲突。这时候,使用ipv6就不需要考虑ipv4地址是否已经配置这种问题,真正的即插即用,无需配置。

这种情况下,只要开机之后网卡起来了,SSH就能连通,过去把机器的网络配置弄错导致连不上的问题就再也没有了。

于是渐渐的将链接迁移到ipv6上。而骨干路由用的是石像鬼的固件,很遗憾,石像鬼对ipv6基本上没有支持,于是只能用在我的房间里面了。

既然SSH换过去了,Samba也自然得升上去,切换成ipv6。

经过了一番google,找到一个方法:

使用一个特别的dns服务器,将域名解析成ipv6地址,由于smb能够在ipv6上工作,这就能通过一个折中的办法,来达到访问ipv6的SMB服务器。

然而,这种办法相当的不便,因为该服务器为整个互联网服务,这意味着你必须连接到外部网络才能使用他们的服务,为毛我用自家的服务还非得跑出去一趟不可?网络延迟不说还要经一次GFW。

 

也考虑过在OptenWrt上自行设置 DNS解释记录,但是dnsmasq似乎不能处理ipv6的本地 hosts记录,于是最后还是放弃了使用ipv6。

参考:http://www.cianmcgovern.com/serving-live-arch-linux-environment-pxe/

另外参照之前关于建立pxe服务器的文章:https://ferrets.space/2014/04/07/%e5%9c%a8%e5%ae%b6%e9%87%8c%e5%81%9a%e4%ba%86%e4%b8%aapxe%e6%9c%8d%e5%8a%a1%e5%99%a8/

其中,pxelinux.cfg/default中关于archlinux启动字段是这样的

LABEL archlinuxlive
menu label Arch Linux Live 64bit
kernel archlinuxlive/arch/boot/x86_64/vmlinuz
append initrd=archlinuxlive/arch/boot/x86_64/archiso.img archisobasedir=arch archiso_nfs_srv=NFS_SERVER_IP:/home/pxeroot/archlinuxlive ip=:::::eth0:dhcp -

不同的linux的append字段都不一样呢

参考:http://wiki.openwrt.org/doc/howto/tftp.pxe-server

https://wiki.archlinux.org/index.php/NFS_(简体中文)

http://archlinuxarm.org/forum/viewtopic.php?f=31&t=3854

https://wiki.archlinux.org/index.php/Tftpd_server

新到手了只pogoplug,只用来做samba的话感觉稍微有点浪费,偶尔看到了网络启动系统这种东西,于是也想做一个来玩。

材料:一个dhcp服务器,一个tftp服务器,一个nfs服务器。

网上很多教程都是让pxe服务器自己包揽全部工作,这让我不高兴,dhcp这东西就该由openwrt做,文件服务就该让pogo来做,但是网上相关的教程都没有分工的内容,于是看着很多教程,自己研究了一下,终于成功了。

pxe网络拓扑

 

首先,在openwrt上改动一下dnsmasq的配置

/etc/config/dhcp

在末尾加上一段

config boot linux
        option filename 'pxelinux.0'
        option serveraddress 'tftp服务器地址'
        option servername '服务器名称'

至于服务器名称有没有要求……这个没试过,就照着本地的DNS名称填好了。

好了之后,重启dnsmasq,openwrt端的服务就算完成了。

接下来是pogoplug这边:

首先,是tftp服务器。安装tftp-hpa软件包,然后修改

/usr/lib/systemd/system/tftpd.service

中的tftpd根目录

[Unit]
Description=hpa's original TFTP daemon

[Service]
ExecStart=/usr/sbin/in.tftpd -s /srv/tftp/
StandardInput=socket
StandardOutput=inherit
StandardError=journal

先用/srv/tftp/做例子,先去下载https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.02.tar.gz,然后解压。这里只需要里面的部分文件,包括这些:

syslinux-6.02/bios/core/pxelinux.0
syslinux-6.02/bios/com32/elflink/ldlinux/ldlinux.c32
syslinux-6.02/bios/com32/menu/vesamenu.c32
syslinux-6.02/bios/com32/lib/libcom32.c32
syslinux-6.02/bios/com32/libutil/libutil.c32

讲这几个文件拷贝到/srv/tftp/,然后在/srv/tftp/里面新建一个文件夹,来存放kernel和initrd。例如/srv/tftp/ubuntu,或者直接将ubuntu的镜像文件挂载到/srv/tftp/disks/ubuntu,可以让tftp客户端直接访问到。

然后,新建一个文件夹/srv/tftpd/pxelinux.cfg,在里面新建一个default的配置文件,内容如下:

DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE OpenWRT PXE-Boot Menu

label Ubuntu
        MENU LABEL Ubuntu Live 13.10 64-Bit
        KERNEL disks/ubuntu/casper/vmlinuz.efi
        APPEND boot=casper ide=nodma netboot=nfs nfsroot=192.168.1.1:/mnt/extstorage/tftp/disks/ubuntu1310-64/ initrd=disks/ubuntu/casper/initrd.lz
        TEXT HELP
                Starts the Ubuntu Live-CD - Version 13.10 64-Bit
        ENDTEXT

说明文字可以自行更改,kernel和initrd会通过tftp获取,在获取到kernel和initrd之后,会通过nfs加载系统。

然后启动服务器

systemctl start tftpd.socket tftpd.service

如果需要自启动tftp服务器,则使用

systemctl enable tftpd.socket

至此,tftp服务器配置完成。

然后,是配置nfs服务器:

archlinux的nfs帮助似乎出了点问题,教程不是很完整,在网友的帮助下,发现原来服务没启动完成。

要安装nfs服务,需要安装nfs-utils。

然后,修改/etc/exports,这将会控制那些目录可以被访问,例如新增这段(根据上面pxelinnux的配置):

/mnt/extstorage/tftp/disks/ubuntu1310-64/ 192.168.1.0/24(ro,fsid=0,no_subtree_check)

将会允许192.168.1.*的客户端访问/mnt/extstorage/tftp/disks/ubuntu1310-64/。完成之后,用

systemctl enable nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service
systemctl start nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service

启动并自启动nfs服务器(吐槽:没密码真的大丈夫?)

配置过程中发生了许多问题,这里给后人稍微提供一下解决的思路:

1:openwrt的dnsmasq配置,有没有指向正确的tftp服务器,tftp服务器能不能访问;

2:nfs服务器的挂载有没有问题。

基本上都是权限或者配置文件出错……折腾了快2天……

最近在折腾自家的树莓派,需要一个不能登录的账户来访问ftp,于是稍微查询了一些相关资料。

参考:

http://desert3.iteye.com/blog/1685734

http://www.wincold.com/archives/108.html

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

首先是创建一个系统用户,设置密码,并且将其shell设置为/bin/false,这将禁用其账户的shell登录功能。

再稍微进行两下Google,很快就找到所需的操作:修改/etc/shells文件,加上一行/bin/false。

然后自己尝试登录,看到filezilla的信息滚动,成功登录,但是却卡在了列出目录的那一步,没有任何返回结果,这究竟是为什么呢?

再进行了一番Google之后,发现了问题所在,原来是因为ftp的PASV模式的问题,而vsftp服务器由于没有对PASV端口范围及相应的iptables防火墙做设置,数据传输的连接被阻塞导致命令执行超时。虽然调整ftp客户端,不使用PASV模式也能够操作,但是并不是什么时候都会有ftp客户端在手的,还是弄一下好了。

使用下面的设置来启用vsftpd的PASV模式

pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30100

然后再设置iptables,开放PASV的端口

iptables -A INPUT -p tcp --dport 30000:30100 -j ACCEPT

然后就可以顺利的使用普通的浏览器或者windows的文件管理器进行登录了。

嗯,前几天已经强制了对博客使用https访问……感觉很好很强大,博客的等级突然就高起来了。

今天偶尔发现一个网站(https://www.ssllabs.com/ssltest/index.html),可以检查网站的安全性,于是兴冲冲的去测试了一下,结果发现了几个小问题(主要的,更零碎的就没管了)。

  • 启用了一种长度较短的加密算法;
  • 没有提供完整的证书链;
  • 可能受到BEAST攻击;

前面两个的话好说,稍微查了一下网络就ok,而且startssl也提供了完整的安装教程(lighttpd Apache nginx),略后悔没有仔细看。

问题是最后一个,BEAST攻击究竟是什么啊……

上网做了很多很多的Google,还打错字了,打成了beats,于是魔声总是出来捣乱。

最后,在一个网站(http://permalink.gmane.org/gmane.linux.debian.devel.security/16698)找到了一份方案,看起来像是一份邮件的备份。

里面提到了lighttpd的解决办法,就是在配置文件里面指定一下加密的算法,并且让服务器优先使用某些算法,就可以组织这种攻击了。

ssl.cipher-list =  "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM"
ssl.honor-cipher-order = "enable"

应用了之后,再去做测试,果然BEAST攻击的提示没有了。

 

SSLLab测试结果
SSLLab测试结果

嗯,以前用着用着都是没问题的,前几天看着评论栏直接无法访问了(蛋疼的防火墙),于是干脆关掉了,可是关掉之后发现好怀念那东西的网站统计啊……好想要回来啊,于是又重新启用,结果出问题了。

得到了这样的东西

Your Jetpack has a glitch. Something went wrong that’s never supposed to happen. Guess you’re just lucky: xml_rpc-32601

Try connecting again. Error Details: The Jetpack server could not communicate with your site’s XML-RPC URL. If you have the W3 Total Cache plugin installed, deactivate W3 Total Cache, try to Connect to WordPress.com again, reactivate W3 Total Cache, then clear W3 Total Cache’s cache.

卧槽,用的好好地怎么就突然出问题了呢?

经过啦大量的搜索,找到了解决的办法,原来是跟lighttpd的rewrite有关。

根据http://en.forums.wordpress.com/topic/jetpack-instl-issue-with-ssl-and-lighttpd(要求跨越防火墙),找到了解决的办法。
有一位有类似情况的人,将rewrite规则从

#Jetpack is broken with these rules
url.rewrite-once=(
 "^/(wp-.+).*/?" => "$0",
 "^/images/.*/?" => "$0",
 "^/temp/.*/?" => "$0",
 "^/(sitemap.xml)" => "$0",
 "^/(xmlrpc.php)" => "$0",
 "^/keyword/([A-Za-z_0-9\-]+)/?$" => "/index.php?keyword=$1",
 "^/.*?(\?.*)?$" => "/index.php$1"

改成了

#Jetpack works with these rules
url.rewrite-if-not-file = (
 "^/(wp-.+).*/?" => "$0",
 "^/images/.*/?" => "$0",
 "^/temp/.*/?" => "$0",
 "^/keyword/([A-Za-z_0-9\-]+)/?$" => "/index.php?keyword=$1",
 "^/.*?(\?.*)?$" => "/index.php$1"
 )

之后,Jetpack好了。我改成这样也没问题了。