iptables Info

时间:2023-02-17 07:18:59

一、定义

​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方向 ,流出

iptables Info

​下图链接​

iptables Info

PREROUTIJNG 处理

  1. 数据包到达网络接口
  2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。如果进行了连接跟踪,在此处理
  3. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等
  4. 判断是否是本地或者NAT,NAT直接进入PREROUTING NAT然后又有一个路由决策,本地直接进入 INPUT链

非本地请求,走forward链

  1. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改 
  2. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的
  3. 进入 security 表的 FORWARD 链
  4. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改
  5. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤
  6. ​进入出去的网络接口

本地请求,走INPUT链、OUTPUT链

  1. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改 
  2. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤
  3. 进入 filter 表的 security 链
  4. 交给本地主机的应用程序进行处理 
  5. 处理完毕后进行路由决定,看该往那里发出 
  6. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。 
  7. 连接跟踪对本地的数据包进行处理。 
  8. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。 
  9. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT
  10. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
  11. 进行路由决定
  12. 进入security表的OUTPUT链 
  13. 进入 mangle 表的 POSTROUTING 链,注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。 
  14. 进入 nat 表的 POSTROUTING 链 
  15. 进入出去的网络接口

3、不同表对应的链

iptables Info

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简介​

iptables -vnL

iptables Info

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指定的信息,从而可以很好地隐藏防火墙的存在