Write by lyc at 2018-01-29
Modify by lyc at 2020-8-28

一、iptables 命令

1.iptables 安装

CentOS7 以上版本默认没有安装 iptables,需要另外安装

1
2
3
4
5
6
$ yum install -y iptables iptables-services
$ iptables -F;iptables -X;iptables -Z;
$ iptables -t nat -F;iptables -t nat -X;iptables -t nat -Z
$ service iptables save
$ systemctl start iptables
$ systemctl enable iptables

2.iptables 语法

1
$ iptables -t TABLE -[A|I|D] CHAIN rule-specification [options]
  • --table, -t 指定要操作的表,默认 filter 表, filter, nat, mangle
  • --append, -A 在链的末尾处添加规则;INPUT 对流入的数据包进行操作。
  • --insert, -I 插入规则到指定链的第一行或指定行,-I INPUT 2 插入规则到第二行
  • --delete, -D 删除规则role
  • --replace, -R 修改指定的链的规则,-R INPUT 1 表示修改INPUT链的第1条规则
  • --policy, -P 修改链的默认动作
  • --source, -s 匹配源地址 address[/mask][...]
  • --destination, -d 匹配目的地址 address[/mask][...]
  • --sport 匹配源端口号,需要启用扩展匹配 -m pro
  • --dport 匹配目的端口号,需要启用扩展匹配 -m pro,另外必须事先指定了使用哪种协议,即必须先使用-p选项
  • --protocol, -p 匹配协议,默认all (tcp, udp, icmp)
    • centos6支持:tcp, udp, udplite, icmp, esp, ah, sctp
    • centos7支持:tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
  • --in-interface, -i 判断报文是从哪个网卡流入的,**-i 选项只能用于PREROUTING链、INPUT链、FORWARD链**
  • --out-interface, -o 匹配报文将由哪块网卡流出的,**-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链**
  • --match, -m 启用扩展匹配,在使用扩展匹配条件的时候,**如果没有使用-m指定使用哪个扩展模块,iptables会默认使用”-m 协议名”**,而协议名就是-p选项对应的协议名。
  • --jump, -j 指定行为:
    • ACCEPT 允许数据包通过
    • DROP 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
    • REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
    • SNAT 源地址转换,解决内网用户用同一个公网地址上网的问题
    • MASQUERADE 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
    • DNAT 目标地址转换
    • REDIRECT 在本机做端口映射。
  • -A, -I, -D 指定操作链名时,英文要大写: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING
  • -j 指定行为时英文要大写: DROP(丢弃),ACCEPT(接受),REJECT(拒绝)。且DROP优于REJECT

3.iptables 查看规则

  • -L 以列表的形式列出链的规则
  • -n 以数值的形式输出IP和Port
  • -v 查看详细信息,收发包字节数量
  • --line-numbers 输出行号,便于操作
1
2
3
4
5
6
7
$ iptables -nvL
$ iptables -nvL --line-numbers
$ iptables -t filter -nvL --line-numbers
$ iptables -t nat -nvL --line-numbers


$ iptables -t filter -L INPUT

4.保存iptables规则

  • 命令添加的规则,仅在内存里临时生效
  • 需要永久生效需要保存到配置文件 /etc/sysconfig/iptables

CentOS6

1
2
$ /etc/init.d/iptables save
$ service iptables save

CentOS7

1
2
3
4
5
$ service iptables save
$ iptables-save > /etc/sysconfig/iptables

# 使用iptables-restore命令可以从指定文件中重载规则,重载规则时,现有规则将会被覆盖。
$ iptables-restore < /etc/sysconfig/iptables

二、iptables 添加规则

1.添加规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 封锁指定IP
$ iptables -t filter -A INPUT -s 192.168.99.208,192.168.99.209 -p all -j DROP
$ iptables -t filter -A INPUT -s 192.168.99.0/24 -p all -j DROP

# 封锁指定端口(扩展匹配)
## 不指定-d目的地址,默认-d 0.0.0.0/0
$ iptables -t filter -A INPUT -p tcp -s 192.168.99.208/32 --dport 873 -j DROP
$ iptables -t filter -A INPUT -p tcp -s 192.168.99.208/32 -d 192.168.99.207/32 --dport 873 -j DROP
## --dport扩展匹配,默认会配置参数 -m tcp,完整的命令是:
$ iptables -t filter -A INPUT -p tcp -m tcp -s 192.168.99.208/32 -d 192.168.99.207/32 --dport 873 -j DROP

# 禁 ping
$ iptables -A INPUT -s 10.0.0.8 -p icmp --icmp-type 8 -j DROP
$ iptables -A INPUT -s 10.0.0.8 -p icmp --icmp-type any -j DROP
## 禁止流入eth0的icmp协议流量
$ iptables -t filter -A INPUT -i eth0 -p icmp -j DROP

2.按序号插入规则

1
2
# 在filter表的INPUT链的第二行插入这条规则
$ iptables -t filter -I INPUT 2 -p tcp --dport 80 -j DROP

配置允许某个端口

1
2
3
$ iptables -A INPUT -s 106.75.xx.xx/32 -p tcp --dport 22 -j ACCEPT
$ iptables -A INPUT -s 10.19.0.0/16 -p tcp --dport 22 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 22 -j DROP

! 非的使用

1
2
3
4
$ iptables -A INPUT ! -s 106.75.xx.xx/32 -p tcp -m tcp --dport 5666 -j DROP   # 源地址不等于106.75.xx.xx/32的主机的数据包禁止连接本机的5666端口。
$ iptables -I INPUT ! -s 10.0.0.0/24 -j DROP # 源地址不是10.0.0.0/24网段的主机禁止访问本机。
等价于:
$ iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT # 源地址是10.0.0.0/24网段的主机放行

三、iptables 删除规则

1.根据规则的编号去删除规则

1
2
3
$ iptables -nvL --line-numbers        # 打印行号
$ iptables -t filter -D OUTPUT 13 # 删除OUTPUT链第13条规则
$ iptables -t filter -D INPUT 2 # 删除INPUT链第2条规则

2.根据具体的匹配条件与动作删除规则

1
2
# 删除源地址是192.168.99.208,动作是REJECT的规则
$ iptables -t filter -D INPUT -s 192.168.99.208/32 -j REJECT

3.清空所有规则

  • -F flush,刷新指定链中的所有规则
  • iptables -t 表名 -F 链名
1
2
3
4
5
6
7
8
9
10
# 清空filter表规则
$ iptables -t filter -F # 清空所有规则
$ iptables -t filter -X # 表示清空所有自定义规则
$ iptables -t filter -Z # 将所有计数器归0


# 清空nat表规则
$ iptables -t nat -F
$ iptables -t nat -X
$ iptables -t nat -Z

四、iptables 修改规则(不推荐)

  • 注意修改 -s 源地址不可省略。命令没有使用-s指定对应规则中原本的源地址,那么在修改完成后,你修改的规则中的源地址会自动变为0.0.0.0/0(此IP表示匹配所有网段的IP地址)
  • 不建议使用修改规则,不如删除规则重新添加
1
2
# 把限制行为由REJECT改为DROP
$ iptables -t filter -R INPUT 1 -s 192.168.99.208/32 -j DROP

修改链的默认策略

1
2
3
4
5
6
7
8
9
10
11
$ iptables -t filter -P FORWARD DROP
$ iptables -t filter -nvL
Chain INPUT (policy ACCEPT 43 packets, 7095 bytes)
pkts bytes target prot opt in out source destination
386 32424 DROP all -- * * 192.168.99.208 0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes) # 默认动作变成DROP
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 26 packets, 3552 bytes)
pkts bytes target prot opt in out source destination