星阑实习(八)-工作中的一些琐碎笔记
前段时间xrayteam来成都团建,和很多大佬在成都面基。和郁离歌交流得知郁神原来在星阑实习。恰好也在招安全开发实习,就让郁神帮忙推了一下简历,当天就约了面试。冯佬面的我,原来是亚马逊的大佬orz,看来又能学到不少东西了。我们组面前做的是蜜罐的项目,虽然之前没有接触太多,但是赶紧学起来。原本是把一些工作工作琐事的细节分开记录的,既然是项目中遇到的,我就统一写到一起了,方便之后review。不定时更新补充。
刚开始这几天主要还是熟悉项目代码,搭建环境什么的。当然先把环境跑起来也不是非常顺利的,简单记录一下。
本身项目最好跑在虚拟机里,但说实话除非迫不得已我一般都不想开虚拟机因为每次新的镜像,重新配置各种,再yum换源更新费很长时间。有些源还是国外的还配置代理很烦人。我现在是基本很多都是用香港的vps来做,一方面快照镜像可以随时换,国际带宽随便从国内外仓库拖个东西都很快,省去了很多麻烦。
1.linux上配置openvpn客户端
win上的配置就不说了,linux上我也是第一次尝试,不过也很容易。
yum -y install openvpn
OpenVPN 安装完成后会在 /etc/openvpn
生成对应的文件,直接把ovpn配置文件放到该目录下即可。
执行如下命令:
openvpn –daemon –cd /etc/openvpn –config client.ovpn –auth-user-pass /etc/openvpn/passwd –log-append /var/log/openvpn.log
–daemon # 后台运行
–cd # 配置文件目录路径
–config # 配置文件名称
–auth-user-pass # 指定账号密码文件
–log-append # 日志文件
这里我的ovpn是不需要每次输入密码连接的那种。
这样就可以在linux上访问内网了。其次后来我发现还有一个好处就是vps上部署了openvpn,我用v2ray科学上网(也是这台vps)的时候也会顺便帮我代理内网的流量,一举两得。
再配合SwitchyOmega这个插件,在复杂网络情况都能更方便的走代理。
2.golang包名大小写导致无法编译?
配置git的ssh公钥后把项目源码拖到本地部署,按照项目文档直接编译即可。
在vps上我的golang是1.15的版本,本地是1.14的版本。包名是大写的,而import的时候是小写的,在本地的goland也没有提示报错,编译也可以通过。但是在vps上编译就报错了。
暂不清楚是golang版本导致的还是不同操作系统编译时导致的?这个以后多注意开发规范,统一写法。
3.TODO 注释(结合 PyCharm)
之前一直没写过 todo注释,偶然发现同事写的注释为什么是高亮的?
原来是加了todo,而普通注释则是灰色显示的。TODO 自然表示需要做而未做的一些待完成的事项,有助于事后的检索,以及对整体项目做进一步的修改迭代。
4.使用iptables默认拒绝所有导致sshd 响应慢原因分析
因为最近在用ansible下发iptables规则,连接某台服务器时发现 sshd 时响应很慢,可能十多秒,甚至几十秒。SSHD 服务的 DNS 反向解析 功能默认开启所造成,且找到修正方法为:
- 编辑 /etc/ssh/sshd_config 文件
- 找到 #UseDNS yes
- 将其改为 UseDNS no
- 重启 sshd 服务
上面的修正方法是禁用了 sshd 服务的 DNS 反向解析功能。
其实,默认开启反向解析是其中原因之一,但是背后真正的元凶是开启了严格的 iptables 防火墙规则,如果禁用掉 iptables 防火墙,那么服务器可以高速自由的连接 DNS 服务器,那么即使反向解析开启,那么对连接速度也没太多影响。
首先,我在服务器上设置两条规则:
- iptables -A INPUT -p tcp –dport 22 -j ACCEPT
- iptables -P INPUT DROP
第 1 条规则是允许 22 端口的连接。
第 2 条规则设置 INPUT 链中的默认策略是 DROP,即不接受任何输入连接。如果这两条规则弄反了那就要裂开了。当然,可以先停止 iptables 服务,然后将规则写到一个脚本中,并将该脚本放在 /etc/rc.d/rc.local 文件中,然后重启服务器即可。若不,还可以在停止 iptables 服务后,将规则事先写到 /etc/sysconfig/iptables 文件中,然后再重启 iptables 服务。
所以,在第 1 和 第 2 条规则的配合下,服务器只接受 sshd 服务的连接,其它的一律拒绝。在这种情况下,就会出现 sshd 响应慢的问题了。
当 ssh 客户端发来连接时,sshd 服务器将客户端所在主机的 IP 到 DNS 服务器去执行反向解析。注意,此时防火墙的 OUTPUT 链是不做任何限制的,因此这个反向解析请求是能够发到 DNS 服务器那边去,而 DNS 也会回应。这时问题就出现了,由于上面的 iptables 规则的限制,DNS 的回应没法被服务器所接收到,因此 sshd 只有不断的去重复反向解析操作,会一直等到请求超时为止。这里,这个重复去请求反向解析的操作所耗去的时间就是你连接 sshd 时发现很慢的这一事实。在超时后,sshd 这才去应答 ssh 客户端。
在了解上面的原因之后,解决办法就简单了。在 iptables 的 state 模块里定义了一个 ESTABLISHED 的状态,该状态简而言之就是只要发送端或接收端只要有一方已经成功建立了连接,那么我们就认为这个状态是 ESTABLISHED ,另外,DNS 解析使用的是 udp 协议,因此我们可以用再为 iptables 添加一条规则:
iptables -A INPUT -p udp -m state –state ESTABLISHED -j ACCEPT
这么做之后,在发生 DNS 反向解析时防火墙不会再阻拦 DNS 服务器端发送过来的响应,因此 sshd 的响应速度就提高了。
5.用 hostname -i 获取ip的bug
本来和同事讨论的获取主机上ipv4的地址。
ip ad | grep inet | sed '/inet6\|127.0.0.1/d' | awk '{print $2}' | sed 's/\/24//'
而我提议用hostname -i 来获取ip,之前积累的一个小trick,这种方式明显简单很多,但是却出现了问题。
当主机名为localhost的时候,却只能获取到回环地址。这里确实存在问题,毕竟在生产环境中还是要小心使用。
赞赏微信赞赏支付宝赞赏
2条评论