iptables

iptables

参考地址:http://www.zsythink.net

[TOC]

centos7的防火墙改为iptables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
firewall-cmd --state
running

# 更改firewall 为 iptables

systemctl stop firewalld #停止firewall防火墙
systemctl disable firewalld #禁止firewall开机启动
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.


# 安装iptables防火墙

yum install -y iptables iptables-services

systemctl start iptables # 启动iptables
systemctl status iptables # 查看状态
service iptables status # 同上,查看状态
iptables -L 查看配置

systemctl enable iptables #设置开机启动

基础知识

iptables四种表

  • filter表:负责过滤功能,内核模块为:iptables_filter
  • nat表: net address translation ,网络地址转换,内核模块为:iptable_nat
  • mangle表:拆解报文,做出修改,并重新封装功能,iptalbe_mangle
  • raw表:只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了. RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度

处理动作

  • ACCEPT 允许数据包通过
  • DROP 直接丢弃数据包,不给任务回应信息
  • REJECT 拒绝数据通过,必要时会给数据端一个回应消息
  • SNAT 源地址转换,解决内网用户同一公网地址上网问题
  • MASQUERADE 是SNAT的一种形式,适用于动态的,临时会变的ip上
  • DNAT 目标地址转换
  • REDIRECT 在本机做端口映射
  • LOG 在/var/log/message文件中记录日志信息

基本命令

查看规则

1
2
3
4
5
6
7
8
9
10
iptables -t raw -L
# -t 是指哪个表,如果省略,则表示是列出filter表 即iptables -L 等价于 iptables -t filter -L

iptables --line -nvxL INPUT

# --line 显示行号
# -n 表示不对名称进行反解,直接显示ip
# policy ACCEPT policy表示默认策略,通过这个,可以设定黑名单,
# -x 显示精确的计数器,比如接收多少数据包,总大小是多少
# -v 表示显示更多详细信息

增加规则

1
2
3
4
5
6
7

iptables -I INPUT -s 10.0.1.251 -j DROP

# -t filter 省略,默认操作的是filter 表
# -I insert 不加序号的情况下,则会在第一个位置插入规则,如果加序号,例 -I INPUT 2
# -s 源地址
# -j 前面的匹配条件满足,则执行该动作 DROP (丢弃)

注意,只有 -I 也主是在insert 的条件下,才能加那个序号,还有规则的顺序很重要,如果搞错了顺序,会有问题,看下面

1
2
3
4
5
iptables -I INPUT -s 10.0.1.251 -j DROP
iptables -A INPUT -s 10.0.1.251 -j ACCEPT

# -A 是追加的意思 append ,默认会在规则的最后面加一条规则 这个不能设置规则序号
# 上面丢弃这个ip的请求,然后下面的是又追加了一条,允许访问,但是总体,他还是不能访问,

删除规则

  • 按照规则序号来删除
  • 按照匹配条件与动作来删除
1
2
3
iptables -D INPUT 1
# -D Delete 删除
iptables -D INPUT -s 10.0.1.251 -j ACCEPT

修改规则

1
2
3
4
5
6
iptables -R INPUT 1 -s 10.0.1.251 -j REJECT

# -R 替换 Replace
# 1 这个是必填的,确定你修改的是哪条规则
# -s 目标地址,如果不填,则替换为0.0.0.0,即所有ip
# -j REJECT 拒绝,并给出相应的消息响应

注意 如果上面的-s 不填的话,就说明,拒绝所有的ip连接,如果是远程服务器,则会无法访问了,所以在使用的时候,要慎重

替换很容易出错,大多情况下,是把当前的规则删除,重新添加

1
2
3
4
5
6
7
8
# ip被拒绝访问后的相关提示
[root@node01 ~]# ping 10.0.0.102
PING 10.0.0.102 (10.0.0.102) 56(84) bytes of data.
From 10.0.0.102 icmp_seq=1 Destination Port Unreachable
From 10.0.0.102 icmp_seq=2 Destination Port Unreachable
^C
--- 10.0.0.102 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1000ms

修改链默认策略

1
2
3
iptables -P INPUT DROP

# -P 指定要修改的链,上面的意思为修改filter表中的INPUT连接的默认策略改为DROP

保存规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# centos 6
service iptables save

# centos 7
systemctl save iptables

# 通用方法
# 重定向
iptables-save > /etc/systemconfig/iptables

# 备份
iptables-save > /var/bak/iptables.bak

#恢复
iptables-resotre < /var/bak/iptables.bak

匹配条件详解

基本

  • -s 用于匹配源地址,多个地址,用逗号隔开,逗号两侧不能有空格;也可以匹配一个网段;前面加叹号(!) 表示取反
1
2
3
4
5
iptabels -I INPUT -s 10.0.1.251,10.0.1.252 -j DROP

iptables -I INPUT -s 10.0.1.0/16 -j DROP

iptables -I INPUT ! -s 10.0.1.251 -j DROP
  • -d 用于匹配目标地址,用法同上。
  • -p 用于匹配协议(tcp,udp,udplite,icmp,esp,ah,sctp)
1
2
3
iptables -I INPUT -p tcp -s 10.0.1.251 -j ACCEPT

iptables -I INPUT ! -p tcp -s 10.0.1.251 -j ACCEPT
  • -i 用于匹配报文是从哪个网卡流入本机

OUTPUT链 和 POSTROUTING链不能使用此项

1
2
3
iptables -I INPUT -p icmp -i eth0 -j DROP

iptables -I INPUT -p icmp ! -i eth0 -j DROP
  • -o 用于匹配报文是从哪个网卡流出本机

INPUT链 和 PREROUTING链不能用此项

1
2
3
iptables -I OUTPUT -p icmp -o eth0 -j DROP

iptables -I OUTPUT -p icmp ! -o eth0 -j DROP

扩展匹配条件

tcp 模块

  • -p tcp -m tcp --sport 用于匹配tcp协议的源端口,可以使用冒号(:)来指定一个连续的端口范围
  • -p tcp -m tcp --dport 用于匹配tcp协议的目标端口,可以使用冒号(:)来指定一个连续的端口范围
1
2
3
4
5
6
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

multiport模块

  • -p tcp -m tcp --sport 用于匹配tcp协议的源端口,可以指定离散的多个端口,端口之间用逗号隔开
  • -p tcp -m tcp --dport 用于匹配tcp协议的目标端口,可以指定离散的多个端口,端口之间用逗号隔开
1
2
3
4
5
6
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

udp

使用方法同tcp,请参考tcp

常用扩展模块

iprange模块

用于指定一段连续的ip地址范围

  • --src-range 指定连续的源地址范围
  • --dst-range 指定连续的目标地址范围
1
2
3
4
#示例
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP

string模块

可以用于指定匹配的字符串

  • --algo 指定匹配算法,可用算法有bm,kmp,为必填项
  • --string 要匹配的字符串
1
2
3
#示例
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT

time模块

可以根据时间段区间匹配报文

  • --timestart:用于指定时间范围的开始时间,不可取反
  • --timestop:用于指定时间范围的结束时间,不可取反
  • --weekdays:用于指定”星期几”,可取反
  • --monthdays:用于指定”几号”,可取反
  • --datestart:用于指定日期范围的开始日期,不可取反
  • --datestop:用于指定日期范围的结束时间,不可取反
1
2
3
4
5
6
7
8
9
#示例
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

connlimit模块

用于限制同一个ip同时连接到服务端的连接数

  • --connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
  • --connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制,如果不明白可以参考上文的详细解释。
1
2
3
4
#示例
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT

limit模块

是对报文的到达速度进行限制

  • --limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了”令牌桶”的概念,方便回顾。
  • --limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。
1
2
3
#示例 这两条命令要结合使用
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT