一、定义
iptables概念系列内容
iptables 可以理解为linux的防火墙,调用iptables命令操作内核的netfilter来实现流量的管制
[root@ck1 ~]# head -n 2 /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@ck1 ~]# iptables -V
iptables v1.4.21
二、iptables 5表5链
1、iptables中的5表
Raw: 配置数据包,一般用于状态跟踪
<--
RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。
--!>
Filter: 是用于存放所有与防火墙相关操作的默认表,允许、阻止、丢弃进出数据包
Nat: 用于网络地址转换,常见的为SNAT、PNAT、DNAT
Mangle: 用于对特定数据包的修改,修改数据包TTL、数据包做标记,策略路由
Security: 用于访问控制 //new add
表的处理优先级:raw>mangle>nat>filter
2、iptables中的5链
Prerouting 数据包进入路由表之前
Input 数据包目标地址为本机
Forward 通过路由表后,目标地址不为本机
Output 由本机产生向外转发
postrouting 发送到网卡接口
3、iptables 数据处理流程
通过iptables后,数据流通分为两个方向,本地 INPUT ,或者 FORWARD方向 ,流出
下图链接
PREROUTIJNG 处理
- 数据包到达网络接口
- 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。如果进行了连接跟踪,在此处理
- 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等
- 判断是否是本地或者NAT,NAT直接进入PREROUTING NAT然后又有一个路由决策,本地直接进入 INPUT链
非本地请求,走forward链
- 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改
- 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的
-
进入 security 表的 FORWARD 链
- 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改
- 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤
- 进入出去的网络接口
本地请求,走INPUT链、OUTPUT链
- 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改
- 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤
- 进入 filter 表的 security 链
- 交给本地主机的应用程序进行处理
- 处理完毕后进行路由决定,看该往那里发出
- 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
- 连接跟踪对本地的数据包进行处理。
- 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
-
进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT
- 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
- 进行路由决定
- 进入security表的OUTPUT链
- 进入 mangle 表的 POSTROUTING 链,注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
- 进入 nat 表的 POSTROUTING 链
- 进入出去的网络接口
3、不同表对应的链
raw-->prerouting
raw-->output
filter-->input
filter-->output
filter-->forward
nat-->prerouting
nat-->output
nat-->postrouting
mangle-->prerouting
mangle-->input
mangle-->output
mangle-->forward
mangle-->postrouting
security-->input
security-->output
security-->forward
三、iptables
1、iptables 输出说明
iptables简介
Pkts: 处理过的报文数量
Bytes: 累计处理报文大小(字节)
Target: 如果报文与规则匹配,指定目标就会被执行
Prot: 协议
Opt: 用于显示IP
In: 入站网卡
Out: 出站网卡
Source: 流量源或者anywhere
Destination: 流量目的
2、iptables target 类型
target表示此条规则最终的动作,进出、过滤、NAT、跳转
ACCEPT允许数据包通过
DROP丢弃数据
REJECT拒绝通过返回响应信息
SNAT源地址转换
MASQUERADE是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
DNAT 目标地址转换
Redirect 在本机做端口映射
四、iptables规则示例
1、一些笔记
# iptables保存操作规范,保存、重启、查看, 保存位置:/etc/sysconfig/iptables
service iptables save
[root@localhost swconfig]# /etc/rc.d/init.d/iptables save
或者编缉iptables 文件: /etc/sysconfig/iptables
service iptables restart
iptables -L --line-numbers
#ubuntu下iptables设置
iptables-save > /etc/iptables.up.rules
在/etc/network/interfaces 末尾添加一行
pre-up iptables-restore < /etc/iptables.up.rules
常用选项
-d (dst) 数据流向
-p(pro) 协议
-s (source) 源地址
!(非)取反操作内容
filter表内操作:
-j(act)动作部分
-REJECT 表示拒绝,会有提示
DROP 丢弃
------------------------------------------------------------------------------------------------------------------
#允许ping
iptables -A INPUT -p icmp -j ACCEPT
#允许tcp
iptables -A INPUT -p tcp -j ACCEPT
# -l 插队列最前面
iptables -I INPUT -p udp -j ACCEPT
#拒绝本地去ssh其它机器
iptables -A OUTPUT -p tcp --dport 22 -j REJECT
#只允许192.168.1.104 ssh 192.168.1.201
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.104 -j ACCEPT
##只允许10.21.11.2 访问本机的28080端口
iptables -I INPUT -s 10.21.11.2 -p tcp --dport 28080 -j ACCEPT
#基于目的的NAT,80端口转换为81端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.202:81
iptables -t nat -I PREROUTING -s 192.168.1.0/24 -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.202:81
2、摘抄网络经典例子做为参考
1、单个规则实例
iptables -F?
# -F 是清除的意思,作用就是把 FILTRE TABLE 的所有链的规则都清空
iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#在 FILTER 表的 INPUT 链匹配源地址是172.20.20.1的主机,状态分别是NEW,ESTABLISHED,RELATED 的都放行。
iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT
# -p 指定协议,-m 指定模块,multiport模块的作用就是可以连续匹配多各不相邻的端口号。完整的意思就是源地址是172.20.20.1的主机,状态分别是NEW, ESTABLISHED,RELATED的,TCP协议,目的端口分别为123 和 110 的数据包都可以通过。
iptables -A INPUT -s 172.20.22.0/24 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT
iptables -A INPUT -s 0/0 -m state --state NEW -p tcp -m multiport --dport 123,110 -j DROP
#这句意思为源地址是0/0的 NEW状态的的TCP数据包都禁止访问我的123和110端口。
iptables -A INPUT -s ! 172.20.89.0/24 -m state --state NEW -p tcp -m multiport --dport 1230,110 -j DROP
# "!"号的意思 取反。就是除了172.20.89.0这个IP段的地址都DROP。
iptables -R INPUT 1 -s 192.168.6.99 -p tcp --dport 22 -j ACCEPT
替换INPUT链中的第一条规则
iptables -t filter -L INPUT -vn
以数字形式详细显示filter表INPUT链的规则
#-------------------------------NAT IP--------------------------------------
#以下操作是在 NAT TABLE 里面完成的。请大家注意。
iptables -t nat -F
iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp --dport 90 -j DNAT --to 172.20.11.1:800
#-A PREROUTING 指定在路由前做的。完整的意思是在 NAT TABLE 的路由前处理,目的地为192.168.102.55 的 目的端口为90的我们做DNAT处理,给他转向到172.20.11.1:800那里去。
iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT --to 192.168.102.55
#-A POSTROUTING 路由后。意思为在 NAT TABLE 的路由后处理,凡是目的地为 172.20.11.1 的,我们都给他做SNAT转换,把源地址改写成 192.168.102.55 。
iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP
iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP
# 上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,因为出入eth1的包的ip应该是公共IP
iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP
iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP
iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP
# 防止广播包从IP代理服务器进入局域网:
iptables -A INPUT -p tcp -m tcp --sport 5000 -j DROP
iptables -A INPUT -p udp -m udp --sport 5000 -j DROP
iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP
iptables -A OUTPUT -p udp -m udp --dport 5000 -j DROP
# 屏蔽端口 5000
iptables -A INPUT -s 211.148.130.129 -i eth1 -p tcp -m tcp --dport 3306 -j DROP
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP
# 防止 Internet 网的用户访问 MySQL 服务器(就是 3306 端口)
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
#REJECT, 类似于DROP,但向发送该包的主机回复由--reject-with指定的信息,从而可以很好地隐藏防火墙的存在