一、前言

CentOS中防火墙程序主要是firewall和iptables,CentOS7中firewall服务已经默认安装好了,而iptables服务需要自己用yum install iptabes-services来安装。由于前期一直使用RedHat服务器,默认使用iptables,对iptables的使用上来说比较习惯。

二、iptables命令基本使用

2.1 基本语法

iptables(选项)(参数)

2.2 选项

常用命令列表

  • -A, --append

范例: iptables -A INPUT ...

说明: 新增规则(追加方式)到某个规则链(这里是INPUT规则链)中,该规则将会成为规则链中的最后一条规则。

  • -D, --delete

范例: iptables -D INPUT --dport 80 -j DROP / iptables -D INPUT 1

说明: 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

  • -R, --replace

范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP

说明: 取代现行规则,规则被取代后并不会改变顺序。(1是位置)

  • -I, --insert

范例: iptables -I INPUT 1 --dport 80 -j ACCEPT

说明: 插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。

  • -L, --list

范例: iptables -L INPUT

说明: 列出某规则链中的所有规则。

  • -F, --flush

范例: iptables -F INPUT

说明: 删除某规则链(这里是INPUT规则链)中的所有规则。

  • -Z, --zero

范例: iptables -Z INPUT

说明: 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

  • -N, --new-chain

范例: iptables -N allowed

说明: 定义新的规则链。

  • -X, --delete-chain

范例: iptables -X allowed

说明: 删除某个规则链。

  • -P, --policy

范例: iptables -P INPUT DROP

说明: 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。

  • -E, --rename-chain

范例: iptables -E allowed disallowed

说明: 修改某自订规则链的名称。

常用封包比对参数

  • -p, --protocol (指定协议)

范例: iptables -A INPUT -p tcp (指定协议) -p all 所有协议, -p !tcp 去除tcp外的所有协议。

说明: 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如: -p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如: -p all。

  • -s, --src, --source (指定源地址,指定源端口--sport)

范例: iptables -A INPUT -s 192.168.1.1

说明: 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,

范例: -s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,
-s ! 192.168.0.0/24。

  • -d, --dst, --destination (指定目的地址,指定目的端口--dport)

范例: iptables -A INPUT -d 192.168.1.1

说明: 用来比对封包的目的地 IP,设定方式同上。

  • -i, --in-interface (指定入口网卡) -i eth+ 所有网卡

范例: iptables -A INPUT -i eth0

说明: 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,

例如: -i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,

例如: -i ! eth0。

  • -o, --out-interface (指定出口网卡)

范例: iptables -A FORWARD -o eth0

说明: 用来比对封包要从哪片网卡送出,设定方式同上。

  • --sport, --source-port (源端口)

范例: iptables -A INPUT -p tcp --sport 22

说明: 用来比对封包的来源端口号,可以比对单一埠,或是一个范围,

例如: --sport 22:80,表示从 22 到 80 端口之间都算是符合件,

如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。

  • --dport, --destination-port (目的端口)

范例: iptables -A INPUT -p tcp --dport 22

说明: 用来比对封包的目的端口号,设定方式同上。

  • --tcp-flags (只过滤TCP中的一些包,比如SYN包,ACK包,FIN包,RST包等等)

例如: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

说明: 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,
第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、

FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和

NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对。

  • -syn

例如: iptables -p tcp --syn

说明: 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,

FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。

  • -m multiport --source-port

例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110

说明: 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 !

运算子进行反向比对。

  • -m multiport --destination-port

例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110

说明: 用来比对不连续的多个目的地埠号,设定方式同上。

  • -m multiport --port

例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110

说明: 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。

注意:在本范例中,如果来源端口号为 80目的地埠号为 110,这种封包并不算符合条件。

  • --icmp-type

例如: iptables -A INPUT -p icmp --icmp-type 8

说明: 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。

请打 iptables -p icmp --help 来查看有哪些代码可用。

  • -m limit --limit

例如: iptables -A INPUT -m limit --limit 3/hour

说明: 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是

否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,

默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的

比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水

攻击法,导致服务被阻断。

  • --limit-burst

范例 iptables -A INPUT -m limit --limit-burst 5

说明: 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超

过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。

  • -m mac --mac-source

范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

说明: 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。

  • --mark

范例 iptables -t mangle -A INPUT -m mark --mark 1

说明: 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。

  • -m owner --uid-owner

范例 iptables -A OUTPUT -m owner --uid-owner 500

说明: 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用

root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出

来自其它主机的封包。

  • -m owner --gid-owner

范例 iptables -A OUTPUT -m owner --gid-owner 0

说明: 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

  • -m owner --pid-owner

范例 iptables -A OUTPUT -m owner --pid-owner 78

说明: 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。

  • -m owner --sid-owner

范例 iptables -A OUTPUT -m owner --sid-owner 100

说明: 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时

机同上。

  • -m state --state

范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED

说明: 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。

ESTABLISHED 表示该封包属于某个已经建立的联机。

NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。

RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如: FTP-DATA 联机必定是源自某个 FTP 联机。

常用的处理动作

-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:

  • ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。

  • REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

例如: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

  • DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

  • REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。

这个功能可以用来实作通透式porxy 或用来保护 web 服务器。

例如: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

  • MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。

例如: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

  • LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。

例如: iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

  • SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。

例如: iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

  • DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。

例如: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

  • MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

  • QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,

例如: 计算联机费......等。

  • RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。

  • MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。

例如: iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

2.3 iptables命令选项输入顺序

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

  1. 表名包括:
  • raw:高级功能,如:网址过滤。
  • mangle:数据包修改(QOS),用于实现服务质量。
  • net:地址转换,用于网关路由器。
  • filter:包过滤,用于防火墙规则。
  1. 规则链名包括:
  • INPUT链:处理输入数据包。
  • OUTPUT链:处理输出数据包。
  • PORWARD链:处理转发数据包。
  • PREROUTING链:用于目标地址转换(DNAT)。
  • POSTOUTING链:用于源地址转换(SNAT)。
  1. 动作包括:
  • ACCEPT:接收数据包。
  • DROP:丢弃数据包。
  • REDIRECT:重定向、映射、透明代理。
  • SNAT:源地址转换。
  • DNAT:目标地址转换。
  • MASQUERADE:IP伪装(NAT),用于ADSL。
  • log:日志记录。

三、CentOS6下iptables默认规则讲解

在安装好的iptables后,/etc/sysconfig/iptables会有以下几条规则

1
2
3
4
5
6
7
8
9
10
11
12
13
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
  1. :INPUT ACCEPT [0:0]

该规则表示INPUT表默认策略是ACCEPT

  1. :FORWARD ACCEPT [0:0]

该规则表示FORWARD表默认策略是ACCEPT

  1. :OUTPUT ACCEPT [0:0]

该规则表示OUTPUT表默认策略是ACCEPT

  1. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

意思是允许进入的数据包只能是刚刚我发出去的数据包的回应,ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关.

  1. -A INPUT -p icmp -j ACCEPT

icmp协议是被允许的,就是外部可以ping服务器

  1. -A INPUT -i lo -j ACCEPT

-i 参数是指定接口,这里的接口是lo ,lo就是Loopback(本地环回接口),意思就允许本地环回接口在INPUT表的所有数据通信。

  1. -A INPUT -j REJECT --reject-with icmp-host-prohibited

在INPUT表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机

  1. -A FORWARD -j REJECT --reject-with icmp-host-prohibited

在FORWARD表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机

在INPUT表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机

四、iptables常用命令

4.1 服务命令

保存iptables规则

service iptables save

关闭iptables服务

service iptables stop

开启iptables服务

service iptables start

重启iptables服务

service iptables restart

4.2 操作命令

查看iptables规则

iptables -nL

查看iptables规则(带序号)

iptables -nL --line-number

通过序号删除链中的规则

iptables -t filter -D INPUT 1

清空所有iptables规则

iptables -F

接收目标端口为22的数据包

iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

拒绝所有其他数据包

iptables -A INPUT -j DROP

允许本地回环地址可以正常使用

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

配置允许ssh端口连接

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

配置白名单

iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口

将3306端口封掉

iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP

禁止10.0.0.0网段连入

iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP

禁ping --icmp-type 8代表ping

iptables -I INPUT -p icmp --icmp-type 8 -j DROP
iptables -I INPUT -p icmp --icmp-type 8 -s 10.0.0.0/24 -j ACCEPT

开启信任的IP网段(多网卡)

iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT

将 80 端口的封包转递到 8080端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

禁止某个IP访问

iptables -I INPUT -p tcp -s 192.168.1.253 -i ens33 -j DROP

禁止初跳板机以外的IP访问

iptables -I INPUT -p tcp ! -s 192.168.1.1 -j DROP

匹配端口范围

iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT
允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
允许FTP服务的20端口
iptables -A INPUT -j reject
禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT
禁止其他未允许的规则访问

端口转发

本机的 2222 端口映射到内网 虚拟机的22 端口

iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22

将10.0.1.62的访问请求转发到172.16.1.7

iptables -t nat -A PREROUTING -d 10.0.1.62 -j DNAT --to-destination 172.16.1.7

字符串匹配

iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset

过滤所有TCP连接中的字符串test,一旦出现它我们就终止这个连接

阻止Windows蠕虫

iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"

防止SYN洪水

iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT