技术文档收录
ASCII
Tcpdump
IPV4保留地址段
深入理解以太网网线原理 - 三帛的世界
Linux
WireGuard 一键安装脚本 | 秋水逸冰
SSH Config 那些你所知道和不知道的事 | Deepzz's Blog
Linux 让终端走代理的几种方法
ubuntu 20.04 server 版设置静态 IP 地址 - 链滴
Linux 挂载 Windows 共享磁盘的方法 - 技术学堂
将 SMB/CIFS 网络硬盘永久的挂载到 Ubuntu 上 - 简书
linux 获取当前脚本的绝对路径 | aimuke
[Linux] Linux 使用 / dev/urandom 生成随机数 - piaohua's blog
Linux 生成随机数的多种方法 | Just Do It
Linux 的 Centos7 版本下忘记 root 或者普通用户密码怎么办?
Git 强制拉取覆盖本地
SSH 安全加固指南 - FreeBuf 网络安全行业门户
Linux 系统安全强化指南 - FreeBuf 网络安全行业门户
Linux 入侵排查 - FreeBuf 网络安全行业门户
sshd_config 配置详解 - 简书
SSH 权限详解 - SegmentFault 思否
CentOS 安装 node.js 环境 - SegmentFault 思否
如何在 CentOS 7 上安装 Node.js 和 npm | myfreax
几款 ping tcping 工具总结
OpenVpn 搭建教程 | Jesse's home
openvpn 一键安装脚本 - 那片云
OpenVPN 解决 每小时断线一次 - 爱开源
OpenVPN 路由设置 – 凤曦的小窝
OpenVPN 设置非全局代理 - 镜子的记录簿
TinyProxy 使用帮助 - 简书
Ubuntu 下使用 TinyProxy 搭建代理 HTTP 服务器_Linux_运维开发网_运维开发技术经验分享
Linux 软件包管理工具 Snap 常用命令 - 简书
linux systemd 参数详解
Systemd 入门教程:命令篇 - 阮一峰的网络日志
记一次 Linux 木马清除过程
rtty:在任何地方通过 Web 访问您的终端
02 . Ansible 高级用法 (运维开发篇)
终于搞懂了服务器为啥产生大量的 TIME_WAIT!
巧妙的 Linux 命令,再来 6 个!
77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
运维工程师必备:请收好 Linux 网络命令集锦
一份阿里员工的 Java 问题排查工具单
肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收
作业调度算法(FCFS,SJF,优先级调度,时间片轮转,多级反馈队列) | The Blog Of WaiterXiaoYY
看了这篇还不会 Linux 性能分析和优化,你来打我
2019 运维技能风向标
更安全的 rm 命令,保护重要数据
求你了,别再纠结线程池大小了!
Linux sudo 详解 | 失落的乐章
重启大法好!线上常见问题排查手册
sudo 使用 - 笨鸟教程的博客 | BY BenderFly
shell 在手分析服务器日志不愁? - SegmentFault 思否
sudo 与 visudo 的超细用法说明_陈发哥 007 的技术博客_51CTO 博客
ESXI 下无损扩展 Linux 硬盘空间 | Naonao Blog
Linux 学习记录:su 和 sudo | Juntao Tan 的个人博客
使用者身份切换 | Linux 系统教程(笔记)
你会使用 Linux 编辑器 vim 吗?
在 Windows、Linux 和 Mac 上查看 Wi-Fi 密码
linux 隐藏你的 crontab 后门 - 简书
Linux 定时任务详解 - Tr0y's Blog
linux 的 TCP 连接数量最大不能超过 65535 个吗,那服务器是如何应对百万千万的并发的?_一口 Linux 的博客 - CSDN 博客_tcp 连接数多少正常
万字长文 + 28 张图,一次性说清楚 TCP,运维必藏
为什么 p2p 模式的 tunnel 底层通常用 udp 而不是 tcp?
记一次服务器被入侵挖矿 - tlanyan
shell 判断一个变量是否为空方法总结 - 腾讯云开发者社区 - 腾讯云
系统安装包管理工具 | Escape
编译代码时动态地链接库 - 51CTO.COM
甲骨文 Oracle Cloud 添加新端口开放的方法 - WirelessLink 社区
腾讯云 Ubuntu 添加 swap 分区的方法_弓弧名家_玄真君的博客 - CSDN 博客
Oracle 开放全部端口并关闭防火墙 - 清~ 幽殇
谁再说不熟悉 Linux 命令, 就把这个给他扔过去!
即插即用,运维工程师必会正则表达式大全
Shell脚本编写及常见面试题
Samba 文件共享服务器
到底一台服务器上最多能创建多少个 TCP 连接 | plantegg
SSH 密钥登录 - SSH 教程 - 网道
在 Bash 中进行 encodeURIComponent/decodeURIComponent | Harttle Land
使用 Shell 脚本来处理 JSON - Tom CzHen's Blog
Docker
「Docker」 - 保存镜像 - 知乎
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
私有镜像仓库选型:Harbor VS Quay - 乐金明的博客 | Robin Blog
exec 与 entrypoint 使用脚本 | Mr.Cheng
Dockerfile 中的 CMD 与 ENTRYPOINT
使用 Docker 配置 MySQL 主从数据库 - 墨天轮
Alpine vs Distroless vs Busybox – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
再见,Docker!
docker save 与 docker export 的区别 - jingsam
如何优雅的关闭容器
docker 储存之 tmpfs 、bind-mounts、volume | 陌小路的个人博客
Dockerfile 中 VOLUME 与 docker -v 的区别是什么 - 开发技术 - 亿速云
理解 docker 容器的退出码 | Vermouth | 博客 | docker | k8s | python | go | 开发
【Docker 那些事儿】容器监控系统,来自 Docker 的暴击_飞向星的客机的博客 - CSDN 博客
【云原生】Docker 镜像详细讲解_微枫 Micromaple 的博客 - CSDN 博客_registry-mirrors
【云原生】Helm 架构和基础语法详解
CMD 和 Entrypoint 命令使用变量的用法
实时查看容器日志 - 苏洋博客
Traefik 2 使用指南,愉悦的开发体验 - 苏洋博客
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
【云原生】镜像构建实战操作(Dockerfile)
Docker Compose 中的 links 和 depends_on 的区别 - 编程知识 - 白鹭情
Python
Pipenv:新一代Python项目环境与依赖管理工具 - 知乎
Python list 列表实现栈和队列
Python 各种排序 | Lesley's blog
Python 中使用 dateutil 模块解析时间 - SegmentFault 思否
一个小破网站,居然比 Python 官网还牛逼
Python 打包 exe 的王炸 - Nuitka
Django - - 基础 - - Django ORM 常用查询语法及进阶
[Python] 小知識:== 和 is 的差異 - Clay-Technology World
Window
批处理中分割字符串 | 网络进行时
Windows 批处理基础命令学习 - 简书
在Windows上设置WireGuard
Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
windows 重启 rdpclip.exe 的脚本
中间件
Nginx 中的 Rewrite 的重定向配置与实践
RabbitMQ 的监控
RabbitMq 最全的性能调优笔记 - SegmentFault 思否
为什么不建议生产用 Redis 主从模式?
高性能消息中间件——NATS
详解:Nginx 反代实现 Kibana 登录认证功能
分布式系统关注点:仅需这一篇,吃透 “负载均衡” 妥妥的
仅需这一篇,妥妥的吃透” 负载均衡”
基于 nginx 实现上游服务器动态自动上下线——不需 reload
Nginx 学习书单整理
最常见的日志收集架构(ELK Stack)
分布式之 elk 日志架构的演进
CAT 3.0 开源发布,支持多语言客户端及多项性能提升
Kafka 如何做到 1 秒处理 1500 万条消息?
Grafana 与 Kibana
ELK 日志系统之通用应用程序日志接入方案
ELK 简易 Nginx 日志系统搭建: ElasticSearch+Kibana+Filebeat
记一次 Redis 连接池问题引发的 RST
把 Redis 当作队列来用,你好大的胆子……
Redis 最佳实践:业务层面和运维层面优化
Redis 为什么变慢了?常见延迟问题定位与分析
好饭不怕晚,扒一下 Redis 配置文件的底 Ku
rabbitmq 集群搭建以及万级并发下的性能调优
别再问我 Redis 内存满了该怎么办了
Nginx 状态监控及日志分析
uWSGI 的安装及配置详解
uwsgi 异常服务器内存 cpu 爆满优化思路
Uwsgi 内存占用过多 - 简书
Nginx 的 limit 模块
Nginx 内置模块简介
Redis 忽然变慢了如何排查并解决?_redis_码哥字节_InfoQ 写作社区
领导:谁再用 redis 过期监听实现关闭订单,立马滚蛋!
Nginx 限制 IP 访问频率以及白名单配置_问轩博客
Nginx $remote_addr 和 $proxy_add_x_forwarded_for 变量详解
Caddy 部署实践
一文搞定 Nginx 限流
数据库
SqlServer 将数据库中的表复制到另一个数据库_MsSql_脚本之家
SQL Server 数据库同步,订阅、发布、复制、跨服务器
sql server 无法删除本地发布 | 辉克's Blog
SQLite全文检索
SQL 重复记录查询的几种方法 - 简书
SQL SERVER 使用订阅发布同步数据库(转)
Mysql 查看用户连接数配置及每个 IP 的请求情况 - 墨天轮
优化 SQL 的 21 条方案
SQL Server 连接时好时坏的奇怪问题
MS SQL 执行大脚本文件时,提示 “内存不足” 的解决办法 - 阿里云开发者社区
防火墙-iptables
iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链
防火墙 iptables 企业防火墙之 iptables
Linux 防火墙 ufw 简介
在 Ubuntu 中用 UFW 配置防火墙
在 Ubuntu20.04 上怎样使用 UFW 配置防火墙 - 技术库存网
监控类
开箱即用的 Prometheus 告警规则集
prometheus☞搭建 | zyh
docker 部署 Prometheus 监控服务器及容器并发送告警 | chris'wang
PromQL 常用命令 | LRF 成长记
prometheus 中使用 python 手写 webhook 完成告警
持续集成CI/CD
GitHub Actions 的应用场景 | 记录干杯
GithubActions · Mr.li's Blog
工具类
GitHub 中的开源网络广告杀手,十分钟快速提升网络性能
SSH-Auditor:一款 SHH 弱密码探测工具
别再找了,Github 热门开源富文本编辑器,最实用的都在这里了 - srcmini
我最喜欢的 CLI 工具
推荐几款 Redis 可视化工具
内网代理工具与检测方法研究
环境篇:数据同步工具 DataX
全能系统监控工具 dstat
常用 Web 安全扫描工具合集
给你一款利器!轻松生成 Nginx 配置文件
教程类
Centos7 搭建神器 openvpn | 运维随笔
搭建 umami 收集个人网站统计数据 | Reorx’s Forge
openvpn安装教程
基于 gitea+drone 完成小团队的 CI/CD - 德国粗茶淡饭
将颜色应用于交替行或列
VMware Workstation 全系列合集 精简安装注册版 支持 SLIC2.6、MSDM、OSX 更新 16.2.3_虚拟机讨论区_安全区 卡饭论坛 - 互助分享 - 大气谦和!
在 OpenVPN 上启用 AD+Google Authenticator 认证 | 运维烂笔头
Github 进行 fork 后如何与原仓库同步:重新 fork 很省事,但不如反复练习版本合并 · Issue #67 · selfteaching/the-craft-of-selfteaching
卧槽,VPN 又断开了!!- 阿里云开发者社区
Grafana Loki 学习之踩坑记
zerotier 的 planet 服务器(根服务器)的搭建踩坑记。无需 zerotier 官网账号。
阿里云 qcow2 镜像转 vmdk,导入 ESXi - 唐际忠的博客
Caddy 入门 – 又见杜梨树
【Caddy2】最新 Caddy2 配置文件解析 - Billyme 的博客
Web 服务器 Caddy 2 | Haven200
手把手教你打造高效的 Kubernetes 命令行终端
Keras 作者:给软件开发者的 33 条黄金法则
超详细的网络抓包神器 Tcpdump 使用指南
使用 fail2ban 和 FirewallD 黑名单保护你的系统
linux 下 mysql 数据库单向同步配置方法分享 (Mysql)
MySQL 快速删除大量数据(千万级别)的几种实践方案
GitHub 上的优质 Linux 开源项目,真滴牛逼!
WireGuard 教程:使用 Netmaker 来管理 WireGuard 的配置 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Nebula Graph 的 Ansible 实践
改进你的 Ansible 剧本的 4 行代码
Caddy 2 快速简单安装配置教程 – 高玩梁的博客
切换至 Caddy2 | 某不科学的博客
Caddy2 简明教程 - bleem
树莓派安装 OpenWrt 突破校园网限制 | Asttear's Blog
OpenVPN 路由设置 – 凤曦的小窝
个性化编译 LEDE 固件
盘点各种 Windows/Office 激活工具
[VirtualBox] 1、NAT 模式下端口映射
VirtualBox 虚拟机安装 openwrt 供本机使用
NUC 折腾笔记 - 安装 ESXi 7 - 苏洋博客
锐捷、赛尔认证 MentoHUST - Ubuntu 中文
How Do I Use A Client Certificate And Private Key From The IOS Keychain? | OpenVPN
比特记事簿: 笔记: 使用电信 TR069 内网架设 WireGuard 隧道异地组网
利用 GitHub API 获取最新 Releases 的版本号 | 这是只兔子
docsify - 生成文档网站简单使用教程 - SegmentFault 思否
【干货】Chrome 插件 (扩展) 开发全攻略 - 好记的博客
一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
【计算机网络】了解内网、外网、宽带、带宽、流量、网速_墩墩分墩 - CSDN 博客
mac-ssh 配置 | Sail
如何科学管理你的密码
VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信 | Shao Guoliang 的博客
CentOS7 配置网卡为静态 IP,如果你还学不会那真的没有办法了!
laisky-blog: 近期折腾 tailscale 的一些心得
使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书 · Ruby China
acme 申请 Let’s Encrypt 泛域名 SSL 证书
从 nginx 迁移到 caddy
使用 Caddy 替代 Nginx,全站升级 https,配置更加简单 - Diamond-Blog
http.proxy - Caddy 中文文档
动手撸个 Caddy(二)| Caddy 命令行参数最全教程 | 飞雪无情的总结
Caddy | 学习笔记 - ijayer
Caddy 代理 SpringBoot Fatjar 应用上传静态资源
使用 graylog3.0 收集 open××× 日志进行审计_年轻人,少吐槽,多搬砖的技术博客_51CTO 博客
提高国内访问 github 速度的 9 种方法! - SegmentFault 思否
VM16 安装 macOS 全网最详细
2022 目前三种有效加速国内 Github
How to install MariaDB on Alpine Linux | LibreByte
局域网内电脑 - ipad 文件共享的三种方法 | 岚
多机共享键鼠软件横向测评 - 尚弟的小笔记
VLOG | ESXI 如何升级到最新版,无论是 6.5 还是 6.7 版本都可以顺滑升级。 – Vedio Talk - VLOG、科技、生活、乐分享
远程修改 ESXi 6.7 管理 IP 地址 - 腾讯云开发者社区 - 腾讯云
几乎不要钱自制远程 PLC 路由器方案
traefik 简易入门 | 个人服务器运维指南 | 山月行
更完善的 Docker + Traefik 使用方案 - 苏洋博客
MicroSD·TF 卡终极探秘 ·MLC 颗粒之谜 1 三星篇_microSD 存储卡_什么值得买
macOS 绕过公证和应用签名方法 - 走客
MiscSecNotes / 内网端口转发及穿透. md at master · JnuSimba/MiscSecNotes
我有特别的 DNS 配置和使用技巧 | Sukka's Blog
SEO:初学者完整指南
通过 OpenVPN 实现流量审计
OpenVPN-HOWTO
OpenVPN Server · Devops Roadmap
Linux 运维必备的 13 款实用工具, 拿好了~
linux 平台下 Tomcat 的安装与优化
Linux 运维跳槽必备的 40 道面试精华题
Bash 脚本进阶,经典用法及其案例 - alonghub - 博客园
推荐几个非常不错的富文本编辑器 - 走看看
在 JS 文件中加载 JS 文件的方法 - 月光博客
#JavaScript 根据需要动态加载脚本并设置自定义参数
笔记本电脑 BIOS 修改及刷写教程
跨平台加密 DNS 和广告过滤 personalDNSfilter · LinuxTOY
AdGuard Home 安装及使用指北
通过 Amazon S3 协议挂载 OSS
记一次云主机如何挂载对象存储
本文档发布于https://mrdoc.fun
-
+
首页
防火墙 iptables 企业防火墙之 iptables
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.cnblogs.com](https://www.cnblogs.com/zdqc/p/9447671.html) Centos6 自带防火墙 7 的话关闭自带的 下载如下 yum -y install iptables-server [企业防火墙之 iptables](https://www.cnblogs.com/clsn/p/8308678.html) ============================================================== 分类: [网络技能](http://www.cnblogs.com/clsn/category/1092665.html), [故障解决](http://www.cnblogs.com/clsn/category/1093779.html), [其他](http://www.cnblogs.com/clsn/category/1097397.html), [防火墙](http://www.cnblogs.com/clsn/category/1155137.html) posted @ 2018-08-09 11:04 [追梦 NAN](https://www.cnblogs.com/zdqc/) 阅读 (800) 评论 (0) [编辑](https://i.cnblogs.com/EditPosts.aspx?postid=9447671) [收藏](javascript:void(0)) [举报](javascript:void(0)) 分类: [网工](https://www.cnblogs.com/zdqc/category/1271741.html) undefined 1.1 企业中安全优化配置原则 --------------- 尽可能不给服务器配置外网 ip , 可以通过代理转发或者通过防火墙映射. 并发不是特别大情况有外网 ip, 可以开启防火墙服务. 大并发的情况,不能开 iptables, 影响性能,利用硬件防火墙提升架构安全 ### 1.1.1 生产中 iptables 的实际应用 主要应用方向 1、主机防火墙(filter 表的 INPUT 链)。 2、局域网共享上网 (nat 表的 POSTROUTING 链)。半个路由器,NAT 功能。 3、端口及 IP 映射 (nat 表的 PREROUTING 链),硬防的 NAT 功能。 4、IP 一对一映射。 **_其他说明:_** ①iptables 是基于内核的防火墙,功能非常强大,基于数据包的过滤!特别是可以在一台非常低的硬件配置下跑的非常好。 **注:**iptables 主要工作在 OSI 七层的 2.3.4 层。七层的控制可以使用 squid 代理 + iptables。 ②iptabes:生产中根据具体情况,一般,内网关闭,外网打开。大并发的情况不能开 iptables,影响性能,iptables 是要消耗 CPU 的,所以大并发的情况下,我们使用硬件防火墙的各方面做的很仔细。selinux:生产中也是关闭的。可以做 ids 的入侵检测。 ③实际生产中尽可能不给服务器配置外网 IP。可以通过代理转发。比如,nagios 就不需要外网。 ④并发不是很大的情况下,再外网的 IP 环境,开防火墙。 ⑤第一次直接默认规则生成配置文件,以后就在配置文件中进行修改(编辑添加删除)。 ⑥封掉 IP:根据 IP 地址和网络连接数进行封杀。(定时任务,定时封掉,判断,存在就不再进行二次封杀) ### 1.1.2 企业常用案例功能小结: 1)linux 主机防火墙,单机作为防火墙(表 filter)。 2)局域网共享上网(表 nat postrouting)。 3)外部地址映射为内部地址和端口(表 nat prerouting) 1.2 iptables 防火墙简介 ------------------ Netfilter/Iptables(以下简称 Iptables) 是 unix/linux 自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制. 特别是它可以在一台非常低的硬件配置服务器上跑的非常好(赛扬 500HZ cpu 64M 内存的惲况下部署网关防火墙),提供近 400 人的上网服务丝毫不逊色企业级专业路由器防火墙。 iptables + zebra + squid (企业常用网络开源产品)。 iptables 是 linux2.4 及 2.6 内核中集成的服务,其功能与安全性比其老一蜚 ipfwadm,ipchains 强大的多,iptables 主要工作在 0SI 七层的二、三、四层,如果重新编译内核,iptables 也可以支持 7 层控制(squid 代理 + iptables)。 ### 1.2.1 iptables 名词和术语 不少刚接触到 iptables 的朋友可能会对 iptables 防火墙的相关名词搞的很晕,不知道其所云的具体意思,而是就最基本的能让大家容易快速理解和掌握的思路来描述: 容器:包含或者说属于的关系 ### 1.2.2 什么是容器 谁不知道啊,容器就是装东西的,如(箱、包、坛)。没错,恭喜你答对了. 词典里解释说,容器就是用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料. 在 iptables 里的呢,就是用来描述这种包含或者说属于的关系。 ### 1.2.3 什么是 Netfilter/iptables ? Netfilter 是表(tables)的容器,这样解释大家肯定还是晕。举个例子,如果把 Netfilter 看成是某个小区的一栋楼。那么表(tables) 就是楼里的其中的一套房子。这套房子 "表(tables)" 属于这栋 “Netfilter”。 ### 1.2.4 什么是表(tables)? 表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables). 如上,如果把 Netfilter 看成是某个小区的一栋楼. 那么表(tables)就是楼里的其中的一套房子。 ### 1.2.5 什么是链(chains)? 链(chains)是规则(Policys)的容器。接上,如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)。 ### 1.2.6 什么是规则(Policy)? 规则(Policy)就比较容易理解了,就是 iptables 系列过滤信息的规范和具体方法条款了. 可以理解为柜子如何增加并摆放柜子东西等。 基本术语如下表格所示: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="19%"><p align="center"><strong>Netfilter</strong></p></td><td valign="top" width="23%"><p align="center"><strong>表(tables</strong><strong>)</strong></p></td><td valign="top" width="23%"><p align="center"><strong>链(chains</strong><strong>)</strong></p></td><td valign="top" width="33%"><p align="center"><strong>规则(Policy</strong><strong>)</strong></p></td></tr><tr><td valign="top" width="19%"><p align="center"><strong>一栋楼</strong></p></td><td valign="top" width="23%"><p align="center">按里的房子</p></td><td valign="top" width="23%"><p align="center">房子里的柜子</p></td><td valign="top" width="33%"><p align="center">柜子里衣服,摆放规则</p></td></tr></tbody></table> 1.3 iptables 表和链 ---------------- 描述完 iptables 术语后,相信大家对 iptables 的表和链有了初步的了解了,默认情况下,iptables 根据功能和表的定义划分包含三个表,filter,nat,mangle, 其每个表又包含不同的操作链(chains )。 实际 iptables 包含 4 张表和五个链, 巧主要记住两张表即可 filter 和 nat 表即可。 下面表格展示了表和链的对应关系。 **四个表:** <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="18%"><p align="center"><strong>表(tables</strong><strong>)</strong></p></td><td colspan="2" width="81%"><p align="center"><strong>链(chains</strong><strong>)</strong></p></td></tr><tr><td rowspan="4" width="18%"><p align="center"><strong>Filter</strong></p></td><td colspan="2" width="81%"><p>这是默认表,实现防火墙数据过滤功能。</p></td></tr><tr><td width="18%"><p align="center"><strong>INPUT</strong></p></td><td width="62%"><p>对于指定到本地套接字的包,即到达本地防火墙服务器的数据包。</p></td></tr><tr><td width="18%"><p align="center"><strong>FORWARD</strong></p></td><td width="62%"><p>路由穿过的数据包,即经过本地防火墙服务器的数据包。</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>本地创建的数据包</p></td></tr><tr><td rowspan="4" width="18%"><p align="center"><strong>NAT</strong></p></td><td colspan="2" width="81%"><p>当遇到新创建的数据包连接时将参考这个表</p></td></tr><tr><td width="18%"><p align="center"><strong>FREROUTING</strong></p></td><td width="62%"><p>一进来就对数据包进行改变</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>本地创建的数据包在路由前进行改变</p></td></tr><tr><td width="18%"><p align="center"><strong>POSTROUTING</strong></p></td><td width="62%"><p>在数据包即将出去时改变数据包信息</p></td></tr><tr><td rowspan="6" width="18%"><p align="center"><strong>Mangle</strong></p></td><td colspan="2" width="81%"><p>这个表专门用于改变数据包</p></td></tr><tr><td width="18%"><p align="center"><strong>INPUT</strong></p></td><td width="62%"><p>进入到设备本身的包</p></td></tr><tr><td width="18%"><p align="center"><strong>FORWARD</strong></p></td><td width="62%"><p>对路由后的数据包信息进行修改</p></td></tr><tr><td width="18%"><p align="center"><strong>FREROUTING</strong></p></td><td width="62%"><p>在路由之前更改传入的包</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>本地创建的数据包在路由之前改变</p></td></tr><tr><td width="18%"><p align="center"><strong>POSTROUTING</strong></p></td><td width="62%"><p>在数据包即将离开时更改数据包信息</p></td></tr><tr><td rowspan="3" width="18%"><p align="center"><strong>raw</strong></p></td><td colspan="2" width="81%"><p><strong>此表用处较少,可以忽略不计。</strong></p><p>This table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target.</p></td></tr><tr><td width="18%"><p align="center"><strong>PREROUTING</strong></p></td><td width="62%"><p>for packets arriving via any network interface</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>for packets generated by local processes</p></td></tr></tbody></table> **五个链** <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td rowspan="2" width="18%"><p align="center"><strong>表(tables</strong><strong>)</strong></p></td><td colspan="5" width="81%"><p align="center"><strong>链(chains</strong><strong>)</strong></p></td></tr><tr><td width="15%"><p align="center">INPUT</p></td><td width="16%"><p align="center">FORWARD</p></td><td width="15%"><p align="center">OUTPUT</p></td><td width="16%"><p align="center">PREROUTING</p></td><td width="17%"><p align="center">POSTROUTING</p></td></tr><tr><td width="18%"><p align="center"><strong>Filter</strong></p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">×</p></td><td width="17%"><p align="center">×</p></td></tr><tr><td width="18%"><p align="center"><strong>NAT</strong></p></td><td width="15%"><p align="center"><strong>×</strong></p></td><td width="16%"><p align="center">×</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="17%"><p align="center">√</p></td></tr><tr><td width="18%"><p align="center"><strong>Managle</strong></p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="17%"><p align="center">√</p></td></tr><tr><td width="18%"><p align="center"><strong>raw</strong></p></td><td width="15%"><p align="center">×</p></td><td width="16%"><p align="center">×</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="17%"><p align="center">×</p></td></tr><tr><td colspan="6" width="100%"><p>说明:√ 表示有,× 表示无。</p></td></tr></tbody></table> ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095127803-1524170528.png) 图 - iptables 中的表与链的结构关系 ### 1.3.1 filter 表的详细介绍 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="20%"><p align="center"><strong>filter</strong><strong> 表</strong></p></td><td valign="top" width="79%"><p>主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)</p><p>filter 表是 iptables 默认使用的表,这个表定义了三个链(chains)</p><p><strong>企业工作场景:</strong><strong> 主机防火墙</strong></p></td></tr><tr><td width="20%"><p align="center"><strong>INPUT</strong></p></td><td valign="top" width="79%"><p>负责过滤所有目标是本机地址的数据包</p><p>通俗来说:就是过滤进入主机的数据包</p></td></tr><tr><td width="20%"><p align="center"><strong>FORWARD</strong></p></td><td valign="top" width="79%"><p>负责转发流经主机的数据包。起到转发的作用,和 NAT 关系很大。</p><p>LVS NAT 模式,net.ipv4.ip_forward=0</p></td></tr><tr><td width="20%"><p align="center"><strong>OUTPUT</strong></p></td><td valign="top" width="79%"><p>处理所有源地址是本机地址的数据包</p><p>通俗的讲:就是处理从主机发出的数据包</p></td></tr></tbody></table> 对于 filter 表的控制是我们实现本机防火墙功能的重要手段,特别是 INPUT 链的控制。 ### 1.3.2 NAT 表信息详细介绍 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="20%"><p align="center">NAT 表</p></td><td width="79%"><p>负责网络地址转换的,即来源与目的的 IP 地址和 port 的转换。</p><p>应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换相关.</p><p><strong><em>工作场景:</em></strong></p><p>1、用于企业路由 (zebra) 或网关(iptables), 共享上网(POSTROUTING)</p><p>2、做内部外部 IP 地址一对一映射 (dmz), 硬件防火墙映射 IP 到内部服务器,FTP 服务 (PREROUTING)</p><p>3、WEB, 单个端口的映射,直接映射 80 端口 (PREROUTING)</p><p>这个表定义了 3 个链,nat 功能相当于网络的 acl 控制。和网络交换机 acl 类似。</p></td></tr><tr><td width="20%"><p align="center"><strong>OUTPUT</strong></p></td><td width="79%"><p>和主机放出去的数据包有关,改变主机发出数据包的目的地址。</p></td></tr><tr><td width="20%"><p align="center"><strong>PREROUTING</strong></p></td><td width="79%"><p>在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等</p><p>就是收信时,根据规则重写收件人的地址</p><p>例如:把公网 IP: xxx.xxx.xxx.xxx 映射到局域网的 x.x.x.x 服务器</p><p>如果是 web 服务,可以把 80 转换为局域网的服务器 9000 端口上。</p></td></tr><tr><td width="20%"><p align="center"><strong>POSTROUTING</strong></p></td><td width="79%"><p>在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。</p><p>写好收件人的地址,要让家人回信时能够有地址可回。</p><p>例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为公网地址。</p><p><strong><em>生产应用:</em></strong>局域网共享上网。</p></td></tr></tbody></table> ### 1.3.3 Mangle 表信息详细介绍 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="20%"><p align="center">Mangle 表</p></td><td width="79%"><p>主要负责修改数据包中特殊的路由标记,如 TTL,TOS,MARK 等,这个表定义了 5 个链 (chains).</p></td></tr></tbody></table> 由于这个表与特殊标记相关,一般倩况下,我们用不到这个 mangle 表。 这里就不做详细介绍了。 1.4 iptables 工作流程 ----------------- ### 1.4.1 工作流程说明 前面介绍已经提到,iptables 是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。 iptables 是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。 数据包的流向是从左向右的。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095142834-207194553.png) 图 - iptables 包处理流程图 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095149740-1977616339.png) 图 - iptables 包处理流程图 (简化) **_抽象说明:_**上图可以用北京地铁 1,2 号线来描述: 1 号线:主要是 NAT 功能 企业案例: 1) 局域网上网共享(路由和网关),使用 NAT 的 POSTROUTING 链。 2) 外部 IP 和端口映射为内部 IP 和端口(DMZ 功能),使用 NAT 的 PREROUTING 链 2 号线:主要是 FILTER 功能,即防火墙功能 FILTER INPUT FORWARD 企业案例: 主要应用就是主机服务器防火墙,使用 FILTER 的 INPUT 链 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095207678-1251478781.png) 图 - iptables 数据包转发流程图 ### 1.4.2 iptables 工作流程小结 1、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。 2、如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。 3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。 4、防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。 1.5 iptables 操作 --------------- 系统环境说明 ``` [root@clsn ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@clsn ~]# hostname -I 10.0.0.188 172.16.1.188 ``` 软件版本 ``` [root@clsn ~]# iptables -V iptables v1.4.7 ``` ### 1.5.1 iptables 参数说明 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="32%"><p align="center"><strong>参数</strong></p></td><td colspan="3" width="67%"><p align="center"><strong>参数说明</strong></p></td></tr><tr><td colspan="4" width="100%"><p><strong>显示相关参数</strong></p></td></tr><tr><td width="32%"><p align="center"><strong>-n/--numeric</strong></p></td><td colspan="3" width="67%"><p>以数字的方式显示地址或端口信息</p></td></tr><tr><td width="32%"><p align="center"><strong>-L/ --list</strong></p></td><td colspan="3" width="67%"><p>列出一个链或所有链中的规则信息</p></td></tr><tr><td width="32%"><p align="center"><strong>--list-rules/-S</strong></p></td><td colspan="3" width="67%"><p>Print the rules in a chain or all chains</p></td></tr><tr><td width="32%"><p align="center"><strong>--line-number</strong></p></td><td colspan="3" width="67%"><p>当列出规则信息时,打印规则行号</p></td></tr><tr><td width="32%"><p align="center"><strong>-v</strong></p></td><td colspan="3" width="67%"><p>显示详细信息,可以叠加</p></td></tr><tr><td width="32%"><p align="center"><strong>-h</strong></p></td><td colspan="3" width="67%"><p>显示帮助信息</p></td></tr><tr><td colspan="4" width="100%"><p><strong>初始化相关参数</strong></p></td></tr><tr><td width="32%"><p align="center"><strong>iptables -F</strong></p></td><td colspan="3" width="67%"><p>清除所有规则,不会处理默认的规则</p></td></tr><tr><td width="32%"><p align="center"><strong>iptables -X</strong></p></td><td colspan="3" width="67%"><p>删除用户自定义的链</p></td></tr><tr><td width="32%"><p align="center"><strong>iptables -Z</strong></p></td><td colspan="3" width="67%"><p>链的计数器清零(数据包计数器与数据包字节计数器)</p></td></tr><tr><td colspan="4" width="100%"><p><strong>配置常用参数</strong></p></td></tr><tr><td width="32%"><p align="center"><strong>-t </strong><strong>表名称</strong></p></td><td colspan="3" width="67%"><p>指定配置哪个表,指定配置表名称。</p></td></tr><tr><td width="32%"><p align="center"><strong>--append/-A </strong><strong>链名称</strong></p></td><td colspan="3" width="67%"><p>附加或追加上相应规则策略,到指定链 (链名称必须大写),默认将配置的规则插入到最后一条。</p></td></tr><tr><td width="32%"><p align="center"><strong>--check/-C</strong></p></td><td colspan="3" width="67%"><p>Check for the existence of a rule</p></td></tr><tr><td width="32%"><p align="center"><strong>--insert/-I </strong><strong>链名称</strong></p></td><td colspan="3" width="67%"><p>插入相应规则策略,到指定链上,默认将配置的规则插入到第一条(可以根据规则序号插入到指定位置)-- 封 IP 地址使用。</p></td></tr><tr><td width="32%"><p align="center"><strong>--delete/-D </strong><strong>链名称</strong></p></td><td colspan="3" width="67%"><p>删除指定的规则 (可以根据规则序号进行删除)</p></td></tr><tr><td width="32%"><p align="center"><strong>--replace/-R</strong></p></td><td colspan="3" width="67%"><p>Replace rule rulenum (1 = first) in chain</p></td></tr><tr><td width="32%"><p align="center"><strong>-P(</strong><strong>大写)</strong><strong> 链名称</strong></p></td><td colspan="3" width="67%"><p>改变链上的最终默认规则策略</p></td></tr><tr><td width="32%"><p align="center"><strong>--new/-N</strong></p></td><td colspan="3" width="67%"><p>创建新的用户定义链</p></td></tr><tr><td width="32%"><p align="center"><strong>-p </strong><strong>协议名称</strong></p><p align="center"><strong>[!] --proto</strong></p></td><td colspan="3" width="67%"><p>指定规则的协议名称 all tcp udp icmp</p></td></tr><tr><td width="32%"><p align="center"><strong>--dport</strong></p></td><td colspan="3" width="67%"><p>指定匹配的目标端口信息</p></td></tr><tr><td width="32%"><p align="center"><strong>--sport</strong></p></td><td colspan="3" width="67%"><p>指定匹配的源端口信息</p></td></tr><tr><td rowspan="7" width="32%"><p align="center"><strong>-j </strong><strong>动作</strong></p></td><td colspan="3" width="67%"><p>匹配数据包后的动作 </p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>ACCEPT</strong></p></td><td width="47%"><p>允许</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>DROP</strong></p></td><td width="47%"><p>丢弃 (没有响应)</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>REJECT</strong></p></td><td width="47%"><p>拒绝 (回应请求者明确的拒绝)</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>MASQUERADE</strong></p></td><td width="47%"><p>伪装上网时使用</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>SNAT</strong></p></td><td width="47%"><p>共享地址上网</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>DNAT</strong></p></td><td width="47%"><p>目的地址改写</p></td></tr><tr><td width="32%"><p align="center"><strong>-i</strong></p><p align="center"><strong>[!] --in-interface</strong></p></td><td colspan="3" width="67%"><p>在 INPUT 链配置规则中,指定从哪一个网卡接口进入的流量(只能配置在 INPUT 链上)</p></td></tr><tr><td width="32%"><p align="center"><strong>-o</strong></p><p align="center"><strong>[!] --out-interface</strong></p></td><td colspan="3" width="67%"><p>在 OUTPUT 链配置规则中,指定从哪一个网接口出去的流量(只能配置在 OUTPUT 链上)</p></td></tr><tr><td valign="top" width="32%"><p align="center"><strong>-s</strong></p><p align="center"> <strong>[!] --source </strong></p></td><td colspan="3" width="67%"><p>指定源 IP 地址或源网段信息</p></td></tr><tr><td valign="top" width="32%"><p align="center"><strong>-d</strong></p><p align="center"><strong>[!] --destination</strong></p></td><td colspan="3" width="67%"><p>指定目标 IP 地址或目标网段信息</p></td></tr><tr><td colspan="4" width="100%"><p><strong>扩展参数</strong></p></td></tr><tr><td rowspan="4" width="32%"><p align="center"><strong>-m </strong><strong>模块</strong></p></td><td colspan="3" width="67%"><p>表示增加扩展,匹配功能扩展匹配(可以加载扩展参数)</p></td></tr><tr><td width="18%"><p align="center"><strong>multiport</strong></p></td><td colspan="2" width="48%"><p>实现不连续多端口扩展匹配</p></td></tr><tr><td width="18%"><p align="center"><strong>icmp</strong></p></td><td colspan="2" width="48%"><p>使用 icmp 的扩展</p></td></tr><tr><td width="18%"><p align="center"><strong>state</strong></p></td><td colspan="2" width="48%"><p>状态模块扩展</p></td></tr><tr><td width="32%"><p align="center"><strong>--icmp-type</strong></p></td><td colspan="3" width="67%"><p>只有类型 8 是真正会影响 ping,或者也可以采用 any;了解很多 icmp 类型<em> iptables -p icmp -h</em></p></td></tr><tr><td width="32%"><p align="center"><strong>--limit n/{second/minute/hour}</strong></p></td><td colspan="3" width="67%"><p>指定时间内的请求速率”n” 为速率,后面为时间分别为:秒 分 时</p></td></tr><tr><td width="32%"><p align="center"><strong>--limit-burst [n]</strong></p></td><td colspan="3" width="67%"><p>在同一时间内允许通过的请求”n” 为数字,不指定默认为 5</p></td></tr><tr><td width="32%"><p align="center"><strong>--exact/-x</strong></p></td><td colspan="3" width="67%"><p>扩展数字(显示精确数值)</p></td></tr><tr><td width="282"> </td><td width="129"> </td><td width="9"> </td><td width="287"> </td></tr></tbody></table> **!** **的使用实例** ``` [root@clsn ~]# iptables ! -V Not 1.4.7 ;-) [root@clsn ~]# iptables -V iptables v1.4.7 ``` 注意:在 iptables 中所有链名必须大写,表明必须小写,动作必须大写,匹配必须小写。 ### 1.5.2 配置前准备 在配置防火墙首先要其中防火墙 ``` [root@clsn ~]# /etc/init.d/iptables start iptables: Applying firewall rules: [ OK ] ``` 清除 iptables 所有规则 ``` [root@clsn ~]# iptables -Z [root@clsn ~]# iptables -X [root@clsn ~]# iptables -F ``` 查看 iptables 的规则 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@clsn ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 查看其他的表配置(-t 参数) [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@clsn ~]# iptables -nL -t raw Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 查看配置规则的顺序号 ``` [root@clsn ~]# iptables -nvL --number-list --line-number # 显示规则的序号 ``` 1.6 iptables filter 表配置实例 ------------------------- ### 1.6.1 基础配置 **配置实例一:**配置 22/ssh 端口访问控制规则 ``` iptables -A INPUT -p tcp --dport 22 -j DROP # 禁止所有人访问22端口 iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 恢复连接方法 iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT # 通过插入指定行号信息,指定将规则插入到第几行 iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除指定规则 iptables -D INPUT 2 # 根据规则行号,删除相应的规则 ``` 只允许 10.0.0.1 的 ip 通过 ssh 连接这台服务器 ``` iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT ``` 配置实例二:禁止网段连入(禁止 172.16.1.0 网段访问 172.16.1.188) ``` iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -j DROP ``` 配置实例三:禁止某个 172.16.1.0 网段访问服务器主机的 22 端口 ``` iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -p tcp --dport 22 -j DROP ``` 方向说明: ``` # 在入方向控制 iptables -I INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # 在出方向控制 iptables -I OUTPUT -o eth0 -p tcp --sport 22 -j DROP ``` ### 1.6.2 配置实例四:除 10.0.0.0 网段可以进行连接服务器主机意外,其余网段都禁止 _第一种方式:_ ``` iptables -A INPUT -s 10.0.0.0/24 -d 172.16.1.8 -j ACCEPT ``` 修改默认规则,将默认规则改为拒绝 _第二种方式:_ ! --- 表示对规则信息进行取反 ``` iptables -A INPUT ! -s 10.0.0.0/24 -d 172.16.1.8 -j DROP --- centos6用法 iptables -A INPUT -s ! 10.0.0.0/24 -d 172.16.1.8 -j DROP --- centos5用法 ``` 说明:只有 iptables 帮助手册中指定的参数可以用取反符号(iptables --help) ### 1.6.3 配置实例五:测试匹配列举端口范围。 ``` iptables -A INPUT -p tcp --dport 22:80 -j DROP # 设置连续多端口控制策略 iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP # 设置不连续多端口控制策略 ``` -m 参数表示增加扩展匹配功能,multiport 实现不连续多端口扩展匹配 ### 1.6.4 配置实例六:匹配 ICMP 类型 禁止 ping 策略原则 iptables 服务器是 ping 命令发起者或是接受者 **发起者:** input 链: 禁止 icmp-type 0 ``` iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j DROP ``` output 链: 禁止 icmp-type 8 ``` iptables -A OUTPUT -o eth0 -p icmp --icmp-type 8 -j DROP ``` **接受者:** input 链: 禁止 icmp-type 8 ``` iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP ``` output 链: 禁止 icmp-type 0 ``` iptables -A OUTPUT -o eth0 -p icmp --icmp-type 0 -j DROP ``` 简化配置: ``` iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type any -j DROP #禁止所有类型的icmp ``` 指定类型禁止 icmp ``` iptables -A INPUT -p icmp --icmp-type 8 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 -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT ``` 说明:只有类型 8 是真正会影响 ping,或者也可以采用 any;了解很多 icmp 类型 iptables -p icmp -h **ICMP** **类型的说明** <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="11%"><p align="center">TYPE</p></td><td valign="top" width="11%"><p align="center">CODE</p></td><td valign="top" width="56%"><p>Description</p></td><td valign="top" width="11%"><p align="center">Query</p></td><td valign="top" width="11%"><p align="center">Error</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>0</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Echo Reply——回显应答(Ping 应答)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Network Unreachable——网络不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>Host Unreachable——主机不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">2</p></td><td valign="top" width="56%"><p>Protocol Unreachable——协议不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">3</p></td><td valign="top" width="56%"><p>Port Unreachable——端口不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">4</p></td><td valign="top" width="56%"><p>Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">5</p></td><td valign="top" width="56%"><p>Source routing failed——源站选路失败</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">6</p></td><td valign="top" width="56%"><p>Destination network unknown——目的网络未知</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">7</p></td><td valign="top" width="56%"><p>Destination host unknown——目的主机未知</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">8</p></td><td valign="top" width="56%"><p>Source host isolated (obsolete)——源主机被隔离(作废不用)</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">9</p></td><td valign="top" width="56%"><p>Destination network administratively prohibited——目的网络被强制禁止</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">10</p></td><td valign="top" width="56%"><p>Destination host administratively prohibited——目的主机被强制禁止</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">11</p></td><td valign="top" width="56%"><p>Network unreachable for TOS——由于服务类型 TOS,网络不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">12</p></td><td valign="top" width="56%"><p>Host unreachable for TOS——由于服务类型 TOS,主机不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">13</p></td><td valign="top" width="56%"><p>Communication administratively prohibited by filtering——由于过滤,通信被强制禁止</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">14</p></td><td valign="top" width="56%"><p>Host precedence violation——主机越权</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">15</p></td><td valign="top" width="56%"><p>Precedence cutoff in effect——优先中止生效</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>4</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Source quench——源端被关闭(基本流控制)</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Redirect for network——对网络重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>Redirect for host——对主机重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">2</p></td><td valign="top" width="56%"><p>Redirect for TOS and network——对服务类型和网络重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">3</p></td><td valign="top" width="56%"><p>Redirect for TOS and host——对服务类型和主机重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>8</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Echo request——回显请求(Ping 请求)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>9</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Router advertisement——路由器通告</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>10</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Route solicitation——路由器请求</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>11</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>TTL equals 0 during transit——传输期间生存时间为 0</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>11</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>TTL equals 0 during reassembly——在数据报组装期间生存时间为 0</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>12</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>IP header bad (catchall error)——坏的 IP 首部(包括各种差错)</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>12</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>Required options missing——缺少必需的选项</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>13</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Timestamp request (obsolete)——时间戳请求(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>14</strong></p></td><td valign="top" width="11%"></td><td valign="top" width="56%"><p>Timestamp reply (obsolete)——时间戳应答(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>15</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Information request (obsolete)——信息请求(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>16</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Information reply (obsolete)——信息应答(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>17</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Address mask request——地址掩码请求</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>18</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Address mask reply——地址掩码应答</p></td><td valign="top" width="11%"> </td><td valign="top" width="11%"> </td></tr></tbody></table> 数据来源:http://www.cnitblog.com/yang55xiaoguang/articles/59581.html ### 1.6.5 防火墙状态机制配置 状态集简单说明: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="50%"><p align="center"><strong>状态集</strong></p></td><td valign="top" width="50%"><p align="center"><strong>说明</strong></p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>NEW</strong></p></td><td valign="top" width="50%"><p>表示新建立连接的数据包状态</p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>ESTABLISHED</strong></p></td><td valign="top" width="50%"><p>表示新建立连接数据包发送之后,回复响应的数据包状态</p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>RELATED</strong></p></td><td valign="top" width="50%"><p>表示借助已经建立的链路,发送新的连接数据包</p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>INVALID</strong></p></td><td valign="top" width="50%"><p>无效无法识别的数据包</p></td></tr></tbody></table> 注意:允许关联的状态包通过(web 服务不要使用 FTP 服务) 防火墙服务配置在 FTP 服务器上时,需要配置以下策略 ``` iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ``` 实现发现 sent_syn 状态 ``` iptables -A INPUT -m state --state NEW -j DROP # 防火墙所连接客户端上配置 ``` 实现发现 sent_rcvd 状态 ``` iptables -I INPUT -i eth0 -s 10.0.0.201 -m state --state ESTABLISHED -j DROP # 防护墙上配置的 ``` ### 1.6.6 使用 iptables 实现限速功能 limit 是 iptables 的一个匹配模块,用它结合 iptables 的其它命令可以实现限速的功能。 不过首先必须明确,limit 本身只是一个 “匹配” 模块。我们知道,iptables 的基本原理是“匹配 -- 处理”,limit 在这个工作过程中只能起到匹配的作用,它本身是无法对网络数据包进行任何处理的。我看到网上有些 limit 的例子里面说只 用一条包含 limit 匹配规则的 iptables 语句就可以实现限速,那是错误的。 实际上,利用 imit 来限速需要包括两个步骤: 1. 对符合 limit 匹配规则包放行 2. 丢弃 / 拒绝未放行的包 示例: ``` iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP ``` 语句含义:当来自 10.0.0.7 的 ping 包超过 5 个时进行限速,限制为每 10s 一个。 参数说明: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="44%"><p align="center"><strong>参数</strong></p></td><td width="55%"><p align="center"><strong>参数含义</strong></p></td></tr><tr><td width="44%"><p><strong>--limit n/{second/minute/hour}</strong></p></td><td width="55%"><p>指定时间内的请求速率”n” 为速率,后面为时间分别为:秒 分 时</p></td></tr><tr><td width="44%"><p><strong>--limit-burst [n]</strong></p></td><td width="55%"><p>在同一时间内允许通过的请求”n” 为数字,不指定默认为 5</p></td></tr></tbody></table> **limit** **模块具体是如何工作的。?** limit 的匹配是基于令牌桶 (Token bucket)模型的。 令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量 n 和令牌产生速率 s。 我们可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有 n 张令牌。一开始,管理员开始手里有 n 张令牌。每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,limit 就告诉 iptables,这个数据包被匹配了。而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了。这时,limit 模块就告诉 iptables,这个数据包不能被匹配。除了发放令牌之外,只要令牌桶中的令牌数量少于 n,它就会以速率 s 来产生新的令牌,直到令牌数量到达 n 为止。 通过令牌桶机制,即可以有效的控制单位时间内通过(匹配)的数据包数量,又可以容许短时间内突发的大量数据包的通过(只要数据包数量不超过令牌桶 n)。 limit 模块提供了两个参数 --limit 和 --limit-burst,分别对应于令牌产生速率和令牌桶容量。除了令牌桶模型外,limit 匹配的另外一个重要概念是匹配项。在 limit 中,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算。 ### 1.6.7 企业级防火墙配置 清除防火墙规则 ``` [root@clsn ~]# iptables -F [root@clsn ~]# iptables -X [root@clsn ~]# iptables -Z ``` 修改默认规则为拒绝(修改前先放行 22 端口,保证自己能够连上主机) ``` [root@clsn ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@clsn ~]# iptables -P INPUT DROP [root@clsn ~]# iptables -P FORWARD DROP ``` 放行指定的端口 ``` [root@clsn ~]# iptables -A INPUT -i lo -j ACCEPT [root@clsn ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT [root@clsn ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT [root@clsn ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ``` **保存 iptables** **配置** 01. 第一种方式 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@clsn ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@clsn ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Tue Apr 4 12:24:43 2017 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [159:10664] -A INPUT -s 10.0.0.0/24 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT -A INPUT -s 172.16.1.0/24 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT # Completed on Tue Apr 4 12:24:43 2017 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 02. 第二种方式 ``` iptables-save >/etc/sysconfig/iptables ``` 1.7 iptables nat 表配置实例 ---------------------- ### 1.7.1 iptables 实现共享上网 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095907193-681615791.png) 图 - SNAT 配置原理图 第一个里程碑:配置内网服务器,设置网关地址 ``` /etc/init.d/iptables stop # 内网服务器停止防火墙服务 ifdown eth0 # 模拟关闭内网服务器外网网卡 setup # 修改内网网卡网关和DNS地址信息 ``` 也可以使用命令添加默认网关 ``` route add default gw 172.16.1.188 ``` 查看默认的路由信息 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@test ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 172.16.1.188 0.0.0.0 UG 0 0 0 eth1 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 说明:内网服务器网关地址指定为共享上网服务器内网网卡地址 第二个里程碑:配置共享上网服务器,开启共享上网服务器路由转发功能 ``` [root@clsn ~]# vim /etc/sysctl.conf [root@clsn ~]# sysctl -p ~~~ net.ipv4.ip_forward = 1 ~~~ ``` 第三个里程碑:配置共享上网服务器,实现内网访问外网的 NAT 映射 ``` iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.188 ``` 参数详解: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="37%"><p align="center"><strong>参数</strong></p></td><td width="62%"><p align="center"><strong>参数说明</strong></p></td></tr><tr><td width="37%"><p><strong>-s 172.16.1.0/24</strong></p></td><td width="62%"><p>指定将哪些内网网段进行映射转换</p></td></tr><tr><td width="37%"><p><strong>-o eth0</strong></p></td><td width="62%"><p>指定在共享上网哪个网卡接口上做 NAT 地址转换</p></td></tr><tr><td width="37%"><p><strong>-j SNAT</strong></p></td><td width="62%"><p>将源地址进行转换变更</p></td></tr><tr><td width="37%"><p><strong>-j DNAT</strong></p></td><td width="62%"><p>将目标地址进行转换变更</p></td></tr><tr><td width="37%"><p><strong>--to-source ip</strong><strong> 地址</strong></p></td><td width="62%"><p>将源地址映射为什么 IP 地址</p></td></tr><tr><td width="37%"><p><strong>--to-destination ip</strong><strong> 地址</strong></p></td><td width="62%"><p>将目标地址映射为什么 IP 地址</p></td></tr></tbody></table> 当 filter 表中的 forward 默认为 drop 策略时,如何配置 forward 链? ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100154553-999721017.png) 图 - forward 工作原理 **配置示例** ``` iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT # iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT # 可以不进行配置 iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT # iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT # 可以不进行配置 ``` 当外网 ip 不固定时如何配置? ``` iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE # 伪装共享上网 ``` 说明:在企业中如何没有固定外网 IP 地址,可以采取以上伪装映射的方式进行共享上网 **配置映射方法小结** 01. 指定哪些网段需要进行映射 -s 172.16.1.0/24 02. 指定在哪做映射 -o eth0 03. 用什么方法做映射 -j SNAT/DNAT MASQUERADE 04. 映射成什么地址 --to-source ip 地址 /--to-destination ip 地址 ### 1.7.2 iptables 实现外网 IP 的端口映射到内网 IP 的端口 实际需求:将网关的 IP 和 9000 端口映射到内网服务器的 22 端口 端口映射 10.0.0.188:9000 -->172.16.1.180:22 配置实例: ``` iptables -t nat -A PREROUTING -d 10.0.0.188 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.7:22 ``` 参数说明: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="44%"><p align="center"><strong>参数</strong></p></td><td width="55%"><p align="center"><strong>参数说明</strong></p></td></tr><tr><td width="44%"><p align="center"><strong>-d 10.0.0.188</strong></p></td><td width="55%"><p align="center">目标地址。</p></td></tr><tr><td width="44%"><p align="center"><strong>-j DNAT</strong></p></td><td width="55%"><p align="center">目的地址改写。</p></td></tr></tbody></table> ### 1.7.3 IP 一对一映射 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100320756-725387577.png) 图 - DNAT 映射原理 实际需求:将 ip 地址 172.16.1.180 映射到 10.0.0.188 通过辅助 IP 配置: ``` ip addr add 10.0.0.81/24 dev eth0 label eth0:0 # 添加辅助IP iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51 iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81 ``` 适合内网的机器访问 NAT 外网的 IP ``` iptables -t nat -I POSTROUTING -s 172.16.1.0/255.255.240.0 -d 10.0.0.81 -j SNAT --to-source 172.16.1.8 ``` 检查配置: ``` ping 10.0.0.81 -t tcpdump|grep -i icmp(两台机器上分别监测) telnet 10.0.0.81 22 ``` ### 1.7.4 映射多个外网 IP 上网 方法 1: ``` iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 ``` 在三层交换机或路由器,划分 VLAN。 方法 2: ``` iptables -t nat -A POSTROUTING -s 10.0.1.0/22 -o eth0 -j SNAT --to-source 124.42.60.11 iptables -t nat -A POSTROUTING -s 10.0.2.0/22 -o eth0 -j SNAT --to-source 124.42.60.12 ``` 扩大子网,会增加广播风暴。 ### 1.7.5 系统防火墙与网络内核优化标准参数 有关 iptables 的内核优化 调整内核参数文件 / etc/sysctl.conf 以下是我的生产环境的某个服务器的配置: **解决 time-wait** **过多**的解决办法: [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_max_tw_buckets = 36000 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 ``` 在 dmesg 中显示 ip_conntrack: table full, dropping packet. 的错误提示,什么原因? 如何解决? #iptables 优化 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 1.8 自定义链的配置 ----------- ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100524162-470889662.png) 图 - 自定义链原理 创建自定义链 ``` #示例:在filter表中创建NOICMP自定义链 iptables -t filter -N NOICMP ``` 引用自定义链 ``` #示例:在INPUT链中引用刚才创建的自定义链 iptables -t filter -I INPUT -p icmp -j NOICMP ``` 重命名自定义链 ``` #示例:将IN_WEB自定义链重命名为WEB iptables -E NOICMP ACCEPTICMP ``` 删除自定义链 删除自定义链需要满足两个条件 1、自定义链没有被引用 2、自定义链中没有任何规则 ``` # 示例: 删除引用数为0且不包含任何规则的ACCEPTICMP链 iptables -X ACCEPTICMP ``` 1.9 附录 - 防火墙状态机制 ---------------- 状态机制是 iptables 中较为特殊的一部分,这也是 iptables 和比较老的 ipchains 的一个比较大的区別之一,运行状态机制(连接跟踪)的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙. 状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。 在 iptables 上一共有四种状态,分别被称为 NEW、ESTABLISHED、INVALID、RELATED, 这四种状态对于 TCP、UDP、ICMP 三种协议均有效。下面,我们来分别阐述四种状态的特性. **🔔 NEW** meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions NEW 说明这个包是我们看到的笛一个包。意思就是,这是 conntrack 横块看到的某个连接的第一个包,它即格被匹配了。比如,我们看到一个 SYN 包,是我们所留意的连接的第一 个包,就要匹配它。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100700365-1333317962.png) ****🔔** ESTABLISHED** meaning that the packet is associated with a connection which has seen packets in both directions ESTABLISHED 已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包. 处于 ESTABLISHED 状态的连接是非常容易理解的. 只要发送并接到应答,连接就是 ESTABLISHED 的了。一个连接要从 NEW 变为 ESTABLISHED, 只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的. ICMP 的错误和重定向等信息包也被看作是 ESTABLISHED, 只要它们是我们所发出的信息的应答。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100709240-1842733823.png) **🔔** RELATED meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error. RELATED 是个比较麻烦的状态. 当一个连接和某个已处于 ESTABLISHED 状态的连接有关系时,就被认为是 RELATED 的了,换句话说,一个连接要想是 RELATED 的,首先要有一个 ESTABLISHED 的连接。这个 ESTABLISHED 连接再产生一个主连接之外的连接,这个新的连接就是 RELATED 的了,当然前提是 conntrack 模块要能理解 RELATED。ftp 是个很好的例子,FTP-data 连接就是和 FTP-control 有关联的,如果没有在 iptables 的策略中配 RELATED 状态,FTP-data 的连接是无法正确建立的,还有其他的例子,比如,通过 IRC 的 DCC 连接 #有了这个状态,ICMP 应答、FTP 传输、DCC 等才能穿过防火墙正常工作. 注意,大部分还有一些 UDP 协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100716459-532997150.png) ****🔔** INVALID** meaning that the packet is associated with no known connection INVALID 说明数据包不能被识别属于哪个连接或没有任何状态. 有几个原因可以产生这种情况,比如,内存溢出,收到不知厲于哪个连接的 ICMP 错误信息。一般地,我们 DROP 这个状态的任何东西,因为防火墙认为这是不安全的东西 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100722240-904097578.png) ### 1.9.1 iptables 配置哲学 如何防止自己被关在门外? 01、去机房重启系统或者登陆服努器删除刚才的禁止规则。 02、让机房人员重启服芳器或者让机房人员拿用户密码登录进去。 03、通过服努器的远程管理卡管理(推荐)。 04、先写一个定时任务,每 5 分钟就停止防火墙。 05、测试环境测试好,写成脚本,批置执行 配置禁用 22 端口策略: ``` iptables -I INPUT -p tcp - dport 22 -j DROP # 说明:利用-I参数,实现强行阻止访问22端口,将Jffc规则放在第一位 ``` 删除配置的禁止连接 22 端口的规则 ``` iptables -t filter -D INPUT -p tcp —dport 22 -j DROP iptables -F /etc/init.d/iptables restart ``` 1.1 企业中安全优化配置原则 --------------- 尽可能不给服务器配置外网 ip , 可以通过代理转发或者通过防火墙映射. 并发不是特别大情况有外网 ip, 可以开启防火墙服务. 大并发的情况,不能开 iptables, 影响性能,利用硬件防火墙提升架构安全 ### 1.1.1 生产中 iptables 的实际应用 主要应用方向 1、主机防火墙(filter 表的 INPUT 链)。 2、局域网共享上网 (nat 表的 POSTROUTING 链)。半个路由器,NAT 功能。 3、端口及 IP 映射 (nat 表的 PREROUTING 链),硬防的 NAT 功能。 4、IP 一对一映射。 **_其他说明:_** ①iptables 是基于内核的防火墙,功能非常强大,基于数据包的过滤!特别是可以在一台非常低的硬件配置下跑的非常好。 **注:**iptables 主要工作在 OSI 七层的 2.3.4 层。七层的控制可以使用 squid 代理 + iptables。 ②iptabes:生产中根据具体情况,一般,内网关闭,外网打开。大并发的情况不能开 iptables,影响性能,iptables 是要消耗 CPU 的,所以大并发的情况下,我们使用硬件防火墙的各方面做的很仔细。selinux:生产中也是关闭的。可以做 ids 的入侵检测。 ③实际生产中尽可能不给服务器配置外网 IP。可以通过代理转发。比如,nagios 就不需要外网。 ④并发不是很大的情况下,再外网的 IP 环境,开防火墙。 ⑤第一次直接默认规则生成配置文件,以后就在配置文件中进行修改(编辑添加删除)。 ⑥封掉 IP:根据 IP 地址和网络连接数进行封杀。(定时任务,定时封掉,判断,存在就不再进行二次封杀) ### 1.1.2 企业常用案例功能小结: 1)linux 主机防火墙,单机作为防火墙(表 filter)。 2)局域网共享上网(表 nat postrouting)。 3)外部地址映射为内部地址和端口(表 nat prerouting) 1.2 iptables 防火墙简介 ------------------ Netfilter/Iptables(以下简称 Iptables) 是 unix/linux 自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制. 特别是它可以在一台非常低的硬件配置服务器上跑的非常好(赛扬 500HZ cpu 64M 内存的惲况下部署网关防火墙),提供近 400 人的上网服务丝毫不逊色企业级专业路由器防火墙。 iptables + zebra + squid (企业常用网络开源产品)。 iptables 是 linux2.4 及 2.6 内核中集成的服务,其功能与安全性比其老一蜚 ipfwadm,ipchains 强大的多,iptables 主要工作在 0SI 七层的二、三、四层,如果重新编译内核,iptables 也可以支持 7 层控制(squid 代理 + iptables)。 ### 1.2.1 iptables 名词和术语 不少刚接触到 iptables 的朋友可能会对 iptables 防火墙的相关名词搞的很晕,不知道其所云的具体意思,而是就最基本的能让大家容易快速理解和掌握的思路来描述: 容器:包含或者说属于的关系 ### 1.2.2 什么是容器 谁不知道啊,容器就是装东西的,如(箱、包、坛)。没错,恭喜你答对了. 词典里解释说,容器就是用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料. 在 iptables 里的呢,就是用来描述这种包含或者说属于的关系。 ### 1.2.3 什么是 Netfilter/iptables ? Netfilter 是表(tables)的容器,这样解释大家肯定还是晕。举个例子,如果把 Netfilter 看成是某个小区的一栋楼。那么表(tables) 就是楼里的其中的一套房子。这套房子 "表(tables)" 属于这栋 “Netfilter”。 ### 1.2.4 什么是表(tables)? 表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables). 如上,如果把 Netfilter 看成是某个小区的一栋楼. 那么表(tables)就是楼里的其中的一套房子。 ### 1.2.5 什么是链(chains)? 链(chains)是规则(Policys)的容器。接上,如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)。 ### 1.2.6 什么是规则(Policy)? 规则(Policy)就比较容易理解了,就是 iptables 系列过滤信息的规范和具体方法条款了. 可以理解为柜子如何增加并摆放柜子东西等。 基本术语如下表格所示: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="19%"><p align="center"><strong>Netfilter</strong></p></td><td valign="top" width="23%"><p align="center"><strong>表(tables</strong><strong>)</strong></p></td><td valign="top" width="23%"><p align="center"><strong>链(chains</strong><strong>)</strong></p></td><td valign="top" width="33%"><p align="center"><strong>规则(Policy</strong><strong>)</strong></p></td></tr><tr><td valign="top" width="19%"><p align="center"><strong>一栋楼</strong></p></td><td valign="top" width="23%"><p align="center">按里的房子</p></td><td valign="top" width="23%"><p align="center">房子里的柜子</p></td><td valign="top" width="33%"><p align="center">柜子里衣服,摆放规则</p></td></tr></tbody></table> 1.3 iptables 表和链 ---------------- 描述完 iptables 术语后,相信大家对 iptables 的表和链有了初步的了解了,默认情况下,iptables 根据功能和表的定义划分包含三个表,filter,nat,mangle, 其每个表又包含不同的操作链(chains )。 实际 iptables 包含 4 张表和五个链, 巧主要记住两张表即可 filter 和 nat 表即可。 下面表格展示了表和链的对应关系。 **四个表:** <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="18%"><p align="center"><strong>表(tables</strong><strong>)</strong></p></td><td colspan="2" width="81%"><p align="center"><strong>链(chains</strong><strong>)</strong></p></td></tr><tr><td rowspan="4" width="18%"><p align="center"><strong>Filter</strong></p></td><td colspan="2" width="81%"><p>这是默认表,实现防火墙数据过滤功能。</p></td></tr><tr><td width="18%"><p align="center"><strong>INPUT</strong></p></td><td width="62%"><p>对于指定到本地套接字的包,即到达本地防火墙服务器的数据包。</p></td></tr><tr><td width="18%"><p align="center"><strong>FORWARD</strong></p></td><td width="62%"><p>路由穿过的数据包,即经过本地防火墙服务器的数据包。</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>本地创建的数据包</p></td></tr><tr><td rowspan="4" width="18%"><p align="center"><strong>NAT</strong></p></td><td colspan="2" width="81%"><p>当遇到新创建的数据包连接时将参考这个表</p></td></tr><tr><td width="18%"><p align="center"><strong>FREROUTING</strong></p></td><td width="62%"><p>一进来就对数据包进行改变</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>本地创建的数据包在路由前进行改变</p></td></tr><tr><td width="18%"><p align="center"><strong>POSTROUTING</strong></p></td><td width="62%"><p>在数据包即将出去时改变数据包信息</p></td></tr><tr><td rowspan="6" width="18%"><p align="center"><strong>Mangle</strong></p></td><td colspan="2" width="81%"><p>这个表专门用于改变数据包</p></td></tr><tr><td width="18%"><p align="center"><strong>INPUT</strong></p></td><td width="62%"><p>进入到设备本身的包</p></td></tr><tr><td width="18%"><p align="center"><strong>FORWARD</strong></p></td><td width="62%"><p>对路由后的数据包信息进行修改</p></td></tr><tr><td width="18%"><p align="center"><strong>FREROUTING</strong></p></td><td width="62%"><p>在路由之前更改传入的包</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>本地创建的数据包在路由之前改变</p></td></tr><tr><td width="18%"><p align="center"><strong>POSTROUTING</strong></p></td><td width="62%"><p>在数据包即将离开时更改数据包信息</p></td></tr><tr><td rowspan="3" width="18%"><p align="center"><strong>raw</strong></p></td><td colspan="2" width="81%"><p><strong>此表用处较少,可以忽略不计。</strong></p><p>This table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target.</p></td></tr><tr><td width="18%"><p align="center"><strong>PREROUTING</strong></p></td><td width="62%"><p>for packets arriving via any network interface</p></td></tr><tr><td width="18%"><p align="center"><strong>OUTPUT</strong></p></td><td width="62%"><p>for packets generated by local processes</p></td></tr></tbody></table> **五个链** <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td rowspan="2" width="18%"><p align="center"><strong>表(tables</strong><strong>)</strong></p></td><td colspan="5" width="81%"><p align="center"><strong>链(chains</strong><strong>)</strong></p></td></tr><tr><td width="15%"><p align="center">INPUT</p></td><td width="16%"><p align="center">FORWARD</p></td><td width="15%"><p align="center">OUTPUT</p></td><td width="16%"><p align="center">PREROUTING</p></td><td width="17%"><p align="center">POSTROUTING</p></td></tr><tr><td width="18%"><p align="center"><strong>Filter</strong></p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">×</p></td><td width="17%"><p align="center">×</p></td></tr><tr><td width="18%"><p align="center"><strong>NAT</strong></p></td><td width="15%"><p align="center"><strong>×</strong></p></td><td width="16%"><p align="center">×</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="17%"><p align="center">√</p></td></tr><tr><td width="18%"><p align="center"><strong>Managle</strong></p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="17%"><p align="center">√</p></td></tr><tr><td width="18%"><p align="center"><strong>raw</strong></p></td><td width="15%"><p align="center">×</p></td><td width="16%"><p align="center">×</p></td><td width="15%"><p align="center">√</p></td><td width="16%"><p align="center">√</p></td><td width="17%"><p align="center">×</p></td></tr><tr><td colspan="6" width="100%"><p>说明:√ 表示有,× 表示无。</p></td></tr></tbody></table> ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095127803-1524170528.png) 图 - iptables 中的表与链的结构关系 ### 1.3.1 filter 表的详细介绍 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="20%"><p align="center"><strong>filter</strong><strong> 表</strong></p></td><td valign="top" width="79%"><p>主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)</p><p>filter 表是 iptables 默认使用的表,这个表定义了三个链(chains)</p><p><strong>企业工作场景:</strong><strong> 主机防火墙</strong></p></td></tr><tr><td width="20%"><p align="center"><strong>INPUT</strong></p></td><td valign="top" width="79%"><p>负责过滤所有目标是本机地址的数据包</p><p>通俗来说:就是过滤进入主机的数据包</p></td></tr><tr><td width="20%"><p align="center"><strong>FORWARD</strong></p></td><td valign="top" width="79%"><p>负责转发流经主机的数据包。起到转发的作用,和 NAT 关系很大。</p><p>LVS NAT 模式,net.ipv4.ip_forward=0</p></td></tr><tr><td width="20%"><p align="center"><strong>OUTPUT</strong></p></td><td valign="top" width="79%"><p>处理所有源地址是本机地址的数据包</p><p>通俗的讲:就是处理从主机发出的数据包</p></td></tr></tbody></table> 对于 filter 表的控制是我们实现本机防火墙功能的重要手段,特别是 INPUT 链的控制。 ### 1.3.2 NAT 表信息详细介绍 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="20%"><p align="center">NAT 表</p></td><td width="79%"><p>负责网络地址转换的,即来源与目的的 IP 地址和 port 的转换。</p><p>应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换相关.</p><p><strong><em>工作场景:</em></strong></p><p>1、用于企业路由 (zebra) 或网关(iptables), 共享上网(POSTROUTING)</p><p>2、做内部外部 IP 地址一对一映射 (dmz), 硬件防火墙映射 IP 到内部服务器,FTP 服务 (PREROUTING)</p><p>3、WEB, 单个端口的映射,直接映射 80 端口 (PREROUTING)</p><p>这个表定义了 3 个链,nat 功能相当于网络的 acl 控制。和网络交换机 acl 类似。</p></td></tr><tr><td width="20%"><p align="center"><strong>OUTPUT</strong></p></td><td width="79%"><p>和主机放出去的数据包有关,改变主机发出数据包的目的地址。</p></td></tr><tr><td width="20%"><p align="center"><strong>PREROUTING</strong></p></td><td width="79%"><p>在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等</p><p>就是收信时,根据规则重写收件人的地址</p><p>例如:把公网 IP: xxx.xxx.xxx.xxx 映射到局域网的 x.x.x.x 服务器</p><p>如果是 web 服务,可以把 80 转换为局域网的服务器 9000 端口上。</p></td></tr><tr><td width="20%"><p align="center"><strong>POSTROUTING</strong></p></td><td width="79%"><p>在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。</p><p>写好收件人的地址,要让家人回信时能够有地址可回。</p><p>例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为公网地址。</p><p><strong><em>生产应用:</em></strong>局域网共享上网。</p></td></tr></tbody></table> ### 1.3.3 Mangle 表信息详细介绍 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="20%"><p align="center">Mangle 表</p></td><td width="79%"><p>主要负责修改数据包中特殊的路由标记,如 TTL,TOS,MARK 等,这个表定义了 5 个链 (chains).</p></td></tr></tbody></table> 由于这个表与特殊标记相关,一般倩况下,我们用不到这个 mangle 表。 这里就不做详细介绍了。 1.4 iptables 工作流程 ----------------- ### 1.4.1 工作流程说明 前面介绍已经提到,iptables 是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。 iptables 是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。 数据包的流向是从左向右的。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095142834-207194553.png) 图 - iptables 包处理流程图 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095149740-1977616339.png) 图 - iptables 包处理流程图 (简化) **_抽象说明:_**上图可以用北京地铁 1,2 号线来描述: 1 号线:主要是 NAT 功能 企业案例: 1) 局域网上网共享(路由和网关),使用 NAT 的 POSTROUTING 链。 2) 外部 IP 和端口映射为内部 IP 和端口(DMZ 功能),使用 NAT 的 PREROUTING 链 2 号线:主要是 FILTER 功能,即防火墙功能 FILTER INPUT FORWARD 企业案例: 主要应用就是主机服务器防火墙,使用 FILTER 的 INPUT 链 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095207678-1251478781.png) 图 - iptables 数据包转发流程图 ### 1.4.2 iptables 工作流程小结 1、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。 2、如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。 3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。 4、防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。 1.5 iptables 操作 --------------- 系统环境说明 ``` [root@clsn ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@clsn ~]# hostname -I 10.0.0.188 172.16.1.188 ``` 软件版本 ``` [root@clsn ~]# iptables -V iptables v1.4.7 ``` ### 1.5.1 iptables 参数说明 <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="32%"><p align="center"><strong>参数</strong></p></td><td colspan="3" width="67%"><p align="center"><strong>参数说明</strong></p></td></tr><tr><td colspan="4" width="100%"><p><strong>显示相关参数</strong></p></td></tr><tr><td width="32%"><p align="center"><strong>-n/--numeric</strong></p></td><td colspan="3" width="67%"><p>以数字的方式显示地址或端口信息</p></td></tr><tr><td width="32%"><p align="center"><strong>-L/ --list</strong></p></td><td colspan="3" width="67%"><p>列出一个链或所有链中的规则信息</p></td></tr><tr><td width="32%"><p align="center"><strong>--list-rules/-S</strong></p></td><td colspan="3" width="67%"><p>Print the rules in a chain or all chains</p></td></tr><tr><td width="32%"><p align="center"><strong>--line-number</strong></p></td><td colspan="3" width="67%"><p>当列出规则信息时,打印规则行号</p></td></tr><tr><td width="32%"><p align="center"><strong>-v</strong></p></td><td colspan="3" width="67%"><p>显示详细信息,可以叠加</p></td></tr><tr><td width="32%"><p align="center"><strong>-h</strong></p></td><td colspan="3" width="67%"><p>显示帮助信息</p></td></tr><tr><td colspan="4" width="100%"><p><strong>初始化相关参数</strong></p></td></tr><tr><td width="32%"><p align="center"><strong>iptables -F</strong></p></td><td colspan="3" width="67%"><p>清除所有规则,不会处理默认的规则</p></td></tr><tr><td width="32%"><p align="center"><strong>iptables -X</strong></p></td><td colspan="3" width="67%"><p>删除用户自定义的链</p></td></tr><tr><td width="32%"><p align="center"><strong>iptables -Z</strong></p></td><td colspan="3" width="67%"><p>链的计数器清零(数据包计数器与数据包字节计数器)</p></td></tr><tr><td colspan="4" width="100%"><p><strong>配置常用参数</strong></p></td></tr><tr><td width="32%"><p align="center"><strong>-t </strong><strong>表名称</strong></p></td><td colspan="3" width="67%"><p>指定配置哪个表,指定配置表名称。</p></td></tr><tr><td width="32%"><p align="center"><strong>--append/-A </strong><strong>链名称</strong></p></td><td colspan="3" width="67%"><p>附加或追加上相应规则策略,到指定链 (链名称必须大写),默认将配置的规则插入到最后一条。</p></td></tr><tr><td width="32%"><p align="center"><strong>--check/-C</strong></p></td><td colspan="3" width="67%"><p>Check for the existence of a rule</p></td></tr><tr><td width="32%"><p align="center"><strong>--insert/-I </strong><strong>链名称</strong></p></td><td colspan="3" width="67%"><p>插入相应规则策略,到指定链上,默认将配置的规则插入到第一条(可以根据规则序号插入到指定位置)-- 封 IP 地址使用。</p></td></tr><tr><td width="32%"><p align="center"><strong>--delete/-D </strong><strong>链名称</strong></p></td><td colspan="3" width="67%"><p>删除指定的规则 (可以根据规则序号进行删除)</p></td></tr><tr><td width="32%"><p align="center"><strong>--replace/-R</strong></p></td><td colspan="3" width="67%"><p>Replace rule rulenum (1 = first) in chain</p></td></tr><tr><td width="32%"><p align="center"><strong>-P(</strong><strong>大写)</strong><strong> 链名称</strong></p></td><td colspan="3" width="67%"><p>改变链上的最终默认规则策略</p></td></tr><tr><td width="32%"><p align="center"><strong>--new/-N</strong></p></td><td colspan="3" width="67%"><p>创建新的用户定义链</p></td></tr><tr><td width="32%"><p align="center"><strong>-p </strong><strong>协议名称</strong></p><p align="center"><strong>[!] --proto</strong></p></td><td colspan="3" width="67%"><p>指定规则的协议名称 all tcp udp icmp</p></td></tr><tr><td width="32%"><p align="center"><strong>--dport</strong></p></td><td colspan="3" width="67%"><p>指定匹配的目标端口信息</p></td></tr><tr><td width="32%"><p align="center"><strong>--sport</strong></p></td><td colspan="3" width="67%"><p>指定匹配的源端口信息</p></td></tr><tr><td rowspan="7" width="32%"><p align="center"><strong>-j </strong><strong>动作</strong></p></td><td colspan="3" width="67%"><p>匹配数据包后的动作 </p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>ACCEPT</strong></p></td><td width="47%"><p>允许</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>DROP</strong></p></td><td width="47%"><p>丢弃 (没有响应)</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>REJECT</strong></p></td><td width="47%"><p>拒绝 (回应请求者明确的拒绝)</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>MASQUERADE</strong></p></td><td width="47%"><p>伪装上网时使用</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>SNAT</strong></p></td><td width="47%"><p>共享地址上网</p></td></tr><tr><td colspan="2" width="20%"><p align="center"><strong>DNAT</strong></p></td><td width="47%"><p>目的地址改写</p></td></tr><tr><td width="32%"><p align="center"><strong>-i</strong></p><p align="center"><strong>[!] --in-interface</strong></p></td><td colspan="3" width="67%"><p>在 INPUT 链配置规则中,指定从哪一个网卡接口进入的流量(只能配置在 INPUT 链上)</p></td></tr><tr><td width="32%"><p align="center"><strong>-o</strong></p><p align="center"><strong>[!] --out-interface</strong></p></td><td colspan="3" width="67%"><p>在 OUTPUT 链配置规则中,指定从哪一个网接口出去的流量(只能配置在 OUTPUT 链上)</p></td></tr><tr><td valign="top" width="32%"><p align="center"><strong>-s</strong></p><p align="center"> <strong>[!] --source </strong></p></td><td colspan="3" width="67%"><p>指定源 IP 地址或源网段信息</p></td></tr><tr><td valign="top" width="32%"><p align="center"><strong>-d</strong></p><p align="center"><strong>[!] --destination</strong></p></td><td colspan="3" width="67%"><p>指定目标 IP 地址或目标网段信息</p></td></tr><tr><td colspan="4" width="100%"><p><strong>扩展参数</strong></p></td></tr><tr><td rowspan="4" width="32%"><p align="center"><strong>-m </strong><strong>模块</strong></p></td><td colspan="3" width="67%"><p>表示增加扩展,匹配功能扩展匹配(可以加载扩展参数)</p></td></tr><tr><td width="18%"><p align="center"><strong>multiport</strong></p></td><td colspan="2" width="48%"><p>实现不连续多端口扩展匹配</p></td></tr><tr><td width="18%"><p align="center"><strong>icmp</strong></p></td><td colspan="2" width="48%"><p>使用 icmp 的扩展</p></td></tr><tr><td width="18%"><p align="center"><strong>state</strong></p></td><td colspan="2" width="48%"><p>状态模块扩展</p></td></tr><tr><td width="32%"><p align="center"><strong>--icmp-type</strong></p></td><td colspan="3" width="67%"><p>只有类型 8 是真正会影响 ping,或者也可以采用 any;了解很多 icmp 类型<em> iptables -p icmp -h</em></p></td></tr><tr><td width="32%"><p align="center"><strong>--limit n/{second/minute/hour}</strong></p></td><td colspan="3" width="67%"><p>指定时间内的请求速率”n” 为速率,后面为时间分别为:秒 分 时</p></td></tr><tr><td width="32%"><p align="center"><strong>--limit-burst [n]</strong></p></td><td colspan="3" width="67%"><p>在同一时间内允许通过的请求”n” 为数字,不指定默认为 5</p></td></tr><tr><td width="32%"><p align="center"><strong>--exact/-x</strong></p></td><td colspan="3" width="67%"><p>扩展数字(显示精确数值)</p></td></tr><tr><td width="282"> </td><td width="129"> </td><td width="9"> </td><td width="287"> </td></tr></tbody></table> **!** **的使用实例** ``` [root@clsn ~]# iptables ! -V Not 1.4.7 ;-) [root@clsn ~]# iptables -V iptables v1.4.7 ``` 注意:在 iptables 中所有链名必须大写,表明必须小写,动作必须大写,匹配必须小写。 ### 1.5.2 配置前准备 在配置防火墙首先要其中防火墙 ``` [root@clsn ~]# /etc/init.d/iptables start iptables: Applying firewall rules: [ OK ] ``` 清除 iptables 所有规则 ``` [root@clsn ~]# iptables -Z [root@clsn ~]# iptables -X [root@clsn ~]# iptables -F ``` 查看 iptables 的规则 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@clsn ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 查看其他的表配置(-t 参数) [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@clsn ~]# iptables -nL -t raw Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 查看配置规则的顺序号 ``` [root@clsn ~]# iptables -nvL --number-list --line-number # 显示规则的序号 ``` 1.6 iptables filter 表配置实例 ------------------------- ### 1.6.1 基础配置 **配置实例一:**配置 22/ssh 端口访问控制规则 ``` iptables -A INPUT -p tcp --dport 22 -j DROP # 禁止所有人访问22端口 iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 恢复连接方法 iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT # 通过插入指定行号信息,指定将规则插入到第几行 iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除指定规则 iptables -D INPUT 2 # 根据规则行号,删除相应的规则 ``` 只允许 10.0.0.1 的 ip 通过 ssh 连接这台服务器 ``` iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT ``` 配置实例二:禁止网段连入(禁止 172.16.1.0 网段访问 172.16.1.188) ``` iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -j DROP ``` 配置实例三:禁止某个 172.16.1.0 网段访问服务器主机的 22 端口 ``` iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -p tcp --dport 22 -j DROP ``` 方向说明: ``` # 在入方向控制 iptables -I INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # 在出方向控制 iptables -I OUTPUT -o eth0 -p tcp --sport 22 -j DROP ``` ### 1.6.2 配置实例四:除 10.0.0.0 网段可以进行连接服务器主机意外,其余网段都禁止 _第一种方式:_ ``` iptables -A INPUT -s 10.0.0.0/24 -d 172.16.1.8 -j ACCEPT ``` 修改默认规则,将默认规则改为拒绝 _第二种方式:_ ! --- 表示对规则信息进行取反 ``` iptables -A INPUT ! -s 10.0.0.0/24 -d 172.16.1.8 -j DROP --- centos6用法 iptables -A INPUT -s ! 10.0.0.0/24 -d 172.16.1.8 -j DROP --- centos5用法 ``` 说明:只有 iptables 帮助手册中指定的参数可以用取反符号(iptables --help) ### 1.6.3 配置实例五:测试匹配列举端口范围。 ``` iptables -A INPUT -p tcp --dport 22:80 -j DROP # 设置连续多端口控制策略 iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP # 设置不连续多端口控制策略 ``` -m 参数表示增加扩展匹配功能,multiport 实现不连续多端口扩展匹配 ### 1.6.4 配置实例六:匹配 ICMP 类型 禁止 ping 策略原则 iptables 服务器是 ping 命令发起者或是接受者 **发起者:** input 链: 禁止 icmp-type 0 ``` iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j DROP ``` output 链: 禁止 icmp-type 8 ``` iptables -A OUTPUT -o eth0 -p icmp --icmp-type 8 -j DROP ``` **接受者:** input 链: 禁止 icmp-type 8 ``` iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP ``` output 链: 禁止 icmp-type 0 ``` iptables -A OUTPUT -o eth0 -p icmp --icmp-type 0 -j DROP ``` 简化配置: ``` iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type any -j DROP #禁止所有类型的icmp ``` 指定类型禁止 icmp ``` iptables -A INPUT -p icmp --icmp-type 8 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 -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT ``` 说明:只有类型 8 是真正会影响 ping,或者也可以采用 any;了解很多 icmp 类型 iptables -p icmp -h **ICMP** **类型的说明** <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="11%"><p align="center">TYPE</p></td><td valign="top" width="11%"><p align="center">CODE</p></td><td valign="top" width="56%"><p>Description</p></td><td valign="top" width="11%"><p align="center">Query</p></td><td valign="top" width="11%"><p align="center">Error</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>0</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Echo Reply——回显应答(Ping 应答)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Network Unreachable——网络不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>Host Unreachable——主机不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">2</p></td><td valign="top" width="56%"><p>Protocol Unreachable——协议不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">3</p></td><td valign="top" width="56%"><p>Port Unreachable——端口不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">4</p></td><td valign="top" width="56%"><p>Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">5</p></td><td valign="top" width="56%"><p>Source routing failed——源站选路失败</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">6</p></td><td valign="top" width="56%"><p>Destination network unknown——目的网络未知</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">7</p></td><td valign="top" width="56%"><p>Destination host unknown——目的主机未知</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">8</p></td><td valign="top" width="56%"><p>Source host isolated (obsolete)——源主机被隔离(作废不用)</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">9</p></td><td valign="top" width="56%"><p>Destination network administratively prohibited——目的网络被强制禁止</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">10</p></td><td valign="top" width="56%"><p>Destination host administratively prohibited——目的主机被强制禁止</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">11</p></td><td valign="top" width="56%"><p>Network unreachable for TOS——由于服务类型 TOS,网络不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">12</p></td><td valign="top" width="56%"><p>Host unreachable for TOS——由于服务类型 TOS,主机不可达</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">13</p></td><td valign="top" width="56%"><p>Communication administratively prohibited by filtering——由于过滤,通信被强制禁止</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">14</p></td><td valign="top" width="56%"><p>Host precedence violation——主机越权</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>3</strong></p></td><td valign="top" width="11%"><p align="center">15</p></td><td valign="top" width="56%"><p>Precedence cutoff in effect——优先中止生效</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>4</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Source quench——源端被关闭(基本流控制)</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Redirect for network——对网络重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>Redirect for host——对主机重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">2</p></td><td valign="top" width="56%"><p>Redirect for TOS and network——对服务类型和网络重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>5</strong></p></td><td valign="top" width="11%"><p align="center">3</p></td><td valign="top" width="56%"><p>Redirect for TOS and host——对服务类型和主机重定向</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>8</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Echo request——回显请求(Ping 请求)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>9</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Router advertisement——路由器通告</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>10</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Route solicitation——路由器请求</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>11</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>TTL equals 0 during transit——传输期间生存时间为 0</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>11</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>TTL equals 0 during reassembly——在数据报组装期间生存时间为 0</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>12</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>IP header bad (catchall error)——坏的 IP 首部(包括各种差错)</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>12</strong></p></td><td valign="top" width="11%"><p align="center">1</p></td><td valign="top" width="56%"><p>Required options missing——缺少必需的选项</p></td><td valign="top" width="11%"></td><td valign="top" width="11%"><p align="center">x</p></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>13</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Timestamp request (obsolete)——时间戳请求(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>14</strong></p></td><td valign="top" width="11%"></td><td valign="top" width="56%"><p>Timestamp reply (obsolete)——时间戳应答(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>15</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Information request (obsolete)——信息请求(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>16</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Information reply (obsolete)——信息应答(作废不用)</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>17</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Address mask request——地址掩码请求</p></td><td valign="top" width="11%"><p align="center">x</p></td><td valign="top" width="11%"></td></tr><tr><td valign="top" width="11%"><p align="center"><strong>18</strong></p></td><td valign="top" width="11%"><p align="center">0</p></td><td valign="top" width="56%"><p>Address mask reply——地址掩码应答</p></td><td valign="top" width="11%"> </td><td valign="top" width="11%"> </td></tr></tbody></table> 数据来源:http://www.cnitblog.com/yang55xiaoguang/articles/59581.html ### 1.6.5 防火墙状态机制配置 状态集简单说明: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="50%"><p align="center"><strong>状态集</strong></p></td><td valign="top" width="50%"><p align="center"><strong>说明</strong></p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>NEW</strong></p></td><td valign="top" width="50%"><p>表示新建立连接的数据包状态</p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>ESTABLISHED</strong></p></td><td valign="top" width="50%"><p>表示新建立连接数据包发送之后,回复响应的数据包状态</p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>RELATED</strong></p></td><td valign="top" width="50%"><p>表示借助已经建立的链路,发送新的连接数据包</p></td></tr><tr><td valign="top" width="50%"><p align="center"><strong>INVALID</strong></p></td><td valign="top" width="50%"><p>无效无法识别的数据包</p></td></tr></tbody></table> 注意:允许关联的状态包通过(web 服务不要使用 FTP 服务) 防火墙服务配置在 FTP 服务器上时,需要配置以下策略 ``` iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ``` 实现发现 sent_syn 状态 ``` iptables -A INPUT -m state --state NEW -j DROP # 防火墙所连接客户端上配置 ``` 实现发现 sent_rcvd 状态 ``` iptables -I INPUT -i eth0 -s 10.0.0.201 -m state --state ESTABLISHED -j DROP # 防护墙上配置的 ``` ### 1.6.6 使用 iptables 实现限速功能 limit 是 iptables 的一个匹配模块,用它结合 iptables 的其它命令可以实现限速的功能。 不过首先必须明确,limit 本身只是一个 “匹配” 模块。我们知道,iptables 的基本原理是“匹配 -- 处理”,limit 在这个工作过程中只能起到匹配的作用,它本身是无法对网络数据包进行任何处理的。我看到网上有些 limit 的例子里面说只 用一条包含 limit 匹配规则的 iptables 语句就可以实现限速,那是错误的。 实际上,利用 imit 来限速需要包括两个步骤: 1. 对符合 limit 匹配规则包放行 2. 丢弃 / 拒绝未放行的包 示例: ``` iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP ``` 语句含义:当来自 10.0.0.7 的 ping 包超过 5 个时进行限速,限制为每 10s 一个。 参数说明: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="44%"><p align="center"><strong>参数</strong></p></td><td width="55%"><p align="center"><strong>参数含义</strong></p></td></tr><tr><td width="44%"><p><strong>--limit n/{second/minute/hour}</strong></p></td><td width="55%"><p>指定时间内的请求速率”n” 为速率,后面为时间分别为:秒 分 时</p></td></tr><tr><td width="44%"><p><strong>--limit-burst [n]</strong></p></td><td width="55%"><p>在同一时间内允许通过的请求”n” 为数字,不指定默认为 5</p></td></tr></tbody></table> **limit** **模块具体是如何工作的。?** limit 的匹配是基于令牌桶 (Token bucket)模型的。 令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量 n 和令牌产生速率 s。 我们可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有 n 张令牌。一开始,管理员开始手里有 n 张令牌。每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,limit 就告诉 iptables,这个数据包被匹配了。而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了。这时,limit 模块就告诉 iptables,这个数据包不能被匹配。除了发放令牌之外,只要令牌桶中的令牌数量少于 n,它就会以速率 s 来产生新的令牌,直到令牌数量到达 n 为止。 通过令牌桶机制,即可以有效的控制单位时间内通过(匹配)的数据包数量,又可以容许短时间内突发的大量数据包的通过(只要数据包数量不超过令牌桶 n)。 limit 模块提供了两个参数 --limit 和 --limit-burst,分别对应于令牌产生速率和令牌桶容量。除了令牌桶模型外,limit 匹配的另外一个重要概念是匹配项。在 limit 中,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算。 ### 1.6.7 企业级防火墙配置 清除防火墙规则 ``` [root@clsn ~]# iptables -F [root@clsn ~]# iptables -X [root@clsn ~]# iptables -Z ``` 修改默认规则为拒绝(修改前先放行 22 端口,保证自己能够连上主机) ``` [root@clsn ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@clsn ~]# iptables -P INPUT DROP [root@clsn ~]# iptables -P FORWARD DROP ``` 放行指定的端口 ``` [root@clsn ~]# iptables -A INPUT -i lo -j ACCEPT [root@clsn ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT [root@clsn ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT [root@clsn ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ``` **保存 iptables** **配置** 01. 第一种方式 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@clsn ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@clsn ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Tue Apr 4 12:24:43 2017 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [159:10664] -A INPUT -s 10.0.0.0/24 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT -A INPUT -s 172.16.1.0/24 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT # Completed on Tue Apr 4 12:24:43 2017 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 02. 第二种方式 ``` iptables-save >/etc/sysconfig/iptables ``` 1.7 iptables nat 表配置实例 ---------------------- ### 1.7.1 iptables 实现共享上网 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118095907193-681615791.png) 图 - SNAT 配置原理图 第一个里程碑:配置内网服务器,设置网关地址 ``` /etc/init.d/iptables stop # 内网服务器停止防火墙服务 ifdown eth0 # 模拟关闭内网服务器外网网卡 setup # 修改内网网卡网关和DNS地址信息 ``` 也可以使用命令添加默认网关 ``` route add default gw 172.16.1.188 ``` 查看默认的路由信息 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` [root@test ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 172.16.1.188 0.0.0.0 UG 0 0 0 eth1 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 说明:内网服务器网关地址指定为共享上网服务器内网网卡地址 第二个里程碑:配置共享上网服务器,开启共享上网服务器路由转发功能 ``` [root@clsn ~]# vim /etc/sysctl.conf [root@clsn ~]# sysctl -p ~~~ net.ipv4.ip_forward = 1 ~~~ ``` 第三个里程碑:配置共享上网服务器,实现内网访问外网的 NAT 映射 ``` iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.188 ``` 参数详解: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="37%"><p align="center"><strong>参数</strong></p></td><td width="62%"><p align="center"><strong>参数说明</strong></p></td></tr><tr><td width="37%"><p><strong>-s 172.16.1.0/24</strong></p></td><td width="62%"><p>指定将哪些内网网段进行映射转换</p></td></tr><tr><td width="37%"><p><strong>-o eth0</strong></p></td><td width="62%"><p>指定在共享上网哪个网卡接口上做 NAT 地址转换</p></td></tr><tr><td width="37%"><p><strong>-j SNAT</strong></p></td><td width="62%"><p>将源地址进行转换变更</p></td></tr><tr><td width="37%"><p><strong>-j DNAT</strong></p></td><td width="62%"><p>将目标地址进行转换变更</p></td></tr><tr><td width="37%"><p><strong>--to-source ip</strong><strong> 地址</strong></p></td><td width="62%"><p>将源地址映射为什么 IP 地址</p></td></tr><tr><td width="37%"><p><strong>--to-destination ip</strong><strong> 地址</strong></p></td><td width="62%"><p>将目标地址映射为什么 IP 地址</p></td></tr></tbody></table> 当 filter 表中的 forward 默认为 drop 策略时,如何配置 forward 链? ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100154553-999721017.png) 图 - forward 工作原理 **配置示例** ``` iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT # iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT # 可以不进行配置 iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT # iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT # 可以不进行配置 ``` 当外网 ip 不固定时如何配置? ``` iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE # 伪装共享上网 ``` 说明:在企业中如何没有固定外网 IP 地址,可以采取以上伪装映射的方式进行共享上网 **配置映射方法小结** 01. 指定哪些网段需要进行映射 -s 172.16.1.0/24 02. 指定在哪做映射 -o eth0 03. 用什么方法做映射 -j SNAT/DNAT MASQUERADE 04. 映射成什么地址 --to-source ip 地址 /--to-destination ip 地址 ### 1.7.2 iptables 实现外网 IP 的端口映射到内网 IP 的端口 实际需求:将网关的 IP 和 9000 端口映射到内网服务器的 22 端口 端口映射 10.0.0.188:9000 -->172.16.1.180:22 配置实例: ``` iptables -t nat -A PREROUTING -d 10.0.0.188 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.7:22 ``` 参数说明: <table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td width="44%"><p align="center"><strong>参数</strong></p></td><td width="55%"><p align="center"><strong>参数说明</strong></p></td></tr><tr><td width="44%"><p align="center"><strong>-d 10.0.0.188</strong></p></td><td width="55%"><p align="center">目标地址。</p></td></tr><tr><td width="44%"><p align="center"><strong>-j DNAT</strong></p></td><td width="55%"><p align="center">目的地址改写。</p></td></tr></tbody></table> ### 1.7.3 IP 一对一映射 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100320756-725387577.png) 图 - DNAT 映射原理 实际需求:将 ip 地址 172.16.1.180 映射到 10.0.0.188 通过辅助 IP 配置: ``` ip addr add 10.0.0.81/24 dev eth0 label eth0:0 # 添加辅助IP iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51 iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81 ``` 适合内网的机器访问 NAT 外网的 IP ``` iptables -t nat -I POSTROUTING -s 172.16.1.0/255.255.240.0 -d 10.0.0.81 -j SNAT --to-source 172.16.1.8 ``` 检查配置: ``` ping 10.0.0.81 -t tcpdump|grep -i icmp(两台机器上分别监测) telnet 10.0.0.81 22 ``` ### 1.7.4 映射多个外网 IP 上网 方法 1: ``` iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 ``` 在三层交换机或路由器,划分 VLAN。 方法 2: ``` iptables -t nat -A POSTROUTING -s 10.0.1.0/22 -o eth0 -j SNAT --to-source 124.42.60.11 iptables -t nat -A POSTROUTING -s 10.0.2.0/22 -o eth0 -j SNAT --to-source 124.42.60.12 ``` 扩大子网,会增加广播风暴。 ### 1.7.5 系统防火墙与网络内核优化标准参数 有关 iptables 的内核优化 调整内核参数文件 / etc/sysctl.conf 以下是我的生产环境的某个服务器的配置: **解决 time-wait** **过多**的解决办法: [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_max_tw_buckets = 36000 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 ``` 在 dmesg 中显示 ip_conntrack: table full, dropping packet. 的错误提示,什么原因? 如何解决? #iptables 优化 [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") ``` net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 ``` [ ![](http://common.cnblogs.com/images/copycode.gif) ](javascript:void(0); "复制代码") 1.8 自定义链的配置 ----------- ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100524162-470889662.png) 图 - 自定义链原理 创建自定义链 ``` #示例:在filter表中创建NOICMP自定义链 iptables -t filter -N NOICMP ``` 引用自定义链 ``` #示例:在INPUT链中引用刚才创建的自定义链 iptables -t filter -I INPUT -p icmp -j NOICMP ``` 重命名自定义链 ``` #示例:将IN_WEB自定义链重命名为WEB iptables -E NOICMP ACCEPTICMP ``` 删除自定义链 删除自定义链需要满足两个条件 1、自定义链没有被引用 2、自定义链中没有任何规则 ``` # 示例: 删除引用数为0且不包含任何规则的ACCEPTICMP链 iptables -X ACCEPTICMP ``` 1.9 附录 - 防火墙状态机制 ---------------- 状态机制是 iptables 中较为特殊的一部分,这也是 iptables 和比较老的 ipchains 的一个比较大的区別之一,运行状态机制(连接跟踪)的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙. 状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。 在 iptables 上一共有四种状态,分别被称为 NEW、ESTABLISHED、INVALID、RELATED, 这四种状态对于 TCP、UDP、ICMP 三种协议均有效。下面,我们来分别阐述四种状态的特性. **🔔 NEW** meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions NEW 说明这个包是我们看到的笛一个包。意思就是,这是 conntrack 横块看到的某个连接的第一个包,它即格被匹配了。比如,我们看到一个 SYN 包,是我们所留意的连接的第一 个包,就要匹配它。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100700365-1333317962.png) ****🔔** ESTABLISHED** meaning that the packet is associated with a connection which has seen packets in both directions ESTABLISHED 已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包. 处于 ESTABLISHED 状态的连接是非常容易理解的. 只要发送并接到应答,连接就是 ESTABLISHED 的了。一个连接要从 NEW 变为 ESTABLISHED, 只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的. ICMP 的错误和重定向等信息包也被看作是 ESTABLISHED, 只要它们是我们所发出的信息的应答。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100709240-1842733823.png) **🔔** RELATED meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error. RELATED 是个比较麻烦的状态. 当一个连接和某个已处于 ESTABLISHED 状态的连接有关系时,就被认为是 RELATED 的了,换句话说,一个连接要想是 RELATED 的,首先要有一个 ESTABLISHED 的连接。这个 ESTABLISHED 连接再产生一个主连接之外的连接,这个新的连接就是 RELATED 的了,当然前提是 conntrack 模块要能理解 RELATED。ftp 是个很好的例子,FTP-data 连接就是和 FTP-control 有关联的,如果没有在 iptables 的策略中配 RELATED 状态,FTP-data 的连接是无法正确建立的,还有其他的例子,比如,通过 IRC 的 DCC 连接 #有了这个状态,ICMP 应答、FTP 传输、DCC 等才能穿过防火墙正常工作. 注意,大部分还有一些 UDP 协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100716459-532997150.png) ****🔔** INVALID** meaning that the packet is associated with no known connection INVALID 说明数据包不能被识别属于哪个连接或没有任何状态. 有几个原因可以产生这种情况,比如,内存溢出,收到不知厲于哪个连接的 ICMP 错误信息。一般地,我们 DROP 这个状态的任何东西,因为防火墙认为这是不安全的东西 ![](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180118100722240-904097578.png) ### 1.9.1 iptables 配置哲学 如何防止自己被关在门外? 01、去机房重启系统或者登陆服努器删除刚才的禁止规则。 02、让机房人员重启服芳器或者让机房人员拿用户密码登录进去。 03、通过服努器的远程管理卡管理(推荐)。 04、先写一个定时任务,每 5 分钟就停止防火墙。 05、测试环境测试好,写成脚本,批置执行 配置禁用 22 端口策略: ``` iptables -I INPUT -p tcp - dport 22 -j DROP # 说明:利用-I参数,实现强行阻止访问22端口,将Jffc规则放在第一位 ``` 删除配置的禁止连接 22 端口的规则 ``` iptables -t filter -D INPUT -p tcp —dport 22 -j DROP iptables -F /etc/init.d/iptables restart ```
Jonny
2021年9月16日 11:58
628
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
如遇文档失效,可评论告知,便后续更新!
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期