概念
5个链
数据包会依次经过不同的链。
我们可以创建“自定义链”,作为默认链的target使用。
4个表
相似的规则放在一个表中,一个表只能适用于某些链上。
iptables为我们提供了如下”表”:
(1)filter表:过滤数据包。
(2)nat表:网络地址转换。
(3)mangle表:拆解报文,做出修改,并重新封装。
(4)raw表:关闭nat表上启用的连接追踪机制。
表的优先顺序:
raw -> mangle -> nat -> filter
表适用的链:
数据经过防火墙的流程
规则
查询规则
# -t 指定表名,查看filter中所有链
iptables -t filter -L
# 默认为filter表
iptables -L
# 只查看INPUT链
iptables -L INPUT
# 查看更详细的信息
iptables -vL
# 不对IP地址进行名称反解,直接显示IP地址
iptables -nL
# 显示编号
iptables --line-numbers -L
增加规则
iptables命令格式:
iptables [-t 表] -命令 匹配 动作
(1)-t 表
raw, mangle, nat, filter
(2)命令
-P --policy 链 target 定义默认策略
-L --list [链] 查看规则列表
-A --append 链 追加1条规则
-I --insert 链 [num] 插入1条规则(默认第一条)
-D --delete 链 num 删除1条规则(1表示第一条)
-D --delete 链 删除1条规则(根据匹配删)
-R --replace 链 num 替换规则
-F --flush [链] 删除链中或所有链中的规则
-Z --zero [链 [num]] 将表中数据包计数器和流量计数器归零
-X --delete-chain 链 删除自定义链
-N --new 链 创建自定义链
-E --rename-chain 旧链 新链 修改链名
(3)匹配,见后面
(4)动作,见后面
修改规则
例子:
iptables -t filter -R INPUT 1 -s 192.168.1.146 -j REJECT
-s选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)。
既然使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了。
保存规则
使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则又消失了。那么如何保存新建立的规则呢?
方法1:
使用service iptables save
将当前内存中的规则保存到/etc/sysconfig/iptables
文件中。
方法2:
修改/etc/sysconfig/iptables-config
将里面的IPTABLES_SAVE_ON_STOP="no"
, 这一句的"no"改为"yes"这样每次服务在停止之前会自动将现有的规则保存在/etc/sysconfig/iptables
这个文件中去。
导出/导入规则
iptables-save >/dd/iptables.bak
iptables-restore </dd/iptables.bak
自定义链
创建自定义链:
iptables -t filter -N IN_WEB
在自定义链上创建规则:
iptables -t filter -I IN_WEB -s 192.168.1.139 -j REJECT
引用自定义链(作为其他规则的动作):
iptables -t filter -I input -p tcp --dport 80 -j IN_WEB
删除自定义链:
iptables -t nat -X IN_WEB
规则-匹配
基础匹配
-i --in-interface 网络接口 指定数据包从哪个网络接口进入
-o --out-interface 网络接口 指定数据包从哪个网络接口输出
-p --proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 源地址/子网(多个ip用逗号分隔)
-d --destination 目的地址/子网(多个ip用逗号分隔)
--sport 源端口号
--dport 目的端口号
-m --match 匹配的模块 指定数据包规则所使用的过滤模块
! -i 取反
匹配端口范围
--dport 22:25
--dport :22
--dport 80:
匹配多个离散端口
-m multiport --dports 22,36,80:88
iprange模块
-m iprange --src-range 10.0.0.1-10.0.0.99
string模块
-m string --algo bm --string "OOXX"
time模块
# 根据时间匹配报文
-m time --timestart 09:00:00 --timestop 18:00:00
-m time --datestart 2017-12-24 --datestop 2017-12-27
-m time --weekdays 6,7
-m time --monthdays 22,23
connlimit模块
# 单IP的并发链接数最大为2
-m connlimit --connlimit-above 2
# 24位掩码的网段中,所有IP共享最大链接数为2
-m connlimit --connlimit-above 2 --connlimit-mask 24
limit模块
# 限制报文到达速率(每6秒放行一个ping包)
iptables -F
# 第6秒的包,放行
iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
# 前5秒的包,拒绝
iptables -t filter -A INPUT -p icmp -j REJECT
# 理解:每6秒产生一个令牌,最多能同时存在5个令牌,放行一个包需消耗一个令牌。所以前5个ping包会放行。
icmp模块
# 禁止所有ping包
iptables -t filter -I INPUT -p icmp -j REJECT
# 禁止type为8,code为0的ping包进入(即外面不能ping本机)
iptables -t filter -I INPUT -p icmp --icmp-type 8/0 -j REJECT
# 因为type为8的类型下只有一个code为0的类型,所以我们可以省略对应的code
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
# 还能用icmp报文的描述名称去匹配对应类型的报文
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
# 禁止本机发送ping应答包
iptables -t filter -I INPUT -p icmp --icmp-type 0/0 -j REJECT
参数 --tcp-flags
范例:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明:比对 TCP 封包的状态标志号,参数分为两个部分,第一个部分列举出想比对的标志号,第二部分则列举前述标志号中哪些有被设,未被列举的标志号必须是空的。TCP 状态标志号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。
参数 -m mark --mark
范例:iptables -t mangle -A INPUT -m mark --mark 1
说明:比对是否被打上某个标签
参数 -m state --state
范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
说明:用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该数据包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该数据包属于某个已经建立的联机。
NEW 表示该数据包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该数据包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
规则-动作
ACCEPT
允许通过
DROP
直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT
拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with icmp-port-unreachable
REJECT动作的常用选项为–reject-with
使用–reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。
可用值如下
icmp-net-unreachable icmp-host-unreachable icmp-port-unreachable
icmp-proto-unreachable icmp-net-prohibited icmp-host-pro-hibited icmp-admin-prohibited
当不设置任何值时,默认值为icmp-port-unreachable。
SNAT
改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围。
虽然,我们只写了 SNAT,但回程的 DNAT 其实是自动帮我们做了。
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
使用NAT功能,需要开启linux的核心转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
MASQUERADE
是SNAT的一种特殊形式,这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
DNAT
目标地址转换。
当我们做 SNAT 时, 回程的DNAT会自动帮我们处理,但做 DNAT 时,回程的 SNAT 可能需要我们自己处理。
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
REDIRECT
在本机做端口映射。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8081
LOG
在/var/log/messages文件中记录日志信息(详细位置请查阅 /etc/syslog.conf 配置文件),然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
修改/etc/rsyslog.conf:
kern.warning /var/log/iptables.log
重启rsyslog服务:service rsyslog restart
–log-prefix选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。
–log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning(默认),notice,info,debug。
MIRROR
镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
QUEUE
中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用…等。
RETURN
结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
MARK
将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22