规则的查看与清除
如果你在安装的时候没有选择开启防火墙,那么iptables在一开始的时候应该是没有规则的,不过,如果开启了防火墙,防火墙软件会有一套默认的规则。
shell# iptables [-t tables] [-L] [-nv]
选项与参数:
-t 后面接table,例如 nat 或 filter,如果省略此项目,则使用预设的 filter
-L 列出目前的 table 的规则
-n 不进行 IP 与 Hostname 的反查,显示信息的速度会快很多
-v 列出更多的咨询,包括通过该规则的封包总位元数、相关的网络界面等
列出的信息中关键字如下解释
- target
代表执行的动作,ACCEPT是放行,而 REJECT 则是拒绝,此外,还有 DROP(丢弃)。 - prot
代表使用的封包协议,主要有 tcp、udp 及 icmp 三种封包格式 - source
代表此规则是针对哪个【来源IP】 进行限制 - destination
代表此规则对哪个【目标IP】进行限制 - opt
额外的选项说明
在输出结果中,命令行中没有添加 -t 的选项,就是默认的 filter 这个表格中的INPUT,OUTPUT,FORWARD 三条链的规则。如果只针对单条链来说,INPUT 和 FORWARD 算是比较重要的管制防火链,所以你可以发现最后一天规则是 REJECT(拒绝)。虽然 INPUT 与FORWARD 的政策是放行(ACCEPT),不过最后一条规则需要将所有的封包都拒绝!
iptables-save
iptabls-save 可以列出完整的防火墙规则,不过不能格式化输出
shell# iptables-save [-t table]
选项与参数
-t 可以仅输出某个表,例如 nat 或 filter 等
实例:
[root@bogon ~]# iptables-save -t filter
# Generated by iptables-save v1.4.21 on Fri Mar 3 21:28:06 2017
*filter <==== 星号开头指的是表格
:INPUT ACCEPT [0:0] <==== 冒号开头指的是链
:FORWARD ACCEPT [0:0] <==== 三条链的策略都是 ACCEPT
:OUTPUT ACCEPT [228:39884]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT <==== 针对 INPUT 的规则
-A INPUT -i lo -j ACCEPT <==== 针对本机回环网卡开放
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
-A INPUT -j INPUT_ZONES
-A INPUT -p icmp -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
... 省略 ...
COMMIT
# Completed on Fri Mar 3 21:28:06 2017
清除规则
shell# iptables [-t tables] [-FXZ]
选项与参数
-F 清除所有的已经定义的规则
-X 删除掉所有自定义的 chain(或者说 tables)
-Z 将所有的 chain 的计数与流量都归零
这三条规则会将本机防火墙的所有规则都清除,但却不会改变政策(policy),所以如果你不是在本机下执行清除指令时,很可能你会被自己挡在外面。
定义预设政策(policy)
清除规则后,接下来警示要设定规则的策略。当你的封包不再你设定的规则内,封包是否通过,需要根据policy设定的策略。
shell# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项与参数
-P 定义策略(Policy)
ACCEPT 该封包可接受
DROP 该封包直接丢弃,不会告诉 client 端为何被丢弃
范例:
shell# iptables -P INPUT DROP
shell# iptables -P OUTPUT ACCEPT
shell# iptables -P FORWARD ACCEPT
shell# ipatbels-save
* filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Fri Mar 3 21:28:06 2017
如果要修改其他三条链,方法是一样的iptabels -t nat -P PREROUTING ACCEPT
封包的基础对比:IP,网络和网卡设置
shell# iptables [-AI chain] [-io interface] [-p Protocol] [-s Source IP/Network Segment] [-d Target IP/Network Segment] -j [ACCEPT|DROP|REJECT|LOG]
选项与参数
-AI chain 针对某条链进行规则的插入或累加
-A 新增加一条规则,该规则增加在原本规则的最后面。
-I 插入一条规则。如果没有指定此规则的顺序,预设是插入变成第一条规则。
chain 有 INPUT,OUTPUT,FORWARD 等,此链又与 -io 参数有关。
-io interface 设定封包进出的网卡的规则
-i 封包所进入的那个网卡,例如 eth0、lo 等网卡。需要与 INPUT 链配合。
-o 封包所出去的那个网卡,需要与 OUTPUT 链配合
-p Protocol 设定这条规则用于那种封包协议
主要的封包协议有 tcp udp icmp 和 all
-s Source IP/Network Segment 设定这个封包的来源的规则,可指定单一的IP或网段,例如
IP 192.168.1.1
Network Segment 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 Source IP/Network Segment 与 -s 同理,只是指的是目标的IP或网段
-j 后面接动作,主要的动作有接收(ACCEPT)、丢弃(DROP)、拒绝(REJECT)和记录(LOG)
TCP,UDP 的规则对比,针对端口的设定
shell# iptables [-AI chain] [-io interface] [-p tcp,udp] [-s Sourec IP/Network Segment] [--sport Port Range] [-d Target IP/Network Segment] [--dport Port Range] -j [ACCEPT|REJECT|DROP]
选项与参数
--sport Port Range 限制来源的端口范围,端口号可以是连续的,例如 1024:65535
--dport Port Range 限制目标的端口范围
需要特别注意的是,因为仅有 tcp 和 udp 封包具有端口,因此你想要使用 --dport
,--sport
时,需要加上 -p tcp
或 -p udp
的参数才会成功
iptables 外挂模组:mac 与 state
在 kernel 以前使用 ipchains 管理防火墙时,ipchains 没有封包状态模组,因此我们必须要针对封包的进出方向进行管控。
iptables 已经免除了这个困扰,它可以通过一个状态模组来分析【这个想要进入的封包是不是我刚才发出去的回应?】如果是刚刚发出去的封包的回应,那么就可以予以放行
shell# iptables -A INPUT [-m state] [--state States] -j [RELATED|ESTABLISHED|DROP]
选项与参数
-m 一些 iptables 的外挂模组,主要常见的有:
state 状态模组
mac 网卡硬件地址(hardware address)
--state 一些封包的状态,主要有
INVALID 无效的封包,例如资料破损的封包状态
ESTABLISHED 已经连线成功的连线状态
NEW 想要新建立连线的封包状态
RELATED 这个常用!表示这个封包是与我们主机发送出去的封包有关
实例:
shell# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
shell# iptabels -A INPUT -m state --state INVALID -j DROP
针对网卡来进行放行与防御
shell# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
选项与参数
--mac-source 就是来源主机的MAC地址
ICMP 封包规则的对比:针对是否回应 ping 来设计
shell# iptables -A INPUT [-p icmp] [--icmp-type Type] -j ACCEPT
选项与类型
--icmp-type 后面必须接 ICMP 的封包类型,也可以使用代号,例如 8 代表 echo request 的意思。
实例:让 0,3,4,11,12,13,14,16,18 的ICMP type 可以进入本机:
#!/bin/bash
icmp_type="0 3 4 11 12 13 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done
最简单的用户防火墙设计与防火墙规则存储
- 规则清零:清除所有已经存在的规则(iptabels -F...);
- 预设政策:除了INPUT这个链设为DROP,其他预设为ACCEPT;
- 信任本机,由于lo对于本机来说是相当重要的,因此lo必须设为信任设备;
- 回应封包,让本机主动向外要求回应的封包可以进入本机(ESTABLISHED、RELATED);
- 信任用户:这是非必要的,如果你想要让区域的来源可用你的主机资源
- RHEL6/CentOS6 脚本
#!/usr/bin/env bash
set -x
# 检查 iptables 服务是否开启
check_start=$(/etc/init.d/iptables status | grep -c filter)
if [ $check_start -lt 1 ]; then
/etc/init.d/iptables start
fi
# 设置 iptables 开机自启动
check_enable=$(chkconfig --list iptables | grep -c "3:on")
if [ $check_enable -lt 1 ]; then
chkconfig --level 35 iptables on
fi
# 1. 清除规则
iptables -F
iptables -X
iptables -Z
# 2. 设定默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# 3~5. 制定规则
iptables -A INPUT -i io -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
# 6. 写入防火墙规则设定文件
/etc/init.d/iptables save
- RHEL7/CentOS7 脚本
#!/usr/bin/env bash
set -x
# 检查 iptables-services 软件包是否安装
if [ ! -f /usr/libexec/iptables/iptables.init ]; then
yum -y install iptables iptables-services
fi
# 检查 firewalld 服务是否启动
check_firewalld_start=$(systemctl is-active firewalld)
if [ $check_firewalld_start != active ]; then
systemctl start firewalld
fi
# 检查 firewalld 服务是否开机自动启
check_firewalld_enable=$(systemctl is-enabled firewalld)
if [ check_firewalld_enable != "enabled" ]; then
systemctl enable firewalld
fi
# 检查 iptables 服务是否开机自动启
check_iptables_enable=$(systemctl is-enabled iptables)
if [ check_iptables_enable != "enabled" ]; then
systemctl enable iptables
fi
# 1. 清除规则
iptables -F
iptables -X
iptables -Z
# 2. 设定默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# 3~5. 制定规则
iptables -A INPUT -i io -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
# 6. 防火墙开机自启动并写入防火墙规则设定文件
/usr/libexec/iptables/iptables.init save
防火墙是一个服务,可以通过checonfig --list iptables
查看是否开机自启动。因此,当前设定的防火墙规则想要在下次开机后还生效,那就需要使用/etc/init.d/iptables save
将当前配置防火墙配置保存到/etc/sysconfig/iptables
配置文件中。