iptables 日常使用
一、iptables 简介
一旦匹配,就不再二次处理,直接执行动作。所以需要注意iptables 写的顺序
- 六个链
input:目的地址是本地的数据包
output:离开本地的数据包
forward:本地路由转发的数据包
prerouting:处理刚刚到达的数据包(路由前)
postrouting:处理离开的数据包(路由后)
自定义链:产生分类子链 - 5个表
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(SELinux)实现
优先级由高到低的顺序为:
security -->raw–>mangle–>nat–>filter - 处理动作
ACCEPT:
将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。
REJECT:
拦阻该数据包,并传送数据包通知对方,可以传送的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。
DROP:
丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT:
将包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。
MASQUERADE:
改写数据包来源 IP为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。
LOG:
将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其规则。
SNAT:
改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
DNAT:
改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。
MIRROR:
镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE:
中断过滤程序,将数据包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费…等。
RETURN:
结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则链看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。
MARK:
将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
二、iptables 命令解析
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
- -t filter
指定使用过滤表 - -A INPUT
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零
INPUT 指定使用input链 - -s 172.16.0.0/16 -d 172.16.100.10 -p tcp
基本匹配条件:无需加载模块,由iptables/netfilter自行提供
-s, --source address[/mask][,…]:源IP地址或范围
-d, --destination address[/mask][,…]:目标IP地址或范围
-p, --protocol protocol:指定协议,可使用数字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“参看:/etc/protocols
-i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
-o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链 - -m multiport
指定模块 - –dports 20:22,80
模块带的参数选项 - -j ACCEPT
选择动作
三、iptables 常用命令
- 查看现在的规则
[root@localhost ~]#iptables -vnL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@localhost ~]#
- 清空链的所有规则
[root@localhost ~]#iptables -F
- 修改链的默认规则
iptables -P FOWORD DROP
- 查看规则编号
[root@localhost ~]#iptables -vnL --line-numbers
四、iptables 模块的用法
使用扩展模块 -m或者–match,使用–help 来查看模块帮助
[root@localhost ~]#iptables -t filter -A INPUT -p tcp --dport 80 -m mac --help
- multiport 多端口模块
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,–sports port[,port|,port:port]…
指定多个源端口
[!] --destination-ports,–dports port[,port|,port:port]…
指定多个目标端口
[!] --ports port[,port|,port:port]…
多个源或目标端[root@localhost ~]#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
- mac地址模块
[root@localhost ~]#iptables -t filter -A INPUT -p tcp --dport 80 -m mac --mac-source 00:00:00:00:00:00:00 -j drop #禁止mac地址为00的访问
- owner模块 匹配用户或者组的id
[root@localhost ~]#iptables -t filter -A OUTPUT -d 192.168.20.10 -p tcp --dport 80 -m owner --uid-owner 1001 -j drop #禁止uid 1001 的用户访问这个网站 或者写 --uid-owner user1
- iprange ip地址范围 指定任意范围的ip地址
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围[root@localhost ~]#iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.100 -j DROP
- string 限制报文内容包含字符串
对报文中的应用层数据做字符串模式匹配检测
–algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
–from offset 开始偏移
–to offset 结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式[root@localhost ~]#iptables -A INPUT -s 192.168.10.20 -p tcp --sport 80 -m string --algo bm --string "chaogu" -j DROP
- time module 根据时间段区匹配报文
根据将报文到达的时间与指定的时间范围进行匹配
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss] 时间
–timestop hh:mm[:ss]
[!] --monthdays day[,day…] 每个月的几号
[!] --weekdays day[,day…] 星期几,1 – 7 分别表示星期一到星期日
–kerneltz:内核时区,不建议使用,CentOS 7系统默认为 UTC
注意: centos6 不支持kerneltz ,–localtz指定本地时区(默认)[root@localhost ~]#iptables -t filter -A OUTPUT -d 192.168.20.10 -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 17:00:00 -j drop
- connlimit 允许你限制每个客户端ip的并发连接数
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
–connlimit-upto # :连接的数量小于等于#时匹配
–connlimit-above # :连接的数量大于#时匹配[root@localhost ~]#iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimitabove 2 -j REJECT
- limit 收发报文速率匹配
[root@centos8 ~]#iptables -A INPUT -p icmp -m limit --limit-burst 10 --limit 20/minute -j ACCEPT [root@centos8 ~]#iptables -A INPUT -p icmp -j REJECT [root@centos6 ~]#ping 192.168.39.8 PING 192.168.39.8 (192.168.39.8) 56(84) bytes of data. 64 bytes from 192.168.39.8: icmp_seq=1 ttl=64 time=0.779 ms 64 bytes from 192.168.39.8: icmp_seq=2 ttl=64 time=0.436 ms 64 bytes from 192.168.39.8: icmp_seq=3 ttl=64 time=0.774 ms 64 bytes from 192.168.39.8: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.39.8: icmp_seq=5 ttl=64 time=0.441 ms 64 bytes from 192.168.39.8: icmp_seq=6 ttl=64 time=0.356 ms 64 bytes from 192.168.39.8: icmp_seq=7 ttl=64 time=0.553 ms 64 bytes from 192.168.39.8: icmp_seq=8 ttl=64 time=0.458 ms 64 bytes from 192.168.39.8: icmp_seq=9 ttl=64 time=0.459 ms 64 bytes from 192.168.39.8: icmp_seq=10 ttl=64 time=0.479 ms 64 bytes from 192.168.39.8: icmp_seq=11 ttl=64 time=0.450 ms 64 bytes from 192.168.39.8: icmp_seq=12 ttl=64 time=0.471 ms 64 bytes from 192.168.39.8: icmp_seq=13 ttl=64 time=0.531 ms 64 bytes from 192.168.39.8: icmp_seq=14 ttl=64 time=0.444 ms From 192.168.39.8 icmp_seq=15 Destination Port Unreachable 64 bytes from 192.168.39.8: icmp_seq=16 ttl=64 time=0.668 ms From 192.168.39.8 icmp_seq=17 Destination Port Unreachable From 192.168.39.8 icmp_seq=18 Destination Port Unreachable 64 bytes from 192.168.39.8: icmp_seq=19 ttl=64 time=0.692 ms From 192.168.39.8 icmp_seq=20 Destination Port Unreachable From 192.168.39.8 icmp_seq=21 Destination Port Unreachable 64 bytes from 192.168.39.8: icmp_seq=22 ttl=64 time=0.651 ms
- recent 限制规定时间的连接数
RECENT 语句都带有布尔型返回值,每次执行若结果为真,则会执行后续的语句,比如“-j ACCEPT”之类的。
–set :将地址和时间戳添加进列表;
–rcheck :检查地址是否在列表;
–update :刷新时间戳;
–remove :删除。
(每次使用只能选用一种。)
–rsource & --rdest(指示当前方法应用到数据包的源地址还是目的地址)
–seconds seconds(时间)
–hitcount hits(命中数)
–name name (自定义名称)[root@localhost ~]#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name sshd --update --seconds 60 --hitcount 3 -j DROP [root@localhost ~]#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name sshd --set #如果在一分钟之内,超过三次连接,就DROP
- state 状态
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪[root@localhost ~]#iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
- 实验:开放被动模式的ftp服务实例
需要装载ftp连接追踪的专用模块[root@localhost ~]#yum install vsftpd [root@localhost ~]#systemctl start vsftpd [root@localhost ~]#modprobe nf_conntrack_ftp [root@localhost ~]#iptables -F [root@localhost ~]#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT [root@localhost ~]#iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT [root@localhost ~]#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT [root@localhost ~]#iptables -P INPUT DROP [root@localhost ~]#iptables -P OUTPUT DROP [root@localhost ~]#iptables -vnL
- 实验:不允许xiapi用户上班时间访问 game.test.com
[root@localhost ~]#iptables -A OUTPUT -m owner --uid-owner xiapi -m time --timestart 09:00:00 --timestop 17:00:00 -m string --algo bm -- string "game.test.com" -j drop
五、iptables 规则保存
-
持久保存
centos 7/8
iptables-save > /PATH/TO/SOME_RULES_FILE
centos 6
#将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save -
加载规则
CentOS 7
重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6
#会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart -
开机自动加载
用脚本保存各iptables命令;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE
用规则文件保存各规则,开机时自动载入此规则文件中的规则
在/etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE定义Unit File, CentOS 7,8 可以安装 iptables-services 实现
yum install iptables-services
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables.service
六、iptables NAT配置
SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
DNAT:destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
PNAT: port nat,端口和IP都进行修改
- SNAT使用自定义ip
可以是地址段或者地址[root@localhost ~]#iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9 # --to-source 是外网ip
- SNAT使用接口IP
MASQUERADE:基于nat表的target,适用于动态的公网IP,如拨号网络[root@localhost ~]#iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
- DNAT端口映射
[root@localhost ~]#iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
七、iptables 本地端口重定向
REDIRECT,是NAT表的target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口,可用于PREROUTING OUTPUT链
[root@localhost ~]#iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080