iptables是基于Linux kernel的防火墙软件,出现在kernel 2.6及以后的版本中。
1 封包进入流程:规则顺序的重要性
iptables 是利用封包过滤的机制,所以他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。当一个网络封包要进入到主机之前,会先经由NetFilter 进行检查,那就是iptables 的规则了。检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP)! 如果这个封包并不符合Rule 1 的比对,那就会进入Rule 2 的比对了!如此一个一个规则去进行比对。
2 iptables的表格(table)和链(chain)
Linux 的iptables 至少有三个表格,包括管理本机进出的filter 、管理后端主机 (防火墙内部的其他计算机)的nat 、管理特殊旗标使用的mangle (较少使用) ,还可以自定义额外的链。
每个表格与其中链的用途分别是这样的:
filter (过滤器):主要跟进入Linux 本机的封包有关,这个是预设的table
INPUT:主要与想要进入我们Linux 本机的封包有关;
OUTPUT:主要与我们Linux 本机所要送出的封包有关;
FORWARD:与Linux 本机比较没有关系,他可以转递封包到后端的计算机中,与下列nat table 相关性较高。
nat (地址转换):是Network Address Translation 的缩写,这个表格主要在进行来源与目的之IP 或port 的转换,与Linux 本机较无关,主要与Linux主机后的局域网络内计算机较有相关。
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关
mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,早期仅有PREROUTING 及OUTPUT 链,不过从kernel 2.4.18 之后加入了INPUT 及FORWARD链。较少使用。
3 本机的iptables语法:默认的filter
3.1 查看规则
查看默认的filter规则:
iptables -L -n:
Chain INPUT (policy ACCEPT) <==针对INPUT链,预设为接受
target prot opt source destination <==说明栏
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED <==第一条规则
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第2 条规则
ACCEPT all -- 0.0.0.0/00.0.0.0/0<==第3 条规则
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh <==依次类推
...
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policyACCEPT)<==针对FORWARD链,默认为接受
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) <==针对OUTPUT链,默认为接受
target prot opt source destination
列出nat table三条链的规则:iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source
target:代表进行的动作,ACCEPT 是放行,而REJECT 则是拒绝,此外,还有DROP (丢弃)的项目!
prot:代表使用的封包协议,主要有tcp, udp 及icmp 三种封包格式;
opt:额外的选项说明
source :代表此规则是针对哪个『来源IP』进行限制
destination :代表此规则是针对哪个『目标IP』进行限制
针对单机来说,INPUT与FORWARD 算是比较重要的管制防火墙链,所以最后一条规则的政策是REJECT (拒绝)。虽然INPUT 与FORWARD 的政策是放行(ACCEPT), 不过在最后一条规则就已经将全部的封包都拒绝了。
filter的INPUT的5条规则依据输出结果的说明:
1. 只要是封包状态为RELATED,ESTABLISHED 就予以接受
2. 只要封包协议是icmp 类型的,就予以放行
3. 无论任何来源(0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式(prot 为all),通通都接受,仅针对每部主机都有的内部循环测试网络 (lo) 接口
4. 只要是传给port 22 的主动式联机tcp 封包就接受
5. 全部的封包信息通通拒绝
3.2 iptables-save查看完整的非规格化输出的防火墙规则
# Generated by iptables-save v1.4.7 onThu Dec 12 17:45:36 2013
*nat
:PREROUTING ACCEPT [281424:128898218]
:POSTROUTING ACCEPT [341:22936]
:OUTPUT ACCEPT [341:22936]
COMMIT
# Completed on Thu Dec 12 17:45:36 2013
# Generated by iptables-save v1.4.7 onThu Dec 12 17:45:36 2013
*filter <==星号开头的指的是表格,这里为filter
:INPUT ACCEPT [0:0] <==冒号开头的指的是链,三条内建的链
:FORWARD ACCEPT [0:0] <==三条内建链的政策都是ACCEPT
:OUTPUT ACCEPT [14792:6996050]
-A INPUT -m state --stateRELATED,ESTABLISHED -j ACCEPT <==针对INPUT 的规则
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT <==针对本机内部接口开放,“-i lo” 指的就是l适配卡进来的封包
-A INPUT -p tcp -m state --state NEW -mtcp --dport 22 -j ACCEPT
...
-A INPUT -j REJECT --reject-withicmp-host-prohibited
-A FORWARD -j REJECT --reject-withicmp-host-prohibited <==针对FORWARD 的规则
COMMIT
# Completed on Thu Dec 12 17:45:36 2013
3.3 清除规则
清除本机防火墙(filter) 的所有规则:
iptables -F #清除所有的已订定的规则
iptables -X #杀掉所有使用者"自定义"的chain (应该说的是tables )
iptables -Z #将所有的chain 的计数与流量统计都归零
ps:这三个指令会将本机防火墙的所有规则都清除,但却不会改变预设政策(policy)
3.4 定义规则:清除完所有规则,就可以一条一条来设定规则
3.4.1定义预设政策policy
当你的封包不在你设定的规则之内时,则该封包的通过与否,是以Policy 的设定为准。
若对于内部的使用者有信心的话,那么filter 内的INPUT 链方面可以定义的比较严格一点,FORWARD 与OUTPUT则可以订定的轻松一些。将本机的INPUT 设定为DROP ,其他设定为ACCEPT :
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
3.4.2 封包的基础比对:IP,网域,接口装置
设定lo 成为受信任的装置,亦即进出lo 的封包都予以接受:
iptables -A INPUT -i lo -j ACCEPT
注解:没有列出-s,-d等等的规则,表示:不论封包来自何处或去到哪里,只要是来自lo 这个界面,就予以接受,所谓的信任装置。假如你的主机有两张以太网络卡,其中一张是对内部的网域,假设该网卡的代号为eth1 好了,如果内部网域是可信任的,那么该网卡的进出封包就通通会被接受,那你就能够用:”iptables -A INPUT -i eth1 -j ACCEPT“来将该装置设定为信任装置。不过,下达这个指令前要特别注意,因为这样等于该网卡没有任何防备了:
iptables -A INPUT -i eth1 -s 172.18.218.0/24 -j ACCEPT
记录某个规则:-j LOG
iptables -A INPUT -s 192.168.2.200 -j LOG
只要有封包来自192.168.2.200 这个IP 时,那么该封包的相关信息就会被写入到/var/log/messages
3.4.3 TCP, UDP 的规则比对:针对端口设定
--sport 端口范围:限制来源的端口口号码,端口口号码可以是连续的,例如1024:65535
--dport 端口口范围:限制目标的端口口号码。
联机进入本机port 21 的封包都抵挡掉:
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
--syn标志:将来自任何地方来源port 1:1023 的主动联机到本机端的1:1023 联机丢弃:
ptables -A INPUT -i eth0 -p tcp --sport1:1023 --dport 1:1023 –syn -j DROP
一般来说,client端启用的port 都是大于1024 以上的埠口,而server 端则是启用小于 1023 以下的埠口在监听的。所以我们可以让来自远程的小于 1023以下的端口口数据的主动联机都给他丢弃。不适用于ftp联机。
3.4.4 iptables 外挂模块:mac与state
iptables -A INPUT [-m state] [--state状态]:
-m:一些iptables的外挂模块,包括state,mac等。
--state :一些封包的状态,INVALID ,ESTABLISHED,NEW,RELATED(表示这个封包是与我们主机发送出去的封包有关)
只要已建立或相关封包就予以通过,只要是不合法封包就丢弃:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
针对网卡来进行放行与防御:
针对局域网络内的aa:bb:cc:dd:ee:ff 主机开放其联机:
iptables -A INPUT -m mac --mac -source aa:bb:cc:dd:ee:ff -j ACCEPT
ps:通过ARP获取主机的mac地址,然后可以通过上述规则来将该主机DROP掉。无论其如何更改IP,除非他知道你是用网卡的mac来管理,否则无法透过修改IP而逃离到路由器外面。mac是不能跨路由。
3.4.5 ICMP封包规则的比对:针对是否响应ping来设计
很多ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的ICMP 封包都丢弃!
iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
--icmp-type :后面必须要接ICMP 的封包类型,也可以使用代号,例如8 代表echo request 的意思。
让0,3,4,11,12,14,16,18 的ICMP type 可以进入本机:
vim script_icmp:
#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done
sh script_icmp
这样能够开放部分的ICMP 封包格式进入本机进行网络检测的工作。如果主机作为区网的路由器,那么建议所有的ICMP封包都应该能通过。这是因为客户端检测网络时,常常会使用ping 来测试到路由器的线路是否畅通之故:-A INPUT -p icmp -j ACCEPT
——Rango Chen
转载于:https://blog.51cto.com/rangochen/1380555