前提
要安装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 layer74、目标动作或跳转
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 save6、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.service6.2、防火墙命令
# 开启防火墙 systemctl start firewalld.service # 重启 systemctl restart firewalld.service # 查看状态 systemctl status firewalld.service # 停止 systemctl stop firewalld.service7、删除iptables规则
# 清空所有iptables规则 iptables --flush # 清空所有iptables规则 iptables -F # 清除iptables nat表规则。 iptables -t nat -F8、追加iptables规则
可以使用iptables -A命令追加新规则,其中-A表示新增。新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功。
iptables -A chain firewall-rule
-A chain :指定要追加规则的链
firewall-rule :具体的规则参数
# 接收目标端口为22的数据包 iptables -A INPUT -i eth32 -p tcp --dport 22 -j ACCEPT # 拒绝所有其他数据包 iptables -A INPUT -j DROP8.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 DROP8.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 ACCEPT8.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 ACCEPT8.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地址。
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数据连接等。
# 使用!可以将条件取反。 iptables -A FORWARD -p ! icmp -j ACCEPT9、插入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 ACCEPT9.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 DROP9.4、拒绝进入防火墙的所有ICMP协议数据包
iptables -I INPUT -p icmp -j REJECT10、查看表规则 测试数据
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 ACCEPT10.1、查看各表中的规则
iptables -t filter --list10.2、查看mangle表
iptables -t mangle --list10.3、查看NAT表
iptables -t nat --list11、删除iptables规则 11.1、删除INPUT链的第一条规则
iptables -D INPUT 112、更改默认策略 12.1、当前链的默认策略
默认策略是ACCEPT
iptables --list12.2、更改默认策略
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
你发现不能SSH连接被迫终止了!这事因为我们已经把OUTPUT链策略更改为DROP了,此时虽然服务器能接收数据,但是无法发送数据。



