把服务器从Internet上隐藏起来

天下武功唯快不破,然而网上安全,只能靠隐身了,你压根就不在网上,黑客拿你也没办法,当然,若遇到像电影《超验骇客》中那种在空气中通过纳米粒子传播的病毒,还是老老实实等毒来吧。这是一部很有深度的电影,网上褒贬不一,但这部电影给人类永生的梦想指了一条似乎可行的路。
最强客串,这个开挂者最近想把电影中的脑机互联变为现实。

赛扬版的PINN,能秒破比特币病毒加密的文件

要在网上藏起来,唯一的办法就是让别人扫描不到你,本文通过nmap和ssh来举例。
nmap扫描后会报告6种状态,具体可以看这里,我们要实现的就是别人扫描后报告是的closed状态,没有应用程序监听这个端口,而不是其他5种状态,因为其他5种状态都会让人怀疑端口有在监听,只是被防火墙挡住了。
不管是书上还是老师,前辈教的linux安全经验里面都有一条,修改sshd监听端口,然后却不管以后使用诸如scp、rsync等工具的复杂成本。我们从小就被教育成书上说的就是对的,老师说的就是真理,所以对修改22端口这一条都深以为然,顺便还会鄙视一番那些没改端口的人。
本文用两台虚拟机来做这个实验,明明开着22端口,但扫描22端口确是关闭状态。
A机器装好nmap用来扫描,B机器开着22端口。
当B机器上的入站规则链的策略设为DROP(生产服务器慎用此条,除非你想去机房看看)的时候:

扫描结果:

[root@t11 ~]# nmap -p 22 192.168.2.183

Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-21 16:36 CST
Nmap scan report for 192.168.2.183
Host is up (0.00034s latency).
PORT   STATE    SERVICE
22/tcp filtered ssh
MAC Address: 00:50:56:2E:44:54 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds

filtered状态表明数据包被防火墙等设备阻止,端口可能是开启状态

当B机器上的入站规则链的策略如下所示的时候:

[root@YUM ~]# iptables -I INPUT -p tcp -s 192.168.2.100 --dport 22 -j ACCEPT
[root@YUM ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
[root@YUM ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  113  7468 ACCEPT     tcp  --  *      *       192.168.2.100        0.0.0.0/0           tcp dpt:22 
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 13 packets, 1212 bytes)
 pkts bytes target     prot opt in     out     source               destination 

192.168.2.100是我真机的VMnet8网卡的IP,放行这个IP,真机才能登录到B机器。
扫描结果:

[root@t11 ~]# 
[root@t11 ~]# nmap -p 22 192.168.2.183

Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-21 16:50 CST
Nmap scan report for 192.168.2.183
Host is up (0.00049s latency).
PORT   STATE    SERVICE
22/tcp filtered ssh
MAC Address: 00:50:56:2E:44:54 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds

当我们停掉B机器的sshd服务的时候:

扫描结果:

[root@t11 ~]# nmap -p 22 192.168.2.183

Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-21 16:52 CST
Nmap scan report for 192.168.2.183
Host is up (0.00038s latency).
PORT   STATE  SERVICE
22/tcp closed ssh
MAC Address: 00:50:56:2E:44:54 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds

终于看到了我们想要的closed状态,显然我们不能关闭sshd服务。

我们要让sshd通过22号端口提供服务,但又要让nmap等工具扫描的时候报告closed状态,方法如下:

[root@YUM ~]# iptables -I INPUT -p tcp -s 192.168.2.100 --dport 22 -j ACCEPT
[root@YUM ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset
[root@YUM ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   64  4260 ACCEPT     tcp  --  *      *       192.168.2.100        0.0.0.0/0           tcp dpt:22 
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with tcp-reset 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 5 packets, 748 bytes)
 pkts bytes target     prot opt in     out     source               destination  

注意,此时我敲黑板敲得满教室都是灰
一定要先配置一条允许指定 IP 连接 ssh 服务的规则,否则,你的服务器将会失联。
iptables -I INPUT -p tcp -s 192.168.2.100 --dport 22 -j ACCEPT

修改了下原来的REJECT规则,追加了一截“--reject-with tcp-reset”
扫描结果:

[root@t11 ~]# nmap -p 22 192.168.2.183

Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-21 17:00 CST
Nmap scan report for 192.168.2.183
Host is up (0.00044s latency).
PORT   STATE  SERVICE
22/tcp closed ssh
MAC Address: 00:50:56:2E:44:54 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds

最终达到了我们想要的效果。
稍微解释下:
当我们用iptables -A INPUT -p tcp --dport 22 -j REJECT 添加规则的时候,其实这条语句是iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-port-unreachable 的简写,后面的--reject-with icmp-port-unreachable是默认项,被省略了,如图:

在一般情况下,不可达的端口通常生成一个ICMP Port Unreachable响应。然而,我们为了安全考虑并不想生成这些错误,因为这意味着一个服务正在该端口上监听,从而就暴露了该服务的存在。此时可通过--reject-with tcp-reset的方式生成调整后的REJECT响应,让该端口像未被使用且关闭,同时也没有进行过滤。

iptables防火墙规则之间的优先顺序

数据包过防火墙的时候,防火墙上有一条条的过滤规则,数据包会按第一条规则、第二条规则、第三条规则这样的顺序进行匹配和处理。根据高效原则,如果找到一条匹配改数据包的规则,就不继续看后面的规则了。看下面的例子:
iptables -I INPUT -p tcp -s 192.168.2.100 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset
当你本机的 ip 是 192.168.2.100 的时候,通过22端口去连接服务器,匹配到了第一条规则,访问被放行。
当其他机器用端口扫描工具来扫你服务器的22端口的时候,因为其他机器的源 IP 不是 192.168.2.100 ,第一条规则匹配不上,继续看第二条规则,tcp-reset跟黑客的机器报告说,我的服务器上的ssh端口压根没打开,而不是说ssh可能被防火墙保护起来了。
若你看不懂本文,一定不要照着本文配置 iptables ,否则,你的服务器很可能跟你说再见。

当你没修改sshd端口,也没做任何安全措施的时候,开机45天有人一直在尝试登录你的服务器,次数多达23万。

原创文章,转载请注明: 转载自笛声

本文链接地址: 把服务器从Internet上隐藏起来

4 条评论

  • 紫茎泽 2017年5月21日 回复

    电影是不错。

  • 姜辰 2017年6月3日 回复

    这个没看懂,倒是把电影看了~

    • dige 2017年6月3日 回复 作者

      电影主演是海盗叔哦,文章说的是,当别人扫描到你主机IP的时候,除了80端口,其他端口全是关闭状态,想要黑你,只能通过80端口进来。

  • 广州网站建设 2018年10月17日 回复

    还不错

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Copyright © 2015-2024 笛声博客 All Rights Reserved     浙ICP备15036123号-1