2015
Jul
11

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 ,代表拒绝这个封包。

Example
  1. iptables -N newChain
  2. iptables -A newChain -j REJECT
  3. 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 攻击,那么你可以试著用下列这个方式来阻挡骇客攻击。

Example
  1. sudo iptables -N LOG_REJECT
  2. sudo iptables -A LOG_REJECT -j LOG --log-prefix "INPUT:REJECT: " --log-level 6
  3. sudo iptables -A LOG_REJECT -j REJECT
  4.  
  5. sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  6. 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 就再来不能进到我们的网站。

相关资料


回應 (Leave a comment)