简述

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter

netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。

iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 以及数据包过滤的防火墙功能

所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

引用自iptables详解(1):iptables概念

基础操作

查看

1
2
3
4
5
6
7
8
9
10
## 查看
# 查看filter表中INPUT链规则
iptables -t filter -L INPUT --line -nxv

# -t 指定表名,默认filter
# -L 指定链名,默认所有链
# -v 查看详细信息
# -n 不对IP地址进行名称反解析,直接显示IP地址
# --line-numbers 显示规则编号,可简写为--line
# -x 显示精确数值

增加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 增加
# 放通从ens192网口来的所有ssh请求
iptables -A INPUT -i ens192 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ens192 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# PS:
# 处理动作:
# - ACCEPT:允许数据包通过。
# - DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
# - REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
# - SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
# - MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
# - DNAT:目标地址转换。
# - REDIRECT:在本机做端口映射。
# - LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
# - 链名(转至指定链处理)

删除

1
2
3
4
5
6
7
8
9
10
11
## 删除
# -t 指定表
# -D 指定链
# <num> 指定规则id
iptables -t nat -D POSTROUTING 1

# 删除filter表中INPUT链第三条规则
iptables -t filter -D INPUT 3

# 删除源地址为192.168.1.146,动作为ACCEPT的规则
iptables -t filter -D INPUT -s 192.168.1.146 -j ACCEPT

永久生效

1
2
3
4
5
# 规则添加至/etc/sysconfig/iptables即可永久保存
# iptables服务管理

## iptables规则永久保存
iptables-save > /etc/sysconfig/iptables

常用方式

路由转发

1
2
3
4
5
6
7
8
9
10
11
12
## 路由转发
# -s 指定源网段
# -d 指定目标网段
# -o 指定目标网段的网络接口
# -j MASQUERADE 地址伪装
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 10.10.1.0/24 -o eth0 -j MASQUERADE
# PS:
# 1. 服务器开启路由转发需开启内核转发
# 临时配置:echo "1" > /proc/sys/net/ipv4/ip_forward
# 永久配置:修改sysctl.conf,设置net.ipv4.ip_forward = 1,执行sysctl -p生效
# 2. 客户端设置网关为服务器ip
# route add -net 10.10.1.0 netmask 255.255.255.0 gw 192.168.1.199

示例

命令行方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# start
iptables -N IECI-INPUT

# base
iptables -I IECI-INPUT -p tcp --dport 22 -j ACCEPT # ssh
iptables -I IECI-INPUT -p tcp --sport 22 -j ACCEPT # ssh
iptables -I IECI-INPUT -p udp --sport 123 -j ACCEPT # chronyd
iptables -I IECI-INPUT -p udp --sport 53 -j ACCEPT # dns
iptables -I IECI-INPUT -p udp --dport 53 -j ACCEPT # dns
iptables -I IECI-INPUT -p udp --dport 67 -j ACCEPT # dhcp,检测不需要(已踢除)
iptables -I IECI-INPUT -p icmp -j ACCEPT # ping
iptables -I IECI-INPUT -i lo -j ACCEPT # 127.0.0.1

# platform
iptables -I IECI-INPUT -i ens192 -s 111.111.16.47 -j ACCEPT
iptables -I IECI-INPUT -i ens192 -s 111.111.16.48 -j ACCEPT
iptables -I IECI-INPUT -i ens192 -s 111.111.16.49 -j ACCEPT
iptables -I IECI-INPUT -i ens192 -s 111.111.16.50 -j ACCEPT
iptables -I IECI-INPUT -i ens192 -s 111.111.16.147 -j ACCEPT
iptables -I IECI-INPUT -i ens224 -s 6.6.6.0/24 -j ACCEPT
iptables -I IECI-INPUT -i ens224 -s 192.168.206.0/24 -j ACCEPT
iptables -I IECI-INPUT -i ens224 -s 169.254.202.0/24 -j ACCEPT
iptables -I IECI-INPUT -i ens161 -s 8.8.8.0/24 -j ACCEPT
iptables -I IECI-INPUT -p tcp -i ens192 --dport 1984 -j ACCEPT # haproxy dashboard

# kubernetes
iptables -I IECI-INPUT -i docker0 -j ACCEPT # docker
iptables -I IECI-INPUT -i kube-ipvs0 -j ACCEPT # kubernates ipvs
iptables -I IECI-INPUT -s 10.10.0.0/16 -j ACCEPT # pod
iptables -I IECI-INPUT -s 10.96.0.0/12 -j ACCEPT # service
iptables -I IECI-INPUT -p tcp -i ens192 --dport 32000 -j ACCEPT # kubernates dashboard

# openstack
iptables -I IECI-INPUT --dport 3260 -j ACCEPT # iscsi
iptables -I IECI-INPUT --dport 5050 -j ACCEPT # ironic inspector
iptables -I IECI-INPUT -p tcp -i ens192 --dport 30680 -j ACCEPT # nova vnc
iptables -I IECI-INPUT -p tcp -i ens192 --dport 31000 -j ACCEPT # openstack dashboard

# end
iptables -I INPUT -j IECI-INPUT
iptables -P INPUT DROP

iptables文件方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:IECI-INPUT - [0:0]
-A INPUT -j IECI-INPUT
-A IECI-INPUT -i lo -j ACCEPT
-A IECI-INPUT -p icmp -j ACCEPT
-A IECI-INPUT -i docker0 -j ACCEPT
-A IECI-INPUT -i kube-ipvs0 -j ACCEPT
-A IECI-INPUT -p udp -m udp --sport 53 -j ACCEPT
-A IECI-INPUT -p udp -m udp --sport 123 -j ACCEPT
-A IECI-INPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A IECI-INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A IECI-INPUT -s 10.10.0.0/16 -j ACCEPT
-A IECI-INPUT -s 10.96.0.0/12 -j ACCEPT
-A IECI-INPUT -s 111.111.16.147/32 -i ens192 -j ACCEPT
-A IECI-INPUT -s 111.111.16.47/32 -i ens192 -j ACCEPT
-A IECI-INPUT -s 111.111.16.48/32 -i ens192 -j ACCEPT
-A IECI-INPUT -s 111.111.16.49/32 -i ens192 -j ACCEPT
-A IECI-INPUT -s 111.111.16.50/32 -i ens192 -j ACCEPT
-A IECI-INPUT -i ens192 -p tcp -m tcp --dport 30680 -j ACCEPT
-A IECI-INPUT -i ens192 -p tcp -m tcp --dport 31000 -j ACCEPT
-A IECI-INPUT -i ens192 -p tcp -m tcp --dport 1984 -j ACCEPT
-A IECI-INPUT -i ens192 -p tcp -m tcp --dport 32000 -j ACCEPT
-A IECI-INPUT -s 6.6.6.0/24 -i ens224 -j ACCEPT
-A IECI-INPUT -s 8.8.8.0/24 -i ens161 -j ACCEPT
-A IECI-INPUT -s 192.168.206.0/24 -i ens224 -j ACCEPT
-A IECI-INPUT -s 169.254.202.0/24 -i ens224 -j ACCEPT
-A IECI-INPUT -p tcp -m tcp --dport 3260 -j ACCEPT
-A IECI-INPUT -p tcp -m tcp --dport 5050 -j ACCEPT
COMMIT

参考文档