一、前言
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 动作
- 表名包括:
- raw:高级功能,如:网址过滤。
- mangle:数据包修改(QOS),用于实现服务质量。
- net:地址转换,用于网关路由器。
- filter:包过滤,用于防火墙规则。
- 规则链名包括:
- INPUT链:处理输入数据包。
- OUTPUT链:处理输出数据包。
- PORWARD链:处理转发数据包。
- PREROUTING链:用于目标地址转换(DNAT)。
- POSTOUTING链:用于源地址转换(SNAT)。
- 动作包括:
- ACCEPT:接收数据包。
- DROP:丢弃数据包。
- REDIRECT:重定向、映射、透明代理。
- SNAT:源地址转换。
- DNAT:目标地址转换。
- MASQUERADE:IP伪装(NAT),用于ADSL。
- log:日志记录。
三、CentOS6下iptables默认规则讲解
在安装好的iptables后,/etc/sysconfig/iptables会有以下几条规则
1 | # sample configuration for iptables service |
- :INPUT ACCEPT [0:0]
该规则表示INPUT表默认策略是ACCEPT
- :FORWARD ACCEPT [0:0]
该规则表示FORWARD表默认策略是ACCEPT
- :OUTPUT ACCEPT [0:0]
该规则表示OUTPUT表默认策略是ACCEPT
- -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
意思是允许进入的数据包只能是刚刚我发出去的数据包的回应,ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关.
- -A INPUT -p icmp -j ACCEPT
icmp协议是被允许的,就是外部可以ping服务器
- -A INPUT -i lo -j ACCEPT
-i 参数是指定接口,这里的接口是lo ,lo就是Loopback(本地环回接口),意思就允许本地环回接口在INPUT表的所有数据通信。
- -A INPUT -j REJECT --reject-with icmp-host-prohibited
在INPUT表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机
- -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