跳到主要内容

SSH内网穿透

· 阅读需 9 分钟

对于内网服务器,如果我们想从外网访问,可以借助一台拥有外网IP的云服务器,通过建立SSH反向隧道来实现访问内网服务器。

SSH隧道

首先,修改云服务器的/etc/ssh/sshd_config,在该文件的最后添加:

GatewayPorts yes
ClientAliveInterval 60
ClientAliveCountMax 3

然后重启云服务器的sshd服务使上述配置生效:

$ sudo systemctl restart sshd

如果不进行上述配置,将只有登录云服务器才可以外网访问内网服务器。

然后,内网服务器向云服务器主动建立SSH连接,并将内网服务器的22号端口转发到转发端口(任一空闲端口即可):

$ ssh -NR 转发端口:localhost:22 云服务器用户名@云服务器IP -p 云服务器SSH端口

注意,需要在云服务器的控制台配置允许转发端口的访问

云服务器SSH端口默认是22号端口,如果你修改了SSH连接的默认端口号,需要使用-p参数指明端口号,否则可以省略-p 云服务器SSH端口

使用fail2ban防范Linux服务器SSH暴力登录尝试攻击

· 阅读需 5 分钟

今天偶然看了下服务器上的日志,结果发现有人在暴力尝试SSH登录:

因为服务器是实验室内部使用,只有校园网才能连接,所以在服务器的安全上就没怎么在意。见此状况,立刻用iptables禁掉了一些IP,比如说禁掉148.235.57.190:

深入理解JAVA虚拟机——垃圾回收

· 阅读需 6 分钟

Survivor的作用

当没有Survivor时,如果增加老年代空间,需要更多存活对象才能填满老年代,这样可以降低Full GC的频率;但是,随着老年代空间加大,一旦发生Full GC,执行所需要的时间更长。

如果减少老年代空间,虽然Full GC所需时间减少;但是,老年代很快被存活对象填满,Full GC频率增加。

因此,Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生。

为什么要两个Survivor

解释一:为了解决碎片化。如果只有一个Survivor,对象在Eden创建,GC时存活对象复制到Survivor,当下次GC时,没有一个空闲的Survivor,而Survivor中也会有可回收对象,这样在Survivor中就出现了大量的空闲碎片。如果有两个Survivor,每次GC将Eden和其中一个Survivor中的存活对象复制到另一个Survivor,前一个Survivor会因此空闲,于是下次GC可以重复这样的过程,从而解决了碎片化。

解释二:复制算法将内存等分为两块,每次只使用其中一块,GC时将存活对象移至另一块,前一块因此空闲。引入Eden可以视为对内存利用的优化,相当于两个Survivor共享的区域,每次GC后Eden都会因此空闲,这样相当于扩大了Survivor,避免频繁GC。

使用对拍器调试代码

· 阅读需 4 分钟

前言

做久了LeetCode,感觉快被LeetCode给惯坏了。LeetCode体验很好,不用处理输入输出,可以在线调试代码,出错时给出用例数据和正确结果。但是,很多OJ(比如HDOJ、ZOJ等)就只有极其有限的反馈。当好不容易写完代码,结果提交上去Wrong Answer,努力找代码中的错误也找不出来,这时该怎么办?

如果能找到AC的代码,那么,可以写一个测试用例数据生成器,然后将自己写的代码的运行结果与AC的代码的运行结果进行对比,这个过程叫“对拍”。对拍是在做OJ时很常用的手段,不过,往往需要进行多次的对拍,如果每次都手动执行对拍,无疑是件很繁琐的事情。如果一件事做起来很繁琐,那么就很难坚持下去,也难以享受其中的乐趣。所以,可以编写对拍器来自动进行对拍。

为了避免不必要的手动操作,我们希望对拍器能不断生成用例数据,直到自己写的代码的运行结果与AC的代码的运行结果不一致,最后自动打开文本比对工具进行结果比对。

代码

由于个人对Python较为熟悉,而且感觉用Python写这样的小脚本比较方便,所以就用Python写的对拍器作为例子。