iptables 脚本实例
注意:
实验楼的桌面就是用 VNC 在配置的时候要注意,建议切换到字符模式进行配置,避免桌面中断造成的影响。 iptables 及 SELinux 的实验将使用 CentOS 云主机进行。不同于实验楼先前实验中的 Docker 容器,CentOS 云主机停止实验之后的回收时间比较长(大概10分钟),所以希望大家尽可能避免频繁的开启和停止实验,否则会造成资源的浪费从而造成楼+同学的“资源不足”的报错,如果遇到“资源不足”的情况可以稍等几分钟再次尝试。
1. 实验介绍
1.1 实验内容
本节实验主要是对 iptables 脚本编写的实践。主要讲解 iptables 编写脚本的默认规则,以及编写流程化的步骤和 iptables 脚本的实例。
1.2 实验知识点
- 脚本默认规则
- 如何编写脚本
- 脚本编写实例
2. Bash 脚本中使用 iptables
2.1 iptables 规则设置
- 默认规则
这些是由 iptables-save 命令获得的默认的规则,表示默认 INPUT 等 chain 都是 ACCEPT 的状态:
:INPUT ACCEPT [0:0]
# 表示 INPUT 链默认规则是 ACCEPT
:FORWARD ACCEPT [0:0]
# 表示 FORWARD 链默认规则是 ACCEPT
:OUTPUT ACCEPT [0:0]
# 表示 OUTPUT 表默认规则是 ACCEPT
注:[0:0]表示:[包计数器:字节计数器]
- 清除规则
# 清除规则链中已有的条目
sudo iptables -F
# 清除用户自定义的空链
sudo iptables -X
# 清空链和链中默认规则的计算器
sudo iptables -Z
- 禁止其他机器向该主机发送任何连接请求,即此时该主机不提供任何服务。
-A INPUT -m state --state NEW -j DROP
- 允许所有建立连接或相关的数据通过。(ESTABLISHED:已建立的连接状态。RELATED:该数据包与本机发出的数据包有关。)
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 查看主机上 iptables 的规则
$ sudo iptables -L
- 查看主机上已经生效的规则
$ sudo iptables-save
2.2 测试示例
根据前面我们学习到的默认规则可以简单编写一个 iptables 脚本,作为主机上一个默认的防火墙。
创建一个脚本文件
$ touch test.sh
$ vim test.sh
脚本如下:
# !/bin/bash
# 清除规则
iptables -F
iptables -X
iptables -Z
# 设置链的默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
保存退出,设置可执行权限,运行脚本,最后查看 iptables 规则
sudo chmod +x test.sh
sudo ./test.sh
sudo iptables -nv -L
执行脚本后,此主机将拒绝新建数据的连接。
可以用 telent 命令来验证一下。
telnet localhost 22
iptables 默认规则操作视频:
3. 如何编写脚本
体验了上面一个比较简单的脚本编写后,这里给大家讲解一下如何流程化的编写好一个 iptables 脚本,主要的步骤如下。
3.1 清除表的所有规则
在制定规则前往往需要删除现有的规则。
# 清除规则链中已有的条目
sudo iptables -F
# 清除用户自定义的空链
sudo iptables -X
# 清空链和链中默认规则的计数器
sudo iptables -Z
3.2 载入模块
编写脚本的时候没有用服务的方式来启动 iptables 时,就需要我们手动加载一些模块。常用模块有:
sudo modprobe ip_tables # 启动 iptables
sudo modprobe iptable_nat # 使用 nat 表时载入
sudo modprobe ip_nat_ftp # 在出去的包做了伪装以后,就必须加载该模块,否则防火墙无法知道返回的包该转发到哪里
sudo modprobe ip_conntrack_ftp # 使防火墙能够识别 FTP 某类特殊的返回包
sudo modprobe ip_conntrack # 使防火墙具有连接跟踪能力
sudo modprobe ipt_MASQUERADE # 数据包伪装的作用
可以通过 lsmod 命令来查看加载的模块:
lsmod | grep ip
3.3 设置默认策略
一般情况下搭建防火墙,都会建议拒绝一切数据包接入,往往会把链表的规则都设置为 DROP,实际中也可以根据需要按照如下进行配置。
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
打开 lo 回环,允许 127.0.0.1 这个虚拟网卡上的所有网络流入和流出流量
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
补充:还可以添加前面讲到的默认策略。
sudo iptables -A INPUT -m state --state NEW -j DROP
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3.4 根据需求制定各项规则
默认规则制定完成以后,就可以根据实际需求来建立防火墙的相应规则。
例如 1: 允许服务器 ping 对方主机而不允许对方主机 ping服务器。
sudo iptables -A INPUT -p icmp -–icmp-type 8 -j DROP
sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
例如 2:开放主机对 dns 的访问.
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
3.5 更改权限并执行
主要是对保存的脚本加上x可执行权限。
sudo chmod +x test.sh
以上 5 步就是编写 iptables 的大致步骤,某些部分可以根据实际情况进行删减。
iptables 脚本编写实践操作视频:
4. 脚本编写实例
了解 iptables 默认策略等知识以及流程化编写 iptables 脚本的步骤,下面我们就来实践一下吧!
4.1 实例一
首先,我们制定一个主机上的安全措施的规则,主要是防止 ping flooding 的发生。
$ touch test1.sh
$ vim test1.sh
#!/bin/bash
iptables -F
iptables -F -t nat
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
modprobe ip_conntrack
modprobe iptable_nat
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 这条规则主要是防止 ping 泛洪,并且限制每秒的 ping 包不超过 10 个
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT
说明:limit:速率限制 limit-burst:设置默认阈值
chmod +x test1.sh
sudo ./test1.sh
sudo iptables -nv -L
4.2 实例二
本实例主要制定一些我们常见的端口服务的规则。
$ touch test2.sh
$ vim test2.sh
#!/bin/bash
# 清除规则
iptables -F
iptables -X
iptables -Z
# 设定策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# 设置默认规则,打开环回
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# SSH 的端口,实现远程
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# FTP 服务器,开启 21 端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000:20000 -j ACCEPT
# WEB 服务器,开启 80 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#减少不安全的端口连接
iptables -A OUTPUT -p tcp --sport 31337 -j DROP
iptables -A OUTPUT -p tcp --dport 31337 -j DROP
chmod +x test2.sh
sudo ./test2.sh
sudo iptables -nv -L
5. 总结
通过本实验,可以加深对 iptables 的认识和了解,从实践中再次熟悉 iptables 的作用以及其重要性,由于 iptables 的语法较为复杂并且作为防火墙中的一个重点,希望大家能够将基础务实,一步一个脚印。