iptables 是 Linux 系统内建的防火墙设定 ,专门用来过泸网路封包,正确的设定 iptables 规则可以有效提升 linux 网路安全,例如网管人员需要设定开放哪些 IP 与哪些 Port,来阻挡骇客们的 IP ,防止 DDos 攻击。
iptables 的设计结构可以分三层, Table -> Chains -> Rules , iptables 中可以包含多个 Table ,而一个 Table 又可以包含多个 Chain ,一个 Chain 也可以包含多个 Rule 。
- Table :防火墙规则群组。
- Chain:防火墙规则链。
- Rule:防火墙规则。
上面中 Table A 里设定了两个 Chain 分别是 Chain A 与 Chain B ,而这两个 Chain 又分别设定了两个 Rule ,一个是记录封包资讯,然后第二个 Rule 再来决定是否要丢弃这个封包。
Chains & Tables
iptables 内建有五个 Tables , 分别是 Filter Table, NAT Table, Mangle Table, Raw Table, Security Table。
Filter Table :
Filter Table 是 iptables 中预设的 table,如果你没有新增自订的 Table ,那么 iptable 会使用 Filter Table 里的设定来处理网路封包。
Filter Table 预设有三个 Chain : INPUT, OUTPUT, FORWARD, 分别用来处理三种不同的网路封包。
- INPUT chain:处理由外部机器传过来的封包。
- OUTPUT Chain:处理本机传出去给别台机器的封包。
- FORWARD Chain:处理外部机器透过本机,要传给第三方机器的封包,如果你的机器是一台 Router or Proxy,才会存在这种封包。
NAT Table : Network Address Translation
NAT Table 预设有二个 Chain : PREROUTING, POSTROUTING 。
- PREROUTING chain : 再 Routing 之前转换封包来源 IP 资讯,例如。
- POSTROUTING chain : 再 Routing 之后转换封包本机 IP 资讯,例如本机 IP 会写成 127.0.0.1 ,但是传送出去后,会转换回对外开放的 IP 如 10.99.82.1。
Rule & Target
iptables 预设有三种 Target ,分别是 ACCEPT, REJECT, LOG 。
- ACCEPT:接受这个封包
- REJECT:拒绝这个封包
- LOG: 记录下这个封包, Log 写入档案 /var/log/message
如何使用 iptables
使用 iptables 前,前先确定你的系统有安装以下两个套件。
- iptables
- iptables-services
安装方式如下:
sudo yum install iptables-services iptables
iptables 自订 Chain
除了上述提到的三个基本的 Chain 之外,iptables 还可以自订其他的 Chain , chain 是锁链的意思,代表各种不同的 chain 可以串接在一起,合成多种组合。
自定义一个新的 chain
iptables -N LOG_REJECT
新增一个 rule , 这个 chain 的所有封包会写入 LOG。
iptables -A LOG_REJECT -j LOG --log-prefix "Reject this packet : " --log-level 6
新增一个 rule , 这个 chain 的所有封包会被拒绝处理。
iptables -A LOG_REJECT -j REJECT
上面三个 rule 就能组合出一个简单的封包阻档规则,凡是所有进入 "LOG_REJECT" 这个 chain 的封包,都会先写一个 log 到 /var/log/message 这个档案,然后这个封包会被丢弃,完全不处理。
最后我们只要再指定那些 IP 会进入这个 LOG_REJECT Chain ,便可以轻松的阻挡他们。
iptables 参数
- -I, --insert chain [rulenum] rule-specification : -I 代表 insert 的意思,新增一个 rule ,
- 第一个参数会 chain 的名称
- 第二个参数为 rule 的顺序,预设值为 1 ,如果你指定为 1 ,那么新的 rule 会放在列表的最上头。
- 范例: sudo iptables -I INPUT 1 -j ACCEPT
- -j, --jump target :当封包符合这个 rule ,透过 -j 的指示,将这个封包丢到指定的 chain 去决定下一个行为。
我们可以使用指令 " sudo iptables -N newChain ",来建立一新的 chain 叫 "newChain" ,再透过 -j newChain ,将封包下一步的行为传到这个新的 chain 来决定,例如下面这个范例,我将 80 port 的所有封包丢给 newChain 来决定要怎么处理,"newChain" 里面再指定 "-j REJECT", REJECT 是一个预设的 Rule Target ,代表拒绝这个封包。
- iptables -N newChain
- iptables -A newChain -j REJECT
- iptables -I INPUT 1 --dport 80 -j newChain
- -i, --in-interface name : 指定网卡代号,可以用 any 代表全部的网卡
- -D, 删除一条 iptables 规则,"INPUT 1" 代表 iptables list 中的第一条规格。
sudo iptables -D INPUT 1
restart iptables 会重新 initialize 所有的 iptable rule ,预设的 rule 会从 /etc/sysconfig/iptables 这个档案取得,所以当每次 restart iptables 后,一定要记得重新增加自订的 rule 。
sudo service iptables restart
使用 -F 参数可以清除 iptables 所有的 rule 。
sudo iptables -F
使用 iptables-save 参数可以储存所有的 chain & rule 。
sudo iptables-save > myIptables
如何阻挡某一段 IP 访问 80 Port,并将阻挡的记录写入 /var/log/message
如果你的电脑常常且持续的被某一些固定 IP 攻击,那么你可以试著用下列这个方式来阻挡骇客攻击。
- sudo iptables -N LOG_REJECT
- sudo iptables -A LOG_REJECT -j LOG --log-prefix "INPUT:REJECT: " --log-level 6
- sudo iptables -A LOG_REJECT -j REJECT
- sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
- sudo iptables -I INPUT -s 11.123.0.0/16 -p tcp --dport 80 -j LOG_REJECT
Forward port to others
- iptables -P FORWARD ACCEPT
- iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp --dport 80 -j DNAT --to 127.0.0.1:443
防止 DDoS 攻击
网路上有很多坏人,会用程式不断的再我们的网站上留言,所以我写了一个简单的小工具叫 DDoS Defender,用来阻挡这个坏人的 IP。
这个工具主要是用来防止坏人不断的用 POST 来写资料,预设的规则是若是该 user 五分钟内有超过五次 POST ,DDoS Defender 就会将该 IP 写入 Linux iptables 的 Reject 名单,如此这个 IP 就再来不能进到我们的网站。