引言
1 概述
防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。
上两个章节熟悉并了解了什么是防火墙,防火墙的工具iptables以及iptables原理和应用。这一篇是具体的详细实验操作。
2 安装与使用
2.1 安装iptables环境
在Linux操作系统中,可以使用yum管理来安装,也可以从官网下载后上传到服务器手动安装。
「yum安装」
$ yum-y install iptables-services
「下载安装」
2.2 启动iptables
按照我们平时启动软件方式即可。
$ systemctlstop firewalld && systemctl disable firewalld $ systemctlstart iptables && systemctl enable iptables
3 基本命令
这个有点像firewalld防火墙,都是有基本的操作命令。
3.1 查看iptables已设置的规则
查看已设置规则列表:iptables -L
[root@otn2 ~]# iptables -LChain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:bootps ACCEPT tcp -- anywhere anywhere tcp dpt:bootps Chain FORWARD (policy ACCEPT) target prot opt source destination
查看已设置规则详细列表:iptables -L -vn
[root@otn2 ~]# iptables -L -vnChain INPUT (policy ACCEPT 268M packets, 83G bytes) pkts bytes target prot opt in out source destination 00 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 00 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 00 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 00 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 00 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.11.0/24 ctstate RELATED,ESTABLISHED 00 ACCEPT all -- virbr0 * 192.168.11.0/24 0.0.0.0/0 00 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 00 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 00 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 249M packets, 74G bytes) pkts bytes target prot opt in out source destination 00 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68
3.2 清除iptables已设置规则
清除所有规则:iptables -F
删除用户自定义的链:iptables -X
链的计数器清零:iptables -Z
「命令」
$ iptables-F# 清除所有规则,不会处理默认的规则$ iptables-X# 删除用户自定义的链$ iptables-Z# 链的计数器清零(数据包计数器与数据包字节计数器)
3.3 添加iptables规则
指定表:iptables -t
把规则添加到指定的链上(默认添加到最后一行):iptables -A
插入规则(默认插入到第一行,封IP):iptables -I
删除链上的规则:iptables -D
「命令」
$ iptables-t# 指定表(default: `filter')$ iptables-A# 把规则添加到指定的链上,默认添加到最后一行$ iptables-I# 插入规则,默认插入到第一行(封IP)$ iptables-D# 删除链上的规则
3.4 清除iptables指定规则
查看规则号码:iptables -nL --line-numbers
删除指定链上的指定序号:iptables -D INPUT 1
$ iptables-nL--line-numbers# 查看规则号码$ iptables-D INPUT 1# 删除指定链上的指定序号
4 实战
4.1 配置允许ssh端口连接
配置ssh连接:iptables -A INPUT
$ iptables-A INPUT -s192.168.1.0/24 -p tcp --dport22-j ACCEPT
22:是ssh默认端口,
-s 192.168.1.0/24:表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。
-j ACCEPT:表示接受这样的请求
4.2 允许本地圆环地址使用
$ iptables-A INPUT -i lo -j ACCEPT $ iptables-A OUTPUT -o lo -j ACCEPT
本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许。
4.3 设置默认规则
默认情况,配置不允许进入:iptables -P INPUT DROP
默认情况,配置不允许转发:iptables -P FORWARD DROP
默认情况,配制可以转发出去:iptables -P OUTPUT ACCEPT
$ iptables-P INPUT DROP # 配置默认的不让进$ iptables-P FORWARD DROP # 默认的不允许转发$ iptables-P OUTPUT ACCEPT # 默认的可以出去
4.4 配置白名单
允许机房内网机器可以访问:iptables -A INPUT -p all
$ iptables-A INPUT -p all -s192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问$ iptables-A INPUT -p all -s192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问$ iptables-A INPUT -p tcp -s183.121.3.7 --dport3380-j ACCEPT # 允许183.121.3.7访问本机的3380端口
4.5 开启相应的服务端口
$ iptables-A INPUT -p tcp --dport80-j ACCEPT # 开启80端口,因为web对外都是这个端口$ iptables-A INPUT -p icmp --icmp-type8-j ACCEPT # 允许被ping$ iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
4.6 保存iptables规则
「方法一」
$ iptables-save > 1.txt # 将防火墙规则保存到文件中$ iptables-save# 将防火墙规则保存到配置文件中,防止重启后失效$ iptables-restore < 1.txt # 从配置文件里载入防火墙配置
「方法二」
$ cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯$ iptables-save > /etc/sysconfig/iptables $ cat /etc/sysconfig/iptables
4.7 禁止某个IP访问
$ iptables-I INPUT -p tcp -s192.168.1.253 -i ens33 -j DROP $ iptables-A INPUT -p tcp ! -s192.168.1.1 -i ens33 -j DROP $ iptables-A INPUT -p tcp ! -s192.168.1.0/24 -i ens33 -j DROP
4.8 禁止初跳板机以外的IP访问
$ iptables-I INPUT -p tcp ! -s192.168.1.1 -j DROP
4.9 匹配端口范围
$ iptables-I INPUT -p tcp -m multiport --dport21,22,23,24 -j DROP $ iptables-I INPUT -p tcp --dport3306:8809 -j ACCEPT $ iptables-I INPUT -p tcp --dport18:80 -j DROP $ iptables-A INPUT -s127.0.0.1 -d127.0.0.1 -j ACCEPT # 允许本地回环接口(即运行本机访问本机)$ iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立的或相关连的通行$ iptables-A OUTPUT -j ACCEPT # 允许所有本机向外的访问$ iptables-A INPUT -p tcp --dport22-j ACCEPT # 允许访问22端口$ iptables-A INPUT -p tcp --dport80-j ACCEPT # 允许访问80端口$ iptables-A INPUT -p tcp --dport21-j ACCEPT # 允许ftp服务的21端口$ iptables-A INPUT -p tcp --dport20-j ACCEPT # 允许FTP服务的20端口$ iptables-A INPUT -j reject # 禁止其他未允许的规则访问$ iptables-A FORWARD -j REJECT # 禁止其他未允许的规则访问
4.10 匹配ICMP类型
$ iptables-A INPUT -p icmp --icmp-type8# 例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP$ iptables-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT $ iptables-A FORWARD -s192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
「实验」
$ iptables-I INPUT -s192.168.1.200 -j DROP # 封掉190.168.1.200$ iptables-I INPUT -p icmp --icmp-type8-s192.168.1.10 -j ACCEPT $ iptables-I INPUT 2-p icmp ! -s192.168.1.1 --icmp-type8-j DROP # 只允许192.168.1.1 192.168.1.10可以ping$ iptables-I INPUT -p tcp --dport3306-j DROP # 将3306端口封掉$ iptables-A INPUT -p tcp -m tcp -s192.168.0.8 -j DROP # 屏蔽恶意主机(比如,192.168.0.8$ iptables-I INPUT -s123.45.6.7 -j DROP # 屏蔽单个IP的命令$ iptables-I INPUT -s123.0.0.0/8 -j DROP # 封整个段即从123.0.0.1到123.255.255.254的命令$ iptables-I INPUT -s124.45.0.0/16 -j DROP # 封IP段即从123.45.0.1到123.45.255.254的命令$ iptables-I INPUT -s123.45.6.0/24 -j DROP # 封IP段即从123.45.6.1到123.45.6.254
4.11 端口映射
$ iptables-t nat -A PREROUTING -d10.0.1.61 -p tcp --dport9000-j DNAT --to-destination172.16.1.7:22 命令拆解: 表:nat 链:PREROUTING 源IP:10.0.1.61 源端口:9000 协议:tcp 动作:DNAT 目标IP:172.16.1.7 目标端口:22 $ iptables-t nat -A PREROUTING -d210.14.67.127 -p tcp --dport2222-j DNAT --to-dest192.168.188.115:22 # 本机的 2222 端口映射到内网 虚拟机的22 端口
4.12 IP映射
$ iptables-t nat -A PREROUTING -d10.0.1.62 -j DNAT --to-destination172.16.1.7 # 将10.0.1.62的访问请求转发到172.16.1.7
4.13 启动网络转发规则
$ iptables-A FORWARD -o eth0 # 只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用
4.14 字符串匹配
$ iptables-A INPUT -p tcp --syn-m limit --limit5/second -j ACCEPT
iptables -A INPUT -p tcp -m string --algo kmp --string"test"-j REJECT --reject-with tcp-reset iptables -L# Chain INPUT (policy ACCEPT)# target prot opt source destination# REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset## Chain FORWARD (policy ACCEPT)# target prot opt source destination## Chain OUTPUT (policy ACCEPT)# target prot opt source destination
4.15阻止Windows蠕虫
$ iptables-I INPUT -j DROP -p tcp -s0.0.0.0/0 -m string --algo kmp --string"cmd.exe"
4.16 防止SYN洪水
$ iptables-A INPUT -p tcp --syn-m limit --limit5/second -j ACCEPT
4.17 列出已设置的规则
这个在基础规则已经列出来。
「格式」
iptables -L [-t 表名] [链名]
「描述」
• 四个表名 raw,nat,filter,mangle
• 五个规则链名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
• filter表包含INPUT、OUTPUT、FORWARD三个规则链
$ iptables-L-t nat # 列出 nat 上面的所有规则# ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个$ iptables-L-t nat --line-numbers# 规则带编号$ iptables-L INPUT $ iptables-L-nv# 查看,这个列表看起来更详细