Iptables 解析
Contents
概念
iptable相当于一个客户端命令工具,位于用户空间,netfilter是防火墙的框架,位于内核空间
iptables 有状态的防火墙 规则控制 免费
配置复杂 维护难
iptables 功能 :数据包过滤 数据转发 限速 防攻击
iptables 主要包括四表五链
四表
filter(包过滤)、nat(网络地址转换)、mangle(包重构)、raw(数据跟踪处理),优先级:raw->mangle->nat->filter
- filter 包含INPUT、OUTPUT、FORWARD链,负责过滤功能,防火墙
- nat 包含PREROUTING、POSTROUTING、OUTPUT链,网络地址转换功能
- manglel 包含INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING链,拆解报文,做出修改,并重新封装的功能
- raw 包含 PREROUTING、OUTPUT链,关闭nat表上启用的连接追踪机制
五链
当一个数据包进入网卡时,它首先进入prerouting链,内核根据数据包目的IP判断是否需要转送出去 如果数据包就是本机的,他就会到达input链。数据包到了input链后,任何进程都会收到它,本机上运行的程序可以发送数据包,这些数据包会经过output链,然后到达postrouting链输出
如果数据包不是本机就要转送出去,则由prerouting–forward–postrouting转发到其他主机
处理动作
- ACCEPT: 允许数据包通过
- DROP: 直接丢弃数据包,不给任何回应信息,过了时间才会有反应
- REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应信息,客户端请求就会收到拒绝的信息
- SNAT: 源地址转换,解决内网用户用同一个公网地址上网问题
- REDIRECT: 在本机做端口映射
- DNAT: 目标地址转换
- MASQUERADE: 是snat的一种特殊形式,适用于动态、临时会变得IP
LOG: 在/var/log/messages文件中记录日志信息,然后将数据包传送给下一条规则
1 2 3 4
iptables -t filter -L # -t:指定操作的表,不加-t默认filter表 # -L:列出规则
1 2 3 4 5 6 7 8 9 10 11 12
# 查看指定链的规则 iptables -L INPUT iptables -vL iptables -nvL iptables --line-number -nvL iptables -F # -F 清空规则 # -v 显示详细信息 # -n 不对ip地址进行名称解析 # --line-number 显示序号,直接使用--line同效
1 2 3 4 5 6 7 8 9
*案列演示* iptbales -t filter -I INPUT -s X.X.X.X -j DROP iptables -A INPUT -s X.X.X.X -j ACCEPT # 默认操作filter表 # -I 表示插入规则,在链的首部插入规则 # -s 指明源地址 # -A 表示添加规则,在链的尾部追加规则 # 说明一下,定义的规则,从上往下优先级执行,-I插入会优先-A执行规则 # -s x.x.x.x,x.x.x.x 使用逗号可多指定IP地址
删除规则
1 2 3 4 5 6 7 8 9 |
iptables --line -vnL INPUT # 删除指定第几条的规则 iptables -t filter -D INPUT 3 # 根据匹配条件和动作删除 iptables -D INPUT -s x.x.x.x -j ACCEPT # -D INPUT: 表示删除INPUT链中的规则 |
修改规则
1 2 3 4 5 6 7 8 9 |
iptables -t filter -R INPUT 3 -s x.x.x.x -j REJECT # -R: 指定修改的链 # 3: 指定的第几条规则 # 修改指定链的默认策略 iptables -t filter -P FORWARD DROP # -P: 指定要修改的链 |
保存规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
centos7 默认使用firewalld 需要安装iptables yum install iptables-services -y systemctl start iptables && systemctl enable iptables # 禁用firewalld systemctl stop firewalld && systemctl disable firewalld # 保存规则,默认保存到/etc/sysconfig/iptables service iptables save # 查看保存的规则 cat /etc/sysconfig/iptables # 将当前规则以保后的形式输出到屏幕,并不能保存当前定义的规则 iptables-save # 重定向到配置文件即可保存 iptables-save > /etc/sysconfig/iptable # 重载规则,现有规则会被覆盖 iptables-restore < /etc/sysconfig/iptables |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 只拒绝111向112这个ip发送的报文,不妨碍111向别的ip发送报文 iptables -t filter -A INPUT -s 192.168.11.111 -d 192.168.11.112 -j DROP # 不指定源地址,则默认0.0.0.0/0 同理不指定目标地址 iptables -t filter -A INPUT -d 192.18.11.113 -j DROP # 协议类型.指定tcp协议拒绝 -p tcp iptable -I INPUT -s 192.168.1.11 -d 192.168.1.12 -p tcp -j REJECT # 拒绝网卡eth0的ping请求 iptables -t filter -I INPUT -i eht0 -p icmp -j DROP # --dport 指定端口 22 拒绝 iptbales -t filter -I INPUT -s 192.168.1.11 -p tcp --dport 22 -j REJECT # 指定匹配端口 0到100 和指定端口80-65535 iptables -t filter -I INPUT -s 192.168.1.11 -p tcp --dport :100 -j ACCEPT iptables -t filter -I INPUT -s 192.168.1.11 -p tcp --dport 80: -j ACCEPT |
常用扩展模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 使用扩展模块 -m multiport --dport 指定多个端口 iptables -t filter -I INPUT -s 192.168.1.11 -p tcp -m multiport --dport 22,25,80 -j ACCEPT # -m iprange ,--src-range, --dst-range指定源地址和目标地址范围 iptables -t filter -I INPUT -m iprange --src-range 192.168.1.11-192.168.1.111 -j ACCEPT # connlimt 模块对连接数进行限制 iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j ACCEPT # --connlimit-above 表示每个客户端IP到server的链接数上限为10 # --connlimit-mask 24 表示子网掩码255.255.255.0中的ip段 # udp 扩展 iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT # icmp 扩展 不让别人ping通我们 iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT |
IPtables 白名单机制
1 2 3 4 5 6 7 8 9 10 11 12 |
# 指定放行特定报文,只有匹配这二条规则报文才会被放行 iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 将INPUT链默认策略改为DROP,实现机制 iptables -P INPUT DROP # 如果之后清空规则 那么INPUT链中不存在规则,所有报文都会被拒绝,所以这种方法不合适 # 将INPUT链默认策略修改为ACCPET iptables -P INPUT ACCEPT # 在放行规则的底部设置一条拒绝所有请求的规则 iptables -A INPUT -j REJECT |
IPtables 字定义链
为了方便管理规则,需要字定义链,比如按服务分类httpd,ssh服务内外网规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# -N 创建自定义链WEB iptables -t filter -N WEB # 添加一条规则 iptables -t filter -I WEB -s 192.168.1.11 -j REJECT # 为字定义链添加规则后,并不会去匹配响应报文,需要用INPUT链去引用 iptables -I INPUT -p tcp --dport 80 -j WEB # 重命名字定义链 iptables -E WEB SERVER # 删除字定义链,需要先删除对应的应用规则,清除自定义链的规则 iptables -nvL INPUT iptables -D INPUT 1 # 数字1表示删除第一条 iptables -t filter -F WEB iptables -X WEB |
IPtables 之网络防火墙
防火墙分为二类: - 主机防火墙:针对单个主机进行防护,前面所述的iptables都是作为主机防火墙角色 - 网络防火墙:处于网络入口的边缘,针对网络入口进行防护,服务于防火墙背后的局域网
前面所述只用到了INPUT和OUTPUT链,因为有过滤功能的链只有3条,INPUT,OUTPUT,FORWARD,当报文发往本机时,如果想要过滤,只能在INPUT,OUTPUT链中实现,而此时,iptables的角色发生了转变,我们想要将iptables所在的主机打造成网络防火墙(过滤并转发),要想过滤,只能在INPUT,OUTPUT,FORWARD三条链中实现,要想转发,报文只能经过FORWARD链,所以,iptables的角色变为网络防火墙时,规则只能定义在FORWARD链中
A为外部网络主机,圆形内为内部网络,B充当了网络防火墙角色,有二块网卡,A访问内部网络,在B主机进行转发过滤
开启B主机路由转发
1 2 3 4 5 6 |
# 临时生效 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效 ehco "net.ipv4.ip_forward = 1" > /etc/sysctl.conf sysctl -p |
1 2 3 |
# 配置一条转发规则试试 iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT |
IPtables 动作
iptables 有三个常用动作 ACCEPT DROP REJECT,可以为动作指定提升信息
REJECT动作可用值 > icmp-net-ubreachable、icmp-host-ubreachable、icmp-port-ubreachable、icmp-proto-ubreachable、icmp-net-prohibited、icmp-host-pro-hibited、icmp-admin-prohibited、当不设置任何值时,默认值使用icmp-net-ubreachable
SNAT
1 2 3 4 5 |
# 源地址转换案列,参考上图实列 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146 # -A POSTROUTING 表示将SNAT规则添加到POSTROUTING链于INPUT链中,cetos6只能存在POSTROUTOING链中 # -s 10.1.0.0/16 表示报文来自这个网段 # --to-source 192.168.1.146 表示匹配到的报文的源地址修改为这个IP |
DNAT
1 2 |
# 同理,从外部网络访问内部网络服务 iptables -t nat -I PREROUTING -D 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.0:3389 |
Author zhengwei
LastMod 2019-04-01