SSH和谐主机的iptables设置参考
这是一个关于SSH番羽土啬的话题,标题及文中的“和谐”=“番羽土啬”,感叹一下我们的文字。
因为21现在手上的VPS数量比较乐观(不是壮观……),因此其中有专司VPN和谐的、SSH和谐的、第三方推和谐的等用途,当然,Mr. 21博客也在其中一个VPS上,用的LNMP包。
写这个话题的起因是这样的,在北山老卫大神的Q群里面,有人提到了想以SSH和谐帐号来换取一些东西,因此引发了21对此的讨论。我的主要观点是不支持这么做,因为不安全(可以参考《利用Linux内核的多个安全漏洞提权》,不过本文内容与此关系不大),加上之前帮番茄童鞋配置iptables,因此引发了21对SSH和谐主机安全方面的思考,其中的一方面就是用iptables来过滤不和谐的东西。
是这样的,因为做实验的这个VPS我只用于SSH和谐,并且一般和谐仅限于Web浏览及各种基于Web的应用,所以,以下策略仅开放SSH的22端口并对其它的东西做了相应的限制。
初始化防火墙
第一步,我们总是要把一些知道的和不知道的先通通打倒了再说,于是,请如此:
1 2 3 4 5 6 7 8 9 |
#清除现有的规则 ~#: iptables -F ~#: iptables -X ~#: iptables -Z #设定默认策略为丢弃包 ~#: iptables -P FORWARD DROP ~#: iptables -P OUTPUT DROP ~#: iptables -P INPUT DROP |
以上是一些初始化的动作,以下是具有具体功能的策略。
防火墙规则参考一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#允许本地回环 ~#: iptables -A INPUT -i lo -p all -j ACCEPT #允许22端口接受连接 ~#: iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许传入的数据包状态 ~#: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许传出的数据包状态 ~#: iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #允许传入PING的ICMP包 ~#: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT |
这几条规则实现的效果是:
- 22端口允许用户主动发起TCP连接,一般用于提供SSH服务,如果你的SSH端口不是22,请修改;
- 其它端口需要ESTABLISHED、RELATED两种状态的数据包才能通过,而通常这两种状态的数据包在TCP协议上的定义是已经建立了连接的后续数据包,也就说,别人无法对你的任何端口主动发起连接,但是由你主动发起连接的数据包可以通过,比如说看网页的数据;
- 包状态NEW允许SSH用户对外的主动发起连接;
- 允许外部用户PING本机,这个嘛,方便自己测试,要不挂了都不知道。
- 关于数据包状态,我是参考这里 http://liubin.blog.51cto.com/282313/110394 。
这样,虽然防住了外面进来的问题,但一定程度上来说,用户通过SSH登录以后就可以干他想干的事情了,对于应用的范围不能达到一个控制的目的,比如 说,我前面提到的“一般和谐仅限于Web浏览及各种基于Web的应用”,是的,和谐嘛,也就是用这些了,顶天了再来个FTP或者跳板另外的SSH,于 是,21便想到了稍微BT一点的限制,请看参考二。
防火墙规则参考二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#允许本地回环 ~#: iptables -A INPUT -i lo -p all -j ACCEPT #允许22端口的数据进出 ~#: iptables -A INPUT -p tcp --dport 22 -j ACCEPT ~#: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT #允许状态正常的数据包进入 ~#: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许访问外部的80、81、8080、443等端口 ~#: iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT ~#: iptables -A OUTPUT -p tcp --dport 81 -j ACCEPT ~#: iptables -A OUTPUT -p tcp --dport 8080 -j ACCEPT ~#: iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT #允许UDP数据包外发,由于浏览器发起的是1024~65536之间的随机端口,无法限制为具体端口 ~#: iptables -A OUTPUT -p udp -j ACCEPT #允许PING测试的数据包进出 ~#: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT ~#: iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT |
好吧,规则二实际上能实现跟规则一差不多的效果,就是让SSH和谐用户能正常浏览Web内容及使用Web应用,那区别在哪里呢?之前提到了规则一的 SSH用户只要登录进系统,就可以对外发起任何连接了,而规则二只允许用户发起目标端口为80、81、8080、443(https)的TCP连接和任意 UDP连接,这样就能有效的限制用户对于SSH的应用范围。
小结
基本上,两个规则都实现了主机仅提供SSH服务(参考一)用于浏览网页(参考二)的目的,并且使用iptables对服务器的其它端口都进行了一些 屏蔽,同时提供两种规则方式来实现不同的需求,实际上仅仅这样还是不够的,因为让用户登录到shell里面毕竟还是有一定风险的,特别是一些弱密码的用户 也有被暴力猜解的风险,我个人是使用fail2ban的方案来解决暴力猜解的问题,请参考《小内存优化VPS的LNMP及fail2ban配置》,同时还有denyhosts也是用于防止暴力猜解的,可以参考:《Linux VPS上DenyHosts阻止SSH暴力攻击》。
以上内容是21这两天闲来无事的个人研究成果,才疏学浅难免存在一些不合理或不够精简的地方,如果你有任何意见,请留言指教,谢谢。
-EOF-
——————–
参考引用:
1. Google: http://www.google.com/ncr
2. iptables 状态机制的描述:http://liubin.blog.51cto.com/282313/110394
3. 定制iptables防火墙策略:http://ailixing.blog.51cto.com/188828/37309
原文:http://mr21.in/network-technology/a-iptables-configure-example-for-ssh-host.html