- openvpn有两种模式:
- 一种是网桥模式,
- 一种是路由模式
- 在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。
操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。
openvpn提供两种类型的虚拟网络接口:TUN和TAP,tun用于建立IP隧道,tap用于建立以太网桥,这两种模式我们也称为路由模式和网桥模式。 TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。
桥接是在一个子网上面创建一个虚拟的,广域的以太网技术,他相当于连通不同局域网之间的桥梁,桥接的优点是广播可以穿透vpn,允许依赖局域网广播的软件运行,桥接无需配置路由,可以和以太网上的任何协议工作,但是桥接的效率比路由模式要低,而且不容易扩展,使用桥接方式连接远端网络时,客户端被分配一个远端物理以太网的IP地址,从而能够和远端子网的其他机器进行通信,就像是连接在本地一样,
路由的优点是效率高可扩展,可以更好的调节MTU,路由模式的缺点是广播不能穿越vpn,仅支持ipv4,如果使用桥接模式,C/S两端都必须是tap,如果使用路由模式,C/S两端可以是tun也可以是tap,但是两端必须一致
- openvpn默认1小时重新验证一次身份,对于双因素验证的情况而言,秘钥是一次性的,重新验证必然失败,于是就会出现经典的每小时断开一次的问题,解决办法:
- server.conf 中配置:
1reneg-sec 0
- server.conf 中配置:
- 参考资料:
puppet入门实践
版本选择
本来是要选择一个最新版本(当时最新版本是4.3),怎奈官方的yum仓库(https://yum.puppetlabs.com/)中没有最新版本;至少看起来没有4.3;有的是:
https://yum.puppetlabs.com/el/6.5/products/x86_64/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
facter-1.6..... ... facter-2.4..... ... hira-1... ... mcollective-2... ... mcollective-client-2... ... mcollective-common-2... ... puppet-3... ... puppet-dashboard- ... puppet-server-... ... puppetdb-... ... puppetserver-... |
https://yum.puppetlabs.com/el/6.5/PC1/x86_64/
1 2 3 4 5 6 7 8 |
puppet-agent-1... ... puppetdb- ... puppetserver-2. ... puppetlabs-release-pc1-... ... |
那么,该如何下载呢?
这里解释一下:
puppet 4之前(目前最新版本3.8)是打包在第一个地址下的,放在products目录;
puppet4是一个大的版本更新(目前是4.3)是打包在PC1那个目录下的,什么叫PC1? 即: Puppet Collection 参考: http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html
puppet rpm包说明
puppet4之前:
puppet- 不包含facter、ruby等,这些都是单独的rpm包
puppet-server- 包含一些puppet master需要的一些配置文件(及目录),如下:
puppet-dashboard: 是一个web管理页面
——
puppet4之后:
原来的puppet就变成了puppet-agent了,而且包含facter、ruby、mcollective等rpm包,就是所谓的(All in one)
puppetserver- 和原来的puppet-server不是一个东西,现在的puppetserver 是puppet master的替代品,并且以HTTP REST的方式提供提供服务,java实现的,默认需要内存大小2g,可以在 /etc/sysconfig/puppetserver 中修改
安装
- 下载对应目录下的 puppetlabs-release-* 的最新版本的rpm,然后rpm -ivh puppetlabs-release-* ,这样就把对应的yum源给安装上了
- yum search puppet 可以看到一些puppet的包
- 对于puppet4之前
- server端:
- yum install -y puppet facter puppet-server
- client端:
- yum install -y puppet facter
- server端:
- 对于puppet4之后
- server端(原来的 puppet master虽然4.3中还保留着,但已经不建议使用,提示使用puppetserver)
- yum install -y puppetserver
- client端
- yum install -y puppet-agent
- server端(原来的 puppet master虽然4.3中还保留着,但已经不建议使用,提示使用puppetserver)
配置
使用
- puppet4之前
- master
- puppet master –no-daemonize (前台运行,方便调试)
- puppet master (生产上,后台运行)
- client
- puppet agent –test –server 10.10.10.10 (测试一下)
- master
- puppet4之后
- master
- service puppetserver start
- client
- ???
- master
批量执行命令
- 通过mcollective实现, mcollective 以前需要单独安装,现在已经包含在puppet-agent里面了;不过依赖的activemq需要单独安装: yum install -y activemq
ldap认证逻辑修改笔记
缘起
现在都流行动态码认证了,ldap这个认证领域的老大还是静态密码认证,显得有些过时了,这里试图修改认证部分逻辑已支持动态密码验证。
相关代码: servers/slapd/bind.c
编译:
- CFLAGS=”-g” ./configure
openldap依赖bdb,可以用yum安装: yum install -y db4 - ./make depend && make
- make install STRIP=”
注意: make install时默认是会去掉符号信息的;添加 STRIP=” 选项就不会去掉了(可能你也不需要make install)
开始gdb:
用户名:op->o_req_dn
密码在这里: op->o_request->oq_bind->rb_cred:
下一步就是要把密码修改,其中一部分拿到别的地方做动态密码验证,剩余部分继续给ldap来验证
ldap 验证逻辑:
火车运煤算法
转自:http://flychao88.iteye.com/blog/2187854
你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大――每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?
这道题一开始看上去好像是无解的,因为你的火车每一公里就要消耗一吨煤,而到目的地有1000公里,而火车最多只能装1000吨媒。如果你的火车可以全部装下,到目的地也会被全部烧光,一丁点也不剩。所以,很多人的第一反应都是觉得这个不太可能。
思考答题是:
- 装1000吨煤,走250公里,扔下500吨煤,回矿山。
- 装1000吨煤,走到250公里处,拿起250吨煤继续向前到500公里处,扔下500吨煤,回矿山。此时火车上还有250吨,再加上在250公里处还有250吨煤,所以,火车是可以回矿山的。
- 装上最后1000吨煤,走到500公里处,装上那里的500吨煤,然后一直走到目的。
golang debugger 之 delve
Delve is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you’re using a debugger, most likely things aren’t going your way. With that in mind, Delve should stay out of your way as much as possible.
一个监视服务进程的工具runit
json日志分析工具: jq
上篇文章介绍了jsawk,由于一些不足,这里又发现了一个更好的工具: jq
安装:
1 |
yum install -y jq |
用法:
1 |
man jq |
体验一下:
项目主页: https://stedolan.github.io/jq/
指南: https://stedolan.github.io/jq/tutorial/
手册: https://stedolan.github.io/jq/manual/
字符串连接
1 2 3 |
# echo '[{"from":"1","to":"2"},{"from":"1", "to":"2"}]'|jq -r '.[]| .from + ":" + .to' 1:2 1:2 |
(注意: 这里连接的是字符串,数字是不能直接当做字符串进行连接的)
类型转换:
1 2 3 4 5 |
# echo '[{"ID":1,"Name":"N1"},{"ID":2,"Name":"N2"}]'|jq '(.[].ID|tostring) + ":" + .[].Name' "1:N1" "2:N1" "1:N2" "2:N2" |
这里通过圆括号来单独处理一部分,然后通过tostring将输出内容转换为字符串; 也可以通过 @text 实现:
1 2 3 4 5 |
# echo '[{"ID":1,"Name":"N1"},{"ID":2,"Name":"N2"}]'|jq '(.[].ID|@text) + ":" + .[].Name' "1:N1" "2:N1" "1:N2" "2:N2" |
join:
1 2 3 |
# echo '[{"from":"1","to":"2"},{"from":"1", "to":"2"}]'|jq -r '.[]| join(":")' 1:2 1:2 |
获取对象的key:
1 2 3 |
# echo '{"a":"A", "b":"B"}'|jq -r 'to_entries[].key' a b |
等效于
1 2 3 |
# echo '{"a":"A", "b":"B"}'|jq -r 'to_entries[] |.key' a b |
等效于:
1 2 3 |
# echo '{"a":"A", "b":"B"}'|jq -r 'to_entries | .[] |.key' a b |
过滤:(通过select 过滤出Name为default的条目,然后只显示名字和ID列)
1 2 3 |
# openstack security group list -fjson|jq '.[]|select(.Name == "default")|.Name + ":" + .ID' "default:02dadaae-9d78-45ba-8fe5-496841b3c839" "default:1bfd33d7-6278-4718-9680-fd6f3328561d" |
错误的写法: (下面这个写法把Name和ID排列组合输出了)
1 |
openstack security group list -fjson|jq '.[].Name + ":" + .[].ID' |
如:
1 2 3 4 5 |
# echo '[{"ID":"1","Name":"N1"},{"ID":"2","Name":"N2"}]'|jq '.[].ID + ":" + .[].Name' "1:N1" "2:N1" "1:N2" "2:N2" |
根据path 和 select获取感兴趣的值:
1 2 3 4 5 |
# ceph status -f json|jq '(paths | select( .[-2:] == ["metadata", "ceph_version"])) as $path| getpath($path)' "ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)" "ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)" "ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)" "ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)" |
参考: https://stackoverflow.com/questions/25780807/can-i-use-a-relative-path-or-a-wildcard-in-jq
关联数组的key需要使用双引号,不能使用单引号:
1 2 |
# echo '{"a":"A", "b":"B"}'|jq -r '.["a"]' A |
1 2 3 4 |
# echo '{"a":"A", "b":"B"}'|jq -r ".['a']" jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?) at <top-level>, line 1: .['a'] jq: 1 compile error |
修改部分值
1 2 |
# echo '{"a":"A", "b":"B"}'|jq '.a="AA"' -c {"a":"AA","b":"B"} |
1 2 |
# echo '{"a":"A", "b":"B"}'|jq '.a="AA"|.b="BB"' -c {"a":"AA","b":"BB"} |
在任何一个级别中查找指定字段:
1 |
echo '[[{"a":1}]]' | jq ´..|.a?´ |
构造新对象:
关于paths的用法: 1.3 版本中还没有paths:
这里的paths放在圆括号内,不影响输出,就好比bash中的圆括号是在单独子进程中执行一样,不影响当前的环境,同时,使用as使得圆括号的输出保存在变量中,不影响后续的输入; 这样,使得getpath所在环境中的 dot 依然是原始的输入
参考资料: https://linuxtoy.org/archives/jq.html
https://github.com/stedolan/jq/issues/885
在线测试: https://jqplay.org/jq?
注意事项:
- 字符串只能使用双引号,不能使用单引号
- if 语句必须有else, 如果其中一个分支实在没啥说的就 select(false) 相当于empty
jsawk
主页: https://github.com/micha/jsawk
用途:一直以来,日志都采用 | 分隔的多个匿名的字段组成的,每个字段代表什么含义是基于位置确定的,应该说是很不用户友好的,对于不太熟悉系统的新手是不太愿意看这样的日志的,所以,如果把日志记录成json格式的,应该说是一个进步;但是,对于经常使用awk分析基于|分隔的日志的我们来讲,awk分析json似乎就太不方便了,那么,jsawk就是我们需要的分析json的awk级别的工具
体验一下:
感受:直接把一个有很多行json的日志文件直接cat给jsawk是不行的,jsawk每次只解析一个json对象(或一个包含很多json对象的数组);如果要聚合一些信息的话,还需要输出给另一个程序(awk?)进一步处理
要不改造一下jsawk?
stat荟萃
awstats
Advanced Web Statistics
ethstatus
Console-based ethernet statistics monitor
gitstats
Generates statistics based on GIT repository activity
iptstate
A top-like display of IP Tables state table entries
iostat
Report Central Processing Unit (CPU) statistics and input/output statistics for
devices, partitions and network filesystems (NFS)
netstat
netstat – Print network connections, routing tables, interface statistics, masquerade connec-
tions, and multicast membership
netstat-nat
A tool that displays NAT connections
ifstatus
Command line real time interface graphs using ncurses
pipestat
Watches data flowing over an anonymous pipe
vnstat
Console-based network traffic monitor
smemstat
Shared memory usage monitoring tool
sysstat
The sar and iostat system monitoring commands
statsd
A simple, lightweight network daemon to collect metrics over UDP
tcpstat
tcpstat reports certain network interface statistics much like vmstat does for system statistics. tcpstat gets its information by either monitoring a specific interface, or by reading previously saved tcpdump data from a file.
参考:
http://www.frenchfries.net/paul/tcpstat/