iptables 介绍

iptables basics

Introduction

iptables 是一个配置 Linux 防火墙的工具,是 netfilter 项目的一部分。
Linux Kernel 3.13 及以上版本中, nftables 将作为后继者取代 iptables 以成为更强大易用的防火墙工具

Basic Concepts

工作方式

  1. iptables 作为防火墙, 一般是有 两种策略, 可以通过配置规则来决定是拒绝请求、转发请求或者改写请求数据。

  2. iptables 包含 table, chain, rule, target 等概念
    iptables 的有机组预定义好的 table, 每个 table 包含若干个预定义好的 chain, 每条 chain 都由 0 ~ N 个 rule 组成,
    每个 rule 包含多个匹配条件,条件匹配后有个 target 作为最终的目标(action)

    • 几组预定义的 table,

      • filter: 用于存放与防火墙相关配置的表,也是默认表
      • nat: 用于 NAT 操作
      • mangle: 用于对特定 packet 的数据修改
      • raw: 用来配置规则,消除对特定 packet 的信息记录
      • security: 用于 强制访问配置 的,如 SELinux 使用的规则
        最常用的是 natfilter 这两个 table
    • 预定义的 chain:

      • INPUT: 处理输入数据包
      • FORWARD: 处理转发数据包
      • OUTPUT: 处理输出数据包
      • PREROUTING: 用于目标地址转换 (DNAT)
      • POSTROUTING: 用于源地址转换 (SNAT)
    • 预定义的 target:

      • ACCEPT: 接收数据包
      • DROP: 丢弃数据包
      • REDIRECT: 重定向、映射、透明代理
      • SNAT: 源地址转换
      • DNAT: 目标地址转换
      • MASQUERADE: IP 伪装(NAT)
      • LOG: 日志记录
    • 每个 rule 包含 predicate 条件和匹配该条件的 target (可以认为是 action),
      匹配对应的 predicate 则执行对应的 target 动作,否则,忽略该条 rule,开始对下一条 rule 匹配。
      如果匹配到 chain 的结尾,则返回到 跳转到跳转前的 chain

    • filter 表包含的 chain 为: INPUT, FORWARD, OUTPUT

    • nat 包含的 chain 为: PREROUTING, FORWARD, POSTROUTING

    • mangle 包含的 chain 为: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

Examples

各种常用场景的使用: 封 ip、协议、端口,限制连接数、请求数、并发数等,转发端口、ip、协议控制,改写数据包内容

  1. 日常操作命令

    # iptables -L -n -v  # 展示 filter 表中的所有 chain 的规则, -n 以精确的 ip、数字替代名字, -v 展示详细信息
    # iptables -t nat -L # 展示 nat 表中的所有 chain 的规则
    # iptables -F  # 清空 filter 中所有 chain 的 rules
    # iptables -t nat -F # 清空 nat 表中所有 chain 的 rules
    # iptables -t nat -F FORWARD  # 清空 nat 表中的 FORWARD chain 中所有 rules
    # iptables -S [chain] # 列出 filter 表中的指明的 chain 中的所有 rules,如果 [chain] 不填,则列出对应 table 下所有 chain 的 rules
    # iptables -z [chain [rulenum]] # 清空 filter 表中 [chain] 中的某个 rule [rulenum], 如果 [chain] 或者 [rulenum] 不指定
    # iptables -A chain rule-specification  # 将 rule-specification 插入到 filter 表中的 chain 中
    
  2. 禁止访问本地 loop 地址, 如禁止访问本地 127.0.0.1 地址:

    # iptables -A INPUT -i lo -d 127.0.0.1 -j DROP
    
  3. 禁止访问某个 ip 、某个网段、某个网址:

    # iptables -A OUTPUT -d 192.168.1.1 -j DROP # 禁止访问 192.168.1.1 这个 ip
    # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # 禁止访问 192.168.1.0/24 这个网段
    
  4. 禁止访问某个 ip 的某种协议:

    # iptables -A OUTPUT -i eth0 -d 54.222.178.154 -p tcp -j DROP # 禁止我们的 internal 服务器
    
  5. 开放本机端口:

    # iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启本机 tcp 80 端口
    # iptables -A INPUT -p icmp --icmp-type 8 -J ACCEPT # 允许被 ping 通
    # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接能让数据进来
    
  6. 配置 ip 白名单:

    # iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许 192.168.1.0/24 网段的机器访问当前机器
    # iptables -A INPUT -p tcp -s 192.168.2.1 --dport 3306 # 允许 ip 为 192.168.2.1 的机器访问本机 3306 端口 (mysql 标准端口)
    
  7. 启动 nat 转发:

    # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 54.222.178.154 # 让 192.168.1.0/24 网段机器可以通过 54.222.178.154 访问网络
    
  8. 端口映射:

    # iptables -t nat -A PREROUTING -d 127.0.0.1 -p tcp --dport 2222  -j DNAT --to-dest 54.222.178.154:22 # 访问本地 2222 端口会被转发到 internal 机器的 22 端口 (ssh 转发)
    
  9. 防止 tcp syn flooding attack:

    # iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
    
  10. 字符串匹配

# iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset  # tcp 包中一旦出现 "test" 数据,则 重置该 tcp 连接

References

  1. iptables - ArchLinux wiki
  2. iptables traverse
  3. iptables - WikiPedia
  4. Netfilter Packet Flow
  5. Iptables Tutorial
  6. iptables 详解
  7. 防火墙与 NAT - 鸟哥的私房菜
  8. iptables 设定入门

原文地址:https://www.cnblogs.com/yxhblogs/p/12714545.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


#使用军哥的lnmp配置虚拟主机,需要注意的是要配置hosts文件(这一点官方没有讲到)具体方法:1、修改hosts文件sudo vim /etc/hosts2、在hosts文件中新增一行(这里类似于windows上配置hosts文件)127.0.0.1 www.baidu.com3、保存并重启网络
一、配置编译环境 yum update && yum upgrade yum groupinstall "Development Tools" yum install gcc gcc-c++ pcre* openssl* gd-devel* zlib-devel
一、下载repo文件 二、备份并替换系统的repo文件 三、执行yum源更新操作
LAMP -- Linux Apache MySQL PHP 在CentOS安装的顺序,我一般是Apache -> MySQL -> PHP 第一步、安装并配置Apache 1、使用yum安装 [plain] view plaincopy
一、下载nginx安装包,官网下载中心http://nginx.org/download [root@localhost software]# wget http://nginx.org/download/nginx-1.10.1.tar.gz 二、解压nginx安装包 [root@localhos
1.下载composer curl -sS https://getcomposer.org/installer | php ps:如果出现php无法运行的情况,请先把PHP加入环境变量,具体操作参考《centOS安装PHP》 2.移动或复制composer到环境下可执行 cp composer.ph
一、卸载旧版本的vim 二、安装终端字符处理库ncurses 三、下载Vim8 四、编译安装 五、添加到系统环境变量 六、安装成功
引言 我们在日常的开发过程中,很多时候需要连接服务器查看日志或者在服务器上调试代码。但是,使用 ssh 命令登录服务器每次都需要输出密码,就比较繁琐。因此我们可以使用 sshpass 通过参数指定密码进行登录。解决了这个问题之后,我发现登录服务器之后,还需要手动 cd 切换到项目目录或者日志目录。为
iptables basics Introduction iptables 是一个配置 Linux 防火墙的工具,是 netfilter 项目的一部分。 在 Linux Kernel 3.13 及以上版本中, nftables 将作为后继者取代 iptables 以成为更强大易用的防火墙工具 Bas
一、下载tengine 二、安装tenginx(nginx)的模块依赖库 三、解压并指定安装路径 四、编译安装 五、启动(tengine)nginx 六、访问(tengine)nginx
这篇文章介绍了如何快速部署一套Kubernetes集群,下面就快速开始吧! 准备工作 机器部署规划 主机 | IP | 部署组件 | | master主节点 | 192.168.199.206 | etcd、kube apiserver、kube controller manager、kube sc
一、pip下载 二、解压安装 三、安装完成
1、WebBench安装: yum install ctags(先安装依赖库) mkdir /usr/local/man (创建一个目录不然会报错) wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz tar zxv
1:查看环境: [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 [root@10-4-14-168 html]# chkconfig iptables off 3:配置CentOS
安装 1.检查当前是否有安装php rpm -qa|grep php 如果有安装PHP,那么请先删除这些安装包: yum remove php* 2.安装php源 Centos 5 安装php源: rpm -ivh http://mirro
一、安装 二、配置 三、修改配置文件 四、program 配置 五、启动
Sed 日常使用介绍 简介 是 环境下常用的流处理工具, 可以处理字符流, 文件或者二进制文件流。 各个 发行版都会配备 及其衍生的命令工具, 因此, 掌握该工具的基本用法, 足以满足我们日常的许多文本处理的任务。 以下采用示例的方式对 进行基本用法介绍. 如果有兴趣了解更高级的使用技巧, 本文采用
linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: 注意, 前两行必须填写,且要注释掉。 第一行为shell前行代码,目的告诉系统使用shell。 第二行分别代表运行级别、启动优先权、关闭优先权,且后面添加开机服务会用到。 shell脚本
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2、赋予脚本可执行权限假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限 chmod +x /usr
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB、MB等为单位进行显示,这样比较直观一些。 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹的大小,这个比较实用。 查询当前目录总大小可以使用d