防火墙 iptables

目录

规则的观察与清除

观察规则

清除规则

定义规则 (policy)

封包的基础比对:IP, 网域及接口装置

TCP, UDP 的规则比对:针对埠口设定

iptables 外挂模块:mac 与 state

ICMP 封包规则的比对:针对是否响应 ping 来设计


# iptables [-t tables] [-L] [-nv]
选项 参数
-t 后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L 列出目前的 table 的规则
-n 不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
-v 列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

规则的观察与清除

观察规则

# 范例一:列出 filter table 三条链的规则
[root@www ~]# iptables -L -n
 Chain INPUT (policy ACCEPT) # 针对 INPUT 链,且预设政策为可接受
 target prot opt source destination # 说明栏
 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED # 第 1 条规则
 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 # 第 2 条规则
 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0  # 第 3 条规则
 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 # 以下类推
 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
 
 Chain FORWARD (policy ACCEPT) # 针对 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 三条链的规则
 [root@www ~]# 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 destination

每一个 Chain 就是每个链,Chain 那一行里面括号的 policy 就是预设的政策。

  • target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外, 尚有 DROP (丢弃) 的项目

  • prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式

  • opt:额外的选项说明

  • source:代表此规则是针对哪个『来源 IP』进行限制

  • destination:代表此规则是针对哪个『目标 IP』进行限制

管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少 使用) 。每个表格与其中链的用途分别是这样的:

  1. filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table

    • INPUT:主要与想要进入我们 Linux 本机的封包有关;

    • OUTPUT:主要与我们 Linux 本机所要送出的封包有关;

    • FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与下列 nat table 相关性较高。

  2. nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关

    • PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)

    • POSTROUTING:在进行路由判断之后所要进行的规则 (SNAT/MASQUERADE)

    • OUTPUT:与发送出去的封包有关

  3. mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅 有PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环 境当中,较少使用 mangle 这个表格。

范例一中因为没有加上 -t 的选项,所以默认就是 filter 这个 表格内的 INPUT, OUTPUT, FORWARD 三条链的规则。若针对单机来说,INPUT 与 FORWARD 算是比较重要的管制防火墙链, 所以你可以发现最后一条规则的政策是 REJECT (拒绝) !虽然 INPUT 与 FORWARD 的政策是放行 (ACCEPT), 不过在最后一 条规则就已经将全部的封包都拒绝了!

将 INPUT 的 5 条规则依据输出结果来说明一下,结果会变成:

  1. 只要是封包状态为 RELATED,ESTABLISHED 就予以接受

  2. 只要封包协议是 icmp 类型的,就予以放行

  3. 无论任何来源 (0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式 (prot 为 all),通通都接受

  4. 只要是传给 port 22 的主动式联机 tcp 封包就接受

  5. 全部的封包信息通通拒绝

注意第 3 条规则,怎么会所有的封包信息都予以接受?如果都接受 的话,那么后续的规则根本就不会有用了! 其实那条规则是仅针对每部主机都有的内 部循环测试网络 (lo) 接口!如果没有列出接口,那么我们就很容易搞错;使用 iptables-save 会列出完整的防火墙规则,只是并没有规格化输出而已。

[root@www ~]# iptables-save [-t table]
 选项与参数:
 -t :可以仅针对某些表格来输出,例如仅针对 nat 或 filter 等等
 
 [root@www ~]# iptables-save
 # Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011
 *filter    # 星号开头的指的是表格,这里为 filter
 :INPUT ACCEPT [0:0]    # 冒号开头的指的是链,三条内建的链
 :FORWARD ACCEPT [0:0]  # 三条内建链的政策都是 ACCEPT 啰!
 :OUTPUT ACCEPT [680:100461]
 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 针对INPUT的规则
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT #这条很重要!针对本机内部接口(lo)开放!
 -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited # 针对FORWARD 的规则
 COMMIT
 # Completed on Fri Jul 22 15:51:52 2011
 
 # 由上面的输出来看,内容含有 lo 的那条规则当中,『 -i lo 』指的就是由 lo 适配卡进来的封包

清除规则

一般来说,在重新定义防火墙的时候,都会先将规则给他清除掉。

[root@www ~]# iptables [-t tables] [-FXZ]
# 选项与参数:
# -F :清除所有的已订定的规则;
# -X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )啰;
# -Z :将所有的 chain 的计数与流量统计都归零
 
 # 范例:清除本机防火墙 (filter) 的所有规则
 [root@www ~]# iptables -F
 [root@www ~]# iptables -X
 [root@www ~]# iptables -Z

定义规则 (policy)

封包的基础比对:IP, 网域及接口装置

# iptables [-AI 链名] [-io 网络接口] [-p 协议] \ > [-s 来源 IP/网域] [-d 目标 IP/网域] -j [ACCEPT|DROP|REJECT|LOG]

选项与参数:

  • -AI 链名:针对某的链进行规则的 "插入" 或 "累加"

    • -A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经 有四条规则,使用 -A 就可以加上第五条规则

    • -I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一 条规则;例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条 变成 2~5 号

    • 链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。

  • -io 网络接口:设定封包进出的接口规范

    • -io 网络接口:设定封包进出的接口规范

    • -o :封包所传出的那个网络接口,需与 OUTPUT 链配合

  • -p 协定:设定此规则适用于哪种封包格式;主要的封包格式有: tcp, udp, icmp 及 all

  • -s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括 网域,例如:

    IP :192.168.0.100

    网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。

    若规范为『不许』时,则加上 ! 即可,例如:-s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源;

  • -d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域

  • -j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT) 及记录(LOG)

# 范例:设定 lo 成为受信任的装置,亦即进出 lo 的封包都予以接受 
[root@www ~]# iptables -A INPUT -i lo -j ACCEPT

仔细看上面并没有列出 -s, -d 等等的规则,这表示:不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!这个观念挺重要的,就是『没有指定的项目,则表示该项目完全接受』的意思! 例如这个案例当中,关于 -s, -d...等等的参数没有规定时,就代表不论什么值都会被接受。

这就是所谓的信任装置!假如你的主机有两张以太网络卡,其中一张是对内部的网域,假设该网卡的代号为 eth1 ,如果内部网域是可信任的,那么该网卡的进出封包就通通会被接受,那你就能够用:『iptables -A INPUT -i eth1 -j ACCEPT』 来将该装置设定为信任装置。不过,下达这个指令前要特别注意,因为这样等于该网卡没有任何防备了!

#范例:只要是来自内网的 (192.168.100.0/24) 的封包通通接受
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
# 由于是内网就接受,因此也可以称之为『信任网域』啰。
 
# 范例:只要是来自 192.168.100.10 就接受,但 192.168.100.230 这个恶意来源就丢弃
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
# 针对单一 IP 来源,可视为信任主机或者是不信任的恶意来源!
 
[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 16:00:43 2011
 *filter
 :INPUT DROP [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [17:1724]
 -A INPUT -i lo -j ACCEPT
 -A INPUT -s 192.168.100.0/24 -i eth1 -j ACCEPT
 -A INPUT -s 192.168.100.10/32 -i eth1 -j ACCEPT
 -A INPUT -s 192.168.100.230/32 -i eth1 -j DROP
 COMMIT
 # Completed on Fri Jul 22 16:00:43 2011

记录某个规则的纪录

[root@www ~]# iptables -A INPUT -s 192.168.2.200 -j LOG
[root@www ~]# iptables -L -n
target prot opt source destination
LOG all -- 192.168.2.200 0.0.0.0/0 LOG flags 0 level 4

看到输出结果的最左边,会出现的是 LOG !只要有封包来自 192.168.2.200 这个 IP 时, 那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log/messages 这个档案当中。然后该封包会继续进行后续的规则比对。所以说, LOG 这个动作仅在进行记录而已,并不会影响到这个封包的其他规则比对的。

TCP, UDP 的规则比对:针对埠口设定

在谈到 TCP 与 UDP 时,比较特殊的就是那个埠口 (port),在 TCP 方面则另外有所谓的联机封包状态, 包括最常见的 SYN 主动联机的封包格式。那么如何针对这两种封包格式进行防火墙规则的设定呢?可以这样看:

[root@www ~]# iptables [-AI 链] [-io 网络接口] [-p tcp,udp] \
 > [-s 来源 IP/网域] [--sport 埠口范围] \
 > [-d 目标 IP/网域] [--dport 埠口范围] -j [ACCEPT|DROP|REJECT]
选项与参数:
 --sport 埠口范围:限制来源的端口口号码,端口口号码可以是连续的,例如 1024:65535
 --dport 埠口范围:限制目标的端口口号码。

事实上就是多了那个 --sport 及 --dport ,重点在那个 port 上面! 不过要特别注意,因为仅有 tcp 与 udp 封包具有埠口,因此你想要使用 --dport, --sport 时,得要加上 -p tcp 或 -p udp 的参数才会成功。

你可以利用 UDP 与 TCP 协议所拥有的端口口号码来进行某些服务的开放或关闭。

# 范例:想要联机进入本机 port 21 的封包都抵挡掉:
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
 
# 范例:想连到主机的(upd port 137,138 tcp port 139,445) 就放行
[root@www ~]# iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT

例如:只要来自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要联机到本机的 ssh port 就予以抵挡,可以这样做:

[root@www ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 \
 > --sport 1024:65534 --dport ssh -j DROP

如果忘记加上 -p tcp 就使用了 --dport 时,会发生啥问题呢?

[root@www ~]# iptables -A INPUT -i eth0 --dport 21 -j DROP
 iptables v1.4.7: unknown option `--dport'
 Try `iptables -h' or 'iptables --help' for more information.
# 怎么『 --dport 』会是未知的参数 (arg) 呢?这是因为你没有加上 -p tcp 或 -p udp 的缘故!

除了埠口之外,在 TCP 还有特殊的旗标啊!最常见的就是那个主动联机的 SYN 旗 标了。 我们在 iptables 里面还支持『 --syn 』的处理方式:

# 范例:将来自任何地方来源 port 1:1023 的主动联机到本机端的 1:1023 联机丢弃
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 \
 > --dport 1:1023 --syn -j DRO

一般来说,client 端启用的 port 都是大于 1024 以上的埠口,而 server 端则是启用小于 1023 以下的埠口在监听的。所以我们可以让来自远程的小于 1023 以下的端口口数据的主动联机都给他丢弃! 但不适用在 FTP 的主动联机中!

iptables 外挂模块:mac 与 state

iptables可以透过一个状态模块来分析 『这个想要进入的封包是否为刚刚我发出去的响应?』 如果是刚刚我发出去的响应,那么就可以予以接受放行!这样就不用管远程主机是否联机进来的问题了!

[root@www ~]# iptables -A INPUT [-m state] [--state 状态]
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
    state :状态模块
    mac :网络卡硬件地址 (hardware address)
--state :一些封包的状态,主要有:
    INVALID :无效的封包,例如数据破损的封包状态
    ESTABLISHED:已经联机成功的联机状态;
    NEW :想要新建立联机的封包状态;
    RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
    
# 范例:只要已建立或相关封包就予以通过,只要是不合法封包就丢弃
[root@www ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP
# 这样 iptables 就会主动分析出该封包是否为响应状态,若是的话,就直接予以接受。这样一来你就不需要针对响应的封包来撰写个别的防火墙规则了!

针对网卡来进行放行与防御:

# 范例:针对局域网络内的 aa:bb:cc:dd:ee:ff 主机开放其联机
[root@www ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
选项与参数:
--mac-source :就是来源主机的 MAC 

如果区网当中有某些网络高手,老是可以透过修改 IP 去尝试透过路由器往外跑, 那该怎么办? 难道将整个区网拒绝?并不需要的,可以透过之前谈到的 ARP 相关概念,去捉到那部主机的 MAC ,然后透过上头的这个机制, 将该主机整个 DROP 掉即可。不管他改了什么 IP ,除非他知道你是用网卡的 MAC 来管理,否则他就是出不去!

其实 MAC 也是可以伪装的,可以透过某些软件来修改网卡的 MAC。 不过,这里我们是假设 MAC 是无法修改的情况来说明的。 此外, MAC 是不能跨路由的,因此上述的案例中才特别说明是在区网内, 而不是指 Internet 外部的来源唷!

ICMP 封包规则的比对:针对是否响应 ping 来设计

ICMP 的类型相当的多,而且很多 ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的 ICMP 封包都丢弃!如果不是做为路由器的主机时,通常我们会把 ICMP type 8 (echo request) 拿掉而已, 让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了。ICMP 封包格式的处理是这样的:

[root@www ~]# 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 可以进入本机:
[root@www ~]# vi somefile
#!/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
[root@www ~]# sh somefile

这样就能够开放部分的 ICMP 封包格式进入本机进行网络检测的工作了!不过,如果你的主机是作为区网的路由器,那么建议 icmp 封包还是要通通放行才好!这是因为客户端检测网络时,常常会使用 ping 来测试到路由器的线路是否畅通之故! 所以不要将路由器的 icmp 关掉,会有状况的!

参考:鸟哥 -《网络服务器架设篇 第三版》

你可能感兴趣的:(linux,网络,tcp/ip,服务器,运维)