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

redis

redis-trib 用法:

Usage: redis-trib <command> <options> <arguments ...>

  create       host1:port1 ... hostN:portN
               --replicas <arg>
  check        host:port
  info         host:port
  fix          host:port
               --timeout <arg>
  reshard      host:port
               --from <arg>
               --to <arg>
               --slots <arg>
               --yes
               --timeout <arg>
               --pipeline <arg>
  rebalance    host:port
               --weight <arg>
               --auto-weights
               --use-empty-masters
               --timeout <arg>
               --simulate
               --pipeline <arg>
               --threshold <arg>
  add-node     new_host:new_port existing_host:existing_port
               --slave
               --master-id <arg>
  del-node     host:port node_id
 set-timeout   host:port milliseconds
 call          host:port command arg arg .. arg
  import       host:port
               --from <arg>
               --copy
               --replace
  help         (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

#初始化:
./redis-trib.rb create --replicas 1 127.0.0.1:6391 127.0.0.1:6392 127.0.0.1:6393 127.0.0.1:6394 127.0.0.1:6395 127.0.0.1:6396

#状态检查:

redis-trib.rb check 127.0.0.1:6379

#redis-cli 用法:

redis-cli 3.2.9

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  -h <hostname>        Server hostname (default: 127.0.0.1).
  -p <port>            Server port (default: 6379).
  -s <socket>          Server socket (overrides hostname and port).
  -a <password>        Password to use when connecting to the server.
  -r <repeat>          Execute specified command N times.
  -i <interval>        When -r is used, waits <interval> seconds per command.
                       It is possible to specify sub-second times like -i 0.1.
  -n <db>              Database number.
  -x                   Read last argument from STDIN.
  -d <delimiter>       Multi-bulk delimiter in for raw formatting (default: \n).
  -c                   Enable cluster mode (follow -ASK and -MOVED redirections).
  --raw                Use raw formatting for replies (default when STDOUT is
                       not a tty).
  --no-raw             Force formatted output even when STDOUT is not a tty.
  --csv                Output in CSV format.
  --stat               Print rolling stats about server: mem, clients, ...
  --latency            Enter a special mode continuously sampling latency.
  --latency-history    Like --latency but tracking latency changes over time.
                       Default time interval is 15 sec. Change it using -i.
  --latency-dist       Shows latency as a spectrum, requires xterm 256 colors.
                       Default time interval is 1 sec. Change it using -i.
  --lru-test <keys>    Simulate a cache workload with an 80-20 distribution.
  --slave              Simulate a slave showing commands received from the master.
  --rdb <filename>     Transfer an RDB dump from remote server to local file.
  --pipe               Transfer raw Redis protocol from stdin to server.
  --pipe-timeout <n>   In --pipe mode, abort with error if after sending all data.
                       no reply is received within <n> seconds.
                       Default timeout: 30. Use 0 to wait forever.
  --bigkeys            Sample Redis keys looking for big keys.
  --scan               List all keys using the SCAN command.
  --pattern <pat>      Useful with --scan to specify a SCAN pattern.
  --intrinsic-latency <sec> Run a test to measure intrinsic system latency.
                       The test will run for the specified amount of seconds.
  --eval <file>        Send an EVAL command using the Lua script at <file>.
  --ldb                Used with --eval enable the Redis Lua debugger.
  --ldb-sync-mode      Like --ldb but uses the synchronous Lua debugger, in
                       this mode the server is blocked and script changes are
                       are not rolled back from the server memory.
  --help               Output this help and exit.
  --version            Output version and exit.

Examples:
  cat /etc/passwd | redis-cli -x set mypasswd
  redis-cli get mypasswd
  redis-cli -r 100 lpush mylist x
  redis-cli -r 100 -i 1 info | grep used_memory_human:
  redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
  redis-cli --scan --pattern '*:12345*'

  (Note: when using --eval the comma separates KEYS[] from ARGV[] items)

When no command is given, redis-cli starts in interactive mode.
Type "help" in interactive mode for information on available commands
and settings.

#连接集群:
redis-cli -c -h 127.0.0.1 -p 6391

#添加节点:(假设进程已启动)
./redis-trib.rb add-node 127.0.0.1:6397 127.0.0.1:6390 #添加一个节点(默认为主节点)

./redis-trib.rb check 127.0.0.1:6390 #检查状态,为的是获取新节点的id

./redis-trib.rb add-node --slave --master-id 63ec1e7d57b3e19c6e1fa07768673001cfa0d30f 127.0.0.1:8380 127.0.0.1:6379 #为刚添加的直接点添加从节点,注意--master-id

./redis-trib.rb add-node --slave 127.0.0.1:6398 127.0.0.1:6390 #从节点的另一种添加方式,注:这种方式是随机找到从节点较少的主节点,为此节点添加从节点,所以具有随机性

#删除一个节点:
./redis-trib.rb del-node 172.16.1.1:6390 12decfd0d975ef0dcd151d0ff232da7a2269a1c2 #从节点可以直接删除,但主节点需要将slots移到其它节点,然后再删除

#重新分片:
./redis-trib.rb reshard 127.0.0.1:6390 #交互式进行,需要手动指定为新节点分配多少slots

./redis-trib.rb reshard <host>:<port> --from <node-id> --to <node-id> --slots <args> --yes #非交互式

另附:
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
CLUSTER RESET reset
CLUSTER SAVECONFIG 强制节点保存集群当前状态到磁盘上。
CLUSTER SLOTS 获得slot在节点上的映射关系

CLUSTER MEET ip port 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET node_id 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE node_id 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SLAVES node_id 列出该slave节点的master节点

CLUSTER ADDSLOTS slot [slot …] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS slot [slot …] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT slot NODE node_id 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派。
CLUSTER SETSLOT slot MIGRATING node_id 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT slot IMPORTING node_id 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT slot STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。

CLUSTER KEYSLOT key 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT slot 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT slot count 返回 count 个 slot 槽中的键

READONLY 在集群中的salve节点开启只读模式
READWRITE 禁止读取请求跳转到集群中的salve节点上

参考:
https://my.oschina.net/guol/blog/506193
http://www.redis.cn/topics/cluster-tutorial.html

首先建立随机文件


#!/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