赞
踩
原文网址:Linux命令--iptables--使用/实例_IT利刃出鞘的博客-CSDN博客
说明
本文介绍Linux的iptables命令的用法。
作用
iptables控制防火墙,用于禁止或允许某个IP访问,也可以用于请求转发等。
Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(也称网络层防火墙)。
查看当前的IP规则表
iptables -L -n
查看当前IP规则表(带编号) 。
iptables -L -n --line-numbers
此命令会在第1列添加编号,此编号可以用于删除规则:
iptables -D INPUT NUM
禁止某个IP访问
iptables -I INPUT -s 192.168.0.232 -j DROP
禁止某个IP网段访问
iptables -I INPUT -s 192.168.0.232/240 -j DROP
禁止某个IP访问某个端口(比如:8501)
iptables -I INPUT -s 192.168.0.232 -ptcp --dport 8501 -j DROP
禁止某个端口访问(比如:8501)
iptables -I INPUT -p tcp --dport 8501 -j DROP
禁止其他主机ping此服务器
- iptables -A INPUT -p icmp --icmp-type 8 -j DROP
- iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
禁止用户访问www.baidu.com
iptables -I FORWARD -d www.baidu.com -j DROP
解封某个IP访问
iptables -D INPUT -s 192.168.0.232 -j DROP
也可以这样做:
查看当前IP规则表(带编号) 。
iptables -L -n --line-numbers
此命令会在第1列添加编号,此编号可以用于删除规则:
iptables -D INPUT NUM
清空iptables的所有规则(默认规则除外)
iptables -F
允许某个IP访问
iptables -I INPUT -s 192.168.0.232 -j ACCEPT
仅允许来自172.27.8.0/22的用户连接ssh服务
- iptables -I INPUT -s 172.27.8.0/22 -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -j REJECT
限制最大的连接数
当访问80端口的连接数达到100后,开始限制为最多允许每分钟25个链接(防止cc攻击)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
限制单个ip的并发访问(防止cc攻击)
iptables -I INPUT -p tcp --dport 85 -s 192.168.1.8 -m connlimit --connlimit-above 10 -j REJECT
流量均衡
将访问流量分流至内网三台不同主机:
- iptables -A PREROUTING -i eth1 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT -to-destination 172.27.8.10
- iptables -A PREROUTING -i eth1 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT -to-destination 172.27.8.20
- iptables -A PREROUTING -i eth1 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT -to-destination 172.27.8.30
通过iptables配置防火墙立即生效。iptables防火墙配置在重启后就失效了,解决方法如下:
1.将配置写入文件
sudo iptables-save > /etc/iptables.rules
2.网卡启动和关闭时自动加载和保存配置
编辑/etc/network/interfaces文件,添加如下内容:
- pre-up iptables-restore < /home/user/iptables.rules
- post-down iptables-save > /home/user/iptables.rules
格式
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
table有四个,简称四表,对应iptables的功能
命令
命令 | 说明 | 示例 |
-A/--append | 把规则追加到指定链的尾部。 | 格式:iptables -A chain firewall-rule 示例:iptables -A INPUT |
-D/--delete | 删除规则 | 格式: iptables -D chain rulenum //删除 chain 中编号为 rulenum 的那条规则。 iptables -D chain firewall-rule //从 chain 中删除规则 firewall-rule 的那一条目 示例 iptables -D INPUT 1 //删除INPUT中的第1个条目 |
-E/--rename-chain | 重命名规则。会使所有引用原规则名的规则失效。 | iptables -E old-chain new-chain //将 old-chain 名称更改为 new-chain |
-F/--flush | 清空规则链的规则。若未指定chain名称,则清空所有 chain 。 | iptables -F |
-I/--insert | 在头部插入规则 | 格式:iptables -I chain [rulenum] firewall-rule 说明:将 firewall-rule 添加为 chain 中的第 rulenum 条规则,原先的第 rulenum 条及以后各条的需要顺次 +1。 示例:iptables -I INPUT 1 --dport 80 -j ACCEPT |
-L/--list | 查看规则链 | iptables -L |
-N/--new | 创建新的规则 | 格式:iptables -N chain//创建一个名称为 chain 的新链。 |
-P/--policy | 更改策略 | 格式:iptables -P chain target 说明:改变 chain 的策略为 target。 |
-R/--replace | 替换规则 | 格式:格式:iptables -R chain [rulenum] firewall-rule 说明:将 chain 中第 rulenum 条规则替换为 firewall-rule。若不指定 rulenum,则替换该 chain 中第一条。 示例:iptables -R INPUT 1 -s 192.168.120.0 -j DROP |
-S/ --list-rules | 查看规则 | 格式:iptables -S [chain [rulenum]] |
-V | 查看iptables版本 | iptables -V |
-X/--delete-chain | 删除chain | 格式:iptables -X [chain] 说明: |
-Z/--zero | 清空chain的计数器 | 格式:iptables -Z [chain [rulenum]] 说明:把 chain 或者所有 chain(当未指定 chain 名称时)的包及字节的计数器清空。 |
选项
选项 | 说明 | 示例 |
-p | 协议(tcp/udp/icmp) | iptables -A INPUT -p tcp |
-s | 匹配原地址,加" ! "表示除这个IP外 | iptables -A INPUT -s 192.168.1.1 |
-d | 匹配目的地址 | iptables -A INPUT -d 192.168.12.1 |
--sport | 匹配源端口流入的数据 | iptables -A INPUT -p tcp --sport 22 |
--dport | 匹配目的端口流出的数据 | iptables -A INPUT -p tcp --dport 22 |
-i | 匹配入口网卡流入的数据 | iptables -A INPUT -i eth0 |
-o | 匹配出口网卡流出的数据 | iptables -A FORWARD -o eth0 |
-j | 要进行的处理动作:DROP,REJECT,ACCEPT(接受)等 | iptable -A INPUT 1 -s 192.168.120.0 -j DROP |
--to-source | 指定SANT转换后的地址 | iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SANT --to-source 172.16.100.1 |
-t | 表名(raw、mangle、nat、filter) | iptables -t nat |
-m | 使用扩展模块来进行数据包的匹配(multiport/tcp/state/addrtype) | iptables -m multiport |
有5个,简称:五链。
规则链先后顺序:
入站:PREROUTING→INPUT
出站:OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING
匹配的条件。
对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效,根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配。
类别 | 条件类型 | 用法 |
通用匹配 | 协议匹配 | -p 协议名 |
通用匹配 | 地址匹配 | -s 源地址、-d 目的地址 |
通用匹配 | 接口匹配 | -i 入站网卡、-o 出站网卡 |
隐含匹配 | 端口匹配 | -sport 源端口、-dport 目的端口 |
隐含匹配 | TCP标记匹配 | -tcp-flags 检查范围 被设置的标记 |
隐含匹配 | ICMP类型匹配 | -icmp-type ICMP类型 |
显示匹配 | 多端口匹配 | -m multiport --sports |
显示匹配 | ip范围匹配 | -m iprange --src-range ip范围 |
显示匹配 | MAC地址匹配 | -m mac --mac-source MAC地址 |
显示匹配 | 状态匹配 | -m state --state 连接状态 |
一、通用匹配
通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。
1、协议匹配
iptables规则时使用"-p 协议名’的形式指定,用于检查数据包所使用的网络协议,如tcp、udp、icmp、all等,协议存放在/etc/protocols文件中。
丢弃通过icmp协议访问防火墙本机的数据包
iptables -I INPUT -p icmp -j DROP
2、地址匹配
iptables规则时使用"-s 源地址" 或 “-d 目标地址” 的形式指定,用来检查数据包的源地址(source)或目标地址(destination)。IP地址、网段地址等红豆是可以接受,但不建议使用主机名、域名地址。
拒绝转发源地址为192.168.1.38的数据包,允许转发源地址位于192.168.10.0/24网段的数据
- iptables -t filter -A FORWARD -s 192.168.1.38 -j REJECT
- iptables -t filter -A FORWARD -s 192.168.10.0/24 -j ACCEPT
3、网络接口匹配
iptables规则时使用"-i 接口名" 和"-o 接口名"的形式,用于检查数据包从防火墙的那一个节后进入或发出,分别对应入站网卡,出站网卡。
丢弃从外网接口(eth1)访问防火墙本机且源地址为私有地址的数据包
- iptables -t filter -A INPUT -i eth1 -s 192.168.10.0/24 -j DROP
- iptables -t filter -A INPUT -i eth1 -s 192.168.20.0/24 -j DROP
- iptables -t filter -A INPUT -i eth1 -s 192.168.30.0/24 -j DROP
二、隐含匹配
这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能由iptables在需要时自动载入内核,常见的隐含匹配包括端口匹配,TCP标记匹配,ICMP类型匹配。
1、端口匹配
构建Vsftpd服务器时,若要开放20,21端口,以及用于被动模式的端口范围200~300
- iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
- iptables -t filter -A INPUT -p tcp --dport 200:300 -j ACCEPT
2、tcp标记匹配
iptables可通过匹配TCP的特定标志而设定更加严谨的防火墙规则,tcp-flags参数使用如下:-p tcp --tcp-flags。匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开。第一个列表用作参数检查,第二个列表用作参数匹配。可用以下标志:SYN、ACK、FIN、RST 、URG、PSH、ALL、NONE。ALL是指选定所有的标记,NONE是指未选定任何标记。
防止Xmas扫描
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
防止TCP Null扫描
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
拒绝TCP标记为SYN/ACK但连接状态为NEW的数据包,防止ACK欺骗
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP
3、icmp类型匹配
iptabels规则时使用"–icmp-type ICMP类型"的形式,针对的协议为ICMP用来检查ICMP数据包的类型。ICMP类型使用字符串货数字代码表示,如"Echo-Rwquest" (代码为8)、“Echo-Reply” (代码为0)、“Destunation-Unreachable”(代码为3)、分别对应ICMP协议的请求、回显、目标不可达。
1、禁止其他主机ping本机,允许本机ping其他主机
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
或
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
2、禁止本机ping其他主机,允许其它主机ping本机
iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
或
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
三、显式匹配
1、多端口匹配
iptbales规则时使用"-m multiport --dports 端口列表"、"-m multiport --sports 端口列表"的形式,用来检查数据包的源端口,多个端口之间以逗号进行分隔。
允许本机开放80,443,18080端口
iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443,18080 -j ACCEPT
2、ip范围匹配
iptables规则时使用"-m iprange --src-range IP 范围"、"-m iprange --dst-range IP 范围"的形式,用来检查数据包的源地址,目标地址,其中IP范围采用"起始地址-结束地址"的形式表示。
禁止转发源IP地址位于192.168.1.8与192.168.2.8之间的TCP数据包
iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.8-192.168.2.8 -j ACCEPT
3、MAC地址匹配
iptables规则时使用"-m mac --mac-source MAC地址"的形式,用来检查数据包的源MAC地址。由于MAC地址本身的局限性,此类匹配条件一般只适用于内部网络。
禁止mac地址为00:0c:29:04:e4:dc的主机访问本机的ssh端口
iptables -t filter -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0c:29:04:e4:dc -j DROP
4、状态匹配
iptabls规则时使用"-m state --state连接状态"的形式,基于iptables的状态跟踪机制用来检查数据包的链接状态(State)。常见的连接状态包括NEW(与任何连接无关的)、EXTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接相关性的,如FTP数据连接。)
只开放本机的Web服务,但对发给本机的TCP应答报文予以放行,其他入站报文均丢弃
- iptables -I INPUT -p tcp -m multiport --dport 22,53000 -j ACCEPT
- iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
- iptables -P INPUT DROP
执行的动作,常见的几个如下
通过-j参数指定,分为基本动作和扩展动作,扩展动作通过自定义链实现的。
动作 | 说明 | 示例 |
ACCEPT | 允许数据包通过。 处理后不再比对其它规则,直接跳往下一规则链(nat:postrouting) | |
REJECT | 拦阻该数据包,并传送数据包通知对方。 处理后不再比对其它规则,直接中断过滤程序。 message默认是:icmp-port-unreachable。可选的message有: icmp-net-unreachable icmp-host-unreachable icmp-port-unreachable icmp-proto-unreachable icmp-net-prohibited icmp-host-prohibited icmp-admin-prohibited Icmp-echo-reply tcp-reset(这个数据包会要求对方关闭联机)。 | iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset |
DROP | 丢弃数据包不予处理,处理后不再比对其它规则,直接中断过滤程序。 这时客户端会感觉自己的请求沉入大海,等过了超时时间才会有反应。 | |
REDIRECT | 将数据包重新导向到另一个端口(PNAT)。 处理后,会继续比对其它规则。 | 例1:将本机的80端口转发到8080端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 |
SNAT | 改写数据包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围。 处理后,将直接跳往下一个规则炼(mangle:postrouting)。 SNAT报文必须存在POSTROUTING链中,也就是从内部发出去的报文经过的最后一道关卡,对应的–to-source选项 | 示例:所有从内部机器IP=192.168.10.111发过来的报文都会被隐藏源IP,并转发到192.168.1.111机器上 iptables -t nat -I POSTROUTING -s 192.168.10.111 -j SNAT --to-source 192.168.1.111 |
DNAT | 改写数据包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围。 处理后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。 一般配置在 PREROUTING链中。 | 示例:所有从外部访问主机192.168.1.34对应的端口为53000的服务,都会被转发到192.168.100.100:53000 上,目标IP被修改 iptables -t nat -A PREROUTING -d 192.168.1.34 -p tcp -m tcp --dport 53000 -j DNAT --to-destination 192.168.100.100:53000 |
MASQUERADE | 改写数据包来源 IP 为防火墙 NIC IP,可指定 port 对应的范围。 处理后,直接跳往下一规则链(mangle:postrouting)。 MASQUEREAD与SNAT 类似,也是将内部发出去的报文映射成公网IP,不同是MASQUEREAD可指定网卡,无需关心IP是什么,即使IP发生变化也可以正常映射 当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。 | 例1:iptables -t nat -I POSTROUTING -s 192.168.10.111 -j -o eth0 MASQUEREAD 例2:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 |
LOG | 将数据包通信纪录在 /var/log/messages 中。 处理后,会继续比对其它规则。 --log-level 可以给指定日志加级别:emerg,alert,crit,error,warn,notice,debug,info --log-prefix 可以给指定的日志加标签,便于查看 | iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" |
MIRROR | 镜射数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,处理后,将会中断过滤程序。 | |
QUEUE | 中断过滤程序,将数据包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用……等。 | |
RETURN | 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。 | |
MARK | 将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,处理后,将会继续比对其它规则。 | iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2 |
内网的服务器对外服务(端口映射)
目标:使外网用户可以访问到局域网192.168.138.21这台HTTP服务
- echo 1 > /proc/sys/net/ipv4/ip_forward
- iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.138.21
- iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
在网关服务器进行透明代理
目标: 使局域网用户,访问外网web服务时,自动使用squid作web透明代理服务器
- echo 1 > /proc/sys/net/ipv4/ip_forward
- iptables -t nat -A PREROUTING -s 192.168.138.0/24 -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.138.1
- iptables -t nat -A PREROUTING -s 192.168.138.0/24 -p tcp --dport 80 -i eth0 -j REDIRECT --to 3128
- iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
ip映射
假设一家ISP提供园区Internet接入服务,为方便管理,该ISP分配给园区用户的IP地址都是伪IP,部分用户要求建立自己的WWW 服务器对外发布信息。可以在防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射将发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
该ISP分配给A单位www服务器的ip情况:伪ip(192.168.1.100)、真实ip(202.110.123.100)
该ISP分配给B单位www服务器的ip情况:伪ip(192.168.1.200)、真实ip(202.110.123.200)
linux防火墙的ip地址情况:内网接口eth1(192.168.1.1)、外网eth0(202.110.123.1)
配置流程如下:
- #将分配给A、B单位的真实ip绑定到防火墙的外网接口
- ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
- ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
- #对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT)
- iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
- iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
- #对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT)
- iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
- iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。