iptables–基础–02–命令
前提
要安装iptables,开启防火墙
1、语法
1.1、语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
1.2、说明
表名、链名
用于指定iptables命令所操作的表和链
命令选项
用于指定管理iptables规则的方式,比如插入、增加、删除、查看等
条件匹配
用于指定对符合什么样条件的数据包进行处理
目标动作或跳转
用于指定数据包的处理方式,比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
2、命令选项
-A(append) 顺序添加,添加一条新规则
-I(insert) 插入,插入一条新规则,-I 后面加一数字表示插入到哪行,默认在第一行添加
-R(replace) 修改、替换(replace)指定链中的某一条规则, -R 后面加一数字表示删除哪行
-D(delete) 删除,删除一条新规则,-D 后面加一数字表示删除哪行
-N(new-chain) 新建一条用户自己定义的规则链
-X(delete-chain) 删除指定表中用户自定义的规则链,删除之前要保证此链是空的,而且没有被引用
-L(list) 列出指定链中所有的规则
iptables -L -n 以数字的方式显示
iptables -L -v 显示详细信息
iptables -L -x 显示精确信息
-E(rename-chain) 重命名用户定义的链,不改变链本身
-F(flush) 清空链中的所有规则
-Z(zero) 将所有表的所有链的字节和数据包计数器清零
-P(policy) 设置指定链的默认策略
-h 获取帮助(help)
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
3、条件匹配
以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。
3.1、隐含匹配
--sport 源端口(source port)
针对 -p tcp 或者 -p udp
缺省情况下,将匹配所有端口
可以指定端口号或者端口名称,例如"–sport 22"与"–sport ssh"。
/etc/services文件描述了上述映射关系。
从性能上讲,使用端口号更好
使用冒号可以匹配端口范围,如"–sport 22:100"
还可以使用"–source-port"
--dport 目的端口(destination port)针对-p tcp 或者 -p udp
参数和–sport类似
还可以使用"–destination-port"
--tcp-flags TCP标志
针对-p tcp
可以指定由逗号分隔的多个参数
有效值可以是:SYN, ACK, FIN, RST, URG, PSH
可以使用ALL或者NONE
-–icmp-type ICMP类型
针对-p icmp
–icmp-type 0 表示Echo Reply
–icmp-type 8 表示Echo
-p 协议(protocol)
指定规则的协议,如tcp, udp, icmp等
可以使用all来指定所有协议。
如果不指定-p参数,则默认是all值。这不明智
可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols
还可以使用–protocol参数代替-p参数
-s 源地址(source)
指定数据包的源地址
参数可以使IP地址、网络地址、主机名
例如:-s 192.168.1.101指定IP地址
例如:-s 192.168.1.10/24指定网络地址
如果不指定-s参数,就代表所有地址
还可以使用–src或者–source
-d 目的地址(destination)
指定目的地址
参数和-s相同
还可以使用–dst或者–destination
-i 输入接口(input interface)
-i代表 输入接口(input interface)
-i指定了要处理来自哪个接口的数据包
这些数据包即将进入INPUT, FORWARD, PREROUTE链
例如:-i eth0指定了要处理经由eth0进入的数据包
如果不指定-i参数,那么将处理进入所有接口的数据包
如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包
如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包
还可以使用–in-interface参数
-o 输出(out interface)
-o代表 输出接口(output interface)
-o指定了数据包由哪个接口输出
这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链
如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
如果出现! -o eth0,那么将从eth0以外的接口输出
如果出现-i eth+,那么将仅从eth开头的接口输出
还可以使用–out-interface参数
3.2、扩展匹配
-m state --state 匹配状态的
-m mutiport --source-port 端口匹配,指定一组端口
-m limit --limit 3/minute 每三分种一次
-m limit --limit-burst 5 只匹配5个数据包
-m string --string --algo bm|kmp --string"xxxx" 匹配字符串
-mtime --timestart 8:00 --timestop 12:00 表示从哪个时间到哪个时间段
-mtime --days 表示那天
-m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址
-m layer7 --l7proto qq 表示匹配腾讯qq的,当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7
4、目标动作或跳转
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
QUEUE:将数据包移交到用户空间
RETURN:停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
5、iptables防火墙规则的保存与恢复
有以下2中方式
# 把规则自动保存在/etc/sysconfig/iptables中。
# 当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。
iptables-save > /etc/sysconfig/iptables
# 把规则自动保存在/etc/sysconfig/iptables中。
# 当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。
service iptables save
6、iptables服务命令
6.1、iptables服务命令
# 安装iptables-services
yum install iptables-services
# 查看状态
systemctl status iptables.service
# 启动
systemctl start iptables.service
# 重启
systemctl restart iptables.service
# 停止
systemctl stop iptables.service
6.2、防火墙命令
# 开启防火墙
systemctl start firewalld.service
# 重启
systemctl restart firewalld.service
# 查看状态
systemctl status firewalld.service
# 停止
systemctl stop firewalld.service
7、删除iptables规则
# 清空所有iptables规则
iptables --flush
# 清空所有iptables规则
iptables -F
# 清除iptables nat表规则。
iptables -t nat -F
8、追加iptables规则
可以使用iptables -A命令追加新规则,其中-A表示新增。新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功。
8.1、语法
iptables -A chain firewall-rule
-A chain :指定要追加规则的链
firewall-rule :具体的规则参数
8.2、案例
8.2.1、只接收目标端口为22的数据包
# 接收目标端口为22的数据包
iptables -A INPUT -i eth32 -p tcp --dport 22 -j ACCEPT
# 拒绝所有其他数据包
iptables -A INPUT -j DROP
8.2.2、拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据
iptables -A FORWARD -s 192.168.1.10 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
说明:注意要把拒绝的放在前面不然就不起作用了啊。
8.2.3、从外网接口(eth32)进入防火墙本机,且源地址为私网地址的数据包丢弃掉
iptables -A INPUT -i eth32 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth32 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth32 -s 10.0.0.0/8 -j DROP
8.2.4、只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。
iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时。
8.2.5、允许本机开放从TCP端口20-1024提供的应用服务。
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
8.2.6、允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
8.2.7、禁止转发来自MAC地址为00:0C:29:27:55:3F的的数据包
iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
说明:
iptables中使用"-m 模块关键字"的形式调用显示匹配。
咱们这里用"-m mac –mac-source"来表示数据包的源MAC地址。
8.2.8、允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
说明:这里用"-m multiport –dport"来指定目的端口及范围
8.2.9、禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
说明:此处用"-m –iprange –src-range"指定IP范围。
8.2.10、禁止转发与正常TCP连接无关的非syn请求数据包。
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
说明:"-m state"表示数据包的连接状态,"NEW"表示与任何连接无关的,新的嘛!
8.2.11、拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
说明:
"ESTABLISHED"表示已经响应请求或者已经建立连接的数据包
"RELATED"表示与已建立的连接有相关性的,比如FTP数据连接等。
8.2.12、允许防火墙转发除ICMP协议以外的所有数据包
# 使用!可以将条件取反。
iptables -A FORWARD -p ! icmp -j ACCEPT
9、插入iptables规则
9.1、封堵网段(10.20.30.0),两小时后解封。
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
# 2个小时后
iptables -D INPUT 1
iptables -D FORWARD 1
说明:这个策略借助crond计划任务来完成,就再好不过了。
9.2、禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
9.3、只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发往服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。
iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
9.4、拒绝进入防火墙的所有ICMP协议数据包
iptables -I INPUT -p icmp -j REJECT
10、查看表规则
测试数据
iptables -F
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 15672 -j ACCEPT
iptables -I INPUT -s 192.168.187.171 -p tcp --dport 15672 -j ACCEPT
iptables -I FORWARD -s 127.0.0.1 -p tcp --dport 15672 -j ACCEPT
iptables -I FORWARD -s 192.168.187.171 -p tcp --dport 15672 -j ACCEPT
iptables -I OUTPUT -s 127.0.0.1 -p tcp --dport 15672 -j ACCEPT
iptables -I OUTPUT -s 192.168.187.171 -p tcp --dport 15672 -j ACCEPT
10.1、查看各表中的规则
iptables -t filter --list
10.2、查看mangle表
iptables -t mangle --list
10.3、查看NAT表
iptables -t nat --list
11、删除iptables规则
11.1、删除INPUT链的第一条规则
iptables -D INPUT 1
12、更改默认策略
12.1、当前链的默认策略
默认策略是ACCEPT
iptables --list
12.2、更改默认策略
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
你发现不能SSH连接被迫终止了!这事因为我们已经把OUTPUT链策略更改为DROP了,此时虽然服务器能接收数据,但是无法发送数据。