iptables 是一套 Linux 下的防火墙,可以按需要建立 iptables 规则,允许或阻挡网络流量。但透过 SSH 设定 iptables 时要格外小心,因为如果设定错误,可能会阻挡外部连线,需要到机器面前进行修复,多年前我试过输入一道错误的 iptables 指令,搞到要立即赶到 data center 修复。
iptables 设定时主要分三种类型,分别是 INPUT, FORWARD 及 OUTPUT。
INPUT: 这个行为是外来的连线,例如从远端 SSH 到服务器,iptables 会将这个连线定义为 INPUT。
FORWARD: 这是外来的连线,但最终目的地不是服务器本身,只是转送到其他机器,例如路由器,除了 routing, NAT 等网络服务外,一般上不会用到这种类型。
OUTPUT: 从本机连接到外部的连线,这个可以允许或阻挡本机连接对外的服务。
而 iptables 对匹配连线会有三种不同动作:
Accept: 允许连线。
Drop: 将连接 Drop 掉,就像连线从未建立,不会反回错误。
Reject:不允许连线,但会反回错误
现在来看看 iptables 的实例,首先输入以下指令列出目前 iptables 的规则:
假如想阻挡所有从 1.2.3.4 的连线,语法是这样:
上面的 iptables 指令,”-A” 是建立规则的意思,-s 后是指定目标 IP.
假如想阻挡成个 class c 的网络,语法改成这样:
或者
看过阻挡 IP 地址后,iptables 同样可以阻挡 port 的连线,例如想阻挡 ip 1.2.3.4 连线到 SSH, 只要加上 –dport 参数:
如果要定义其他的 port, 将上面 ssh 改成想阻挡的 port 即可,可以是服务名称,或者是 port 数字。而 -p 是 protocol 的意思,上面是阻挡 tcp 类型的连线。
如果要将所有 SSH 的连线阻挡,只要将 ip 的部份删除即可:
当设定好 iptables 后,要将规则储存,否则下次重新开机设定会消失,又要重新设定。要储存 iptables 设定,输入以下指令:
Redhat / CentOS:
Debian / Ubuntu: