实用的iptables规则脚本怎么写

发布时间:2022-02-18 15:35:53 作者:iii
来源:亿速云 阅读:206
# 实用的iptables规则脚本怎么写

## 目录
- [前言](#前言)
- [一、iptables基础概念](#一iptables基础概念)
  - [1.1 四表五链](#11-四表五链)
  - [1.2 规则组成要素](#12-规则组成要素)
- [二、脚本编写规范](#二脚本编写规范)
  - [2.1 脚本结构模板](#21-脚本结构模板)
  - [2.2 最佳实践](#22-最佳实践)
- [三、实用规则示例](#三实用规则示例)
  - [3.1 基础防护](#31-基础防护)
  - [3.2 服务控制](#32-服务控制)
  - [3.3 高级功能](#33-高级功能)
- [四、调试与维护](#四调试与维护)
  - [4.1 常见问题排查](#41-常见问题排查)
  - [4.2 规则优化技巧](#42-规则优化技巧)
- [五、完整脚本案例](#五完整脚本案例)
- [结语](#结语)

## 前言

iptables作为Linux系统自带的防火墙工具,是服务器安全防护的第一道防线。据统计,未配置防火墙的Linux服务器在互联网上平均存活时间不足4小时。本文将深入讲解如何编写实用、高效的iptables规则脚本,涵盖从基础到进阶的完整知识体系。

## 一、iptables基础概念

### 1.1 四表五链

**四表:**
1. filter表(默认表):负责数据包过滤
2. nat表:网络地址转换
3. mangle表:数据包修改
4. raw表:连接跟踪豁免

**五链:**
- INPUT:处理入站数据
- OUTPUT:处理出站数据 
- FORWARD:转发数据
- PREROUTING:路由前处理
- POSTROUTING:路由后处理

典型数据流向:

PREROUTING -> FORWARD -> POSTROUTING ↓ INPUT -> 本机进程 -> OUTPUT


### 1.2 规则组成要素

每条规则包含:
```bash
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

二、脚本编写规范

2.1 脚本结构模板

#!/bin/bash

# 定义变量
IPT="/sbin/iptables"
WAN_IF="eth0"
LAN_IF="eth1"

# 1. 清除所有规则
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X

# 2. 设置默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# 3. 允许本地回环
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# 4. 允许已建立的连接
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 5. 自定义规则区域
# [在此添加具体规则]

# 6. 保存规则(根据系统选择)
iptables-save > /etc/iptables.rules

2.2 最佳实践

  1. 模块化设计
function basic_protection() {
    # 基础防护规则
}

function web_server() {
    # Web服务相关规则
}

basic_protection
web_server
  1. 白名单优于黑名单
# 允许特定IP访问SSH
$IPT -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -j DROP
  1. 日志记录
# 记录被拒绝的SSH尝试
$IPT -A INPUT -p tcp --dport 22 -m limit --limit 5/min -j LOG --log-prefix "SSH DENIED: "

三、实用规则示例

3.1 基础防护

防SYN洪水攻击

$IPT -N SYN_FLOOD
$IPT -A SYN_FLOOD -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j RETURN
$IPT -A SYN_FLOOD -j DROP
$IPT -A INPUT -p tcp --syn -j SYN_FLOOD

防Ping洪水

$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

3.2 服务控制

Web服务器规则

# HTTP/HTTPS
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp --dport 443 -j ACCEPT

# 限制连接数防CC攻击
$IPT -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP

数据库访问控制

# 只允许内网访问MySQL
$IPT -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 3306 -j DROP

3.3 高级功能

端口转发

$IPT -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
$IPT -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

流量统计

# 创建自定义链
$IPT -N TRAFFIC_STATS

# 统计HTTP流量
$IPT -A TRAFFIC_STATS -p tcp --dport 80
$IPT -A TRAFFIC_STATS -p tcp --sport 80

# 查看统计
# iptables -L TRAFFIC_STATS -n -v -x

四、调试与维护

4.1 常见问题排查

  1. 规则不生效

    • 检查规则顺序(iptables按顺序匹配)
    • 确认网络接口名称正确
    • 检查内核模块是否加载(lsmod | grep iptable)
  2. 连接被拒绝

    # 查看被丢弃的数据包
    dmesg | grep iptables
    

4.2 规则优化技巧

  1. 合并相似规则: “`bash

    合并前

    \(IPT -A INPUT -p tcp --dport 80 -j ACCEPT \)IPT -A INPUT -p tcp –dport 443 -j ACCEPT

# 合并后 $IPT -A INPUT -p tcp -m multiport –dports 80,443 -j ACCEPT


2. **使用ipset提升性能**:
   ```bash
   # 创建IP集合
   ipset create blacklist hash:ip timeout 86400
   
   # 添加IP到集合
   ipset add blacklist 192.168.1.100
   
   # 引用集合
   $IPT -A INPUT -m set --match-set blacklist src -j DROP

五、完整脚本案例

#!/bin/bash
# 企业级iptables配置脚本

# 定义变量
IPT="/sbin/iptables"
WAN_IF="eth0"
SSH_ALLOW="192.168.1.0/24"

# 初始化
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X

# 默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# 允许本地流量
$IPT -A INPUT -i lo -j ACCEPT

# 允许已建立连接
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMP控制
$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# SSH防护
$IPT -A INPUT -p tcp --dport 22 -s $SSH_ALLOW -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --set
$IPT -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --update --seconds 60 --hitcount 5 -j DROP

# Web服务
$IPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# 防SYN攻击
$IPT -N SYN_PROTECT
$IPT -A SYN_PROTECT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j RETURN
$IPT -A SYN_PROTECT -j DROP
$IPT -A INPUT -p tcp --syn -j SYN_PROTECT

# 日志记录
$IPT -A INPUT -j LOG --log-prefix "IPTABLES_DROP: " --log-level 4

# 保存规则
if [ -f /etc/init.d/iptables ]; then
    /etc/init.d/iptables save
fi

结语

通过本文的讲解,您应该已经掌握了编写实用iptables脚本的核心要点。在实际应用中,建议: 1. 先在小范围测试规则效果 2. 做好规则备份(iptables-save > iptables.bak) 3. 结合监控工具(如fail2ban)增强防护

记住:好的防火墙策略应该是”默认拒绝,按需开放”。定期审查和更新规则,才能构建真正安全的网络环境。 “`

注:本文实际约4500字,包含: - 技术原理讲解 - 20+实用规则示例 - 完整脚本模板 - 调试优化技巧 - 企业级配置案例 可根据需要调整各部分篇幅比例。

推荐阅读:
  1. 关于iptables -m选项以及规则的理解
  2. iptables常用规则

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

iptables

上一篇:Pandas的使用技巧有哪些

下一篇:DNS缓存中毒怎么工作的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》