Iptables之实操

简介

Netfilter/Iptables (以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台非常低的硬件配置下跑的非常好(本人曾经在赛扬500HZ cpu 64M内存的情况部署网关防火墙)提供近400人的上网服务丝毫不逊色企业级专业路由器防火墙)

Iptables是linux 2.4及2.6内核中集成的服务。其功能与安全性比其老一辈Ipfwadn,ipchains强大的多,Iptables主要工作在OSI七层的二、三四层,如果重新编译内核,Iptables也可以支持7层控制(squid 代理+iptables)。

名称概念:

  • 容器:包含或者说属于的关系

  • Netfilter/Iptables是表(四表)的容器

  • 四表

    • filter:过滤数据包
    • nat:用于网络地址转换(IP、端口)
    • mangle:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
    • raw表:决定数据包是否被状态跟踪机制处理
    • 前三个常用
  • IP tables的表又是链(五链)的容器

    • INPUT链:过滤进入主机的数据包
    • OUTPUT链:处理从主机发出去的数据包
    • FORWARD链:负责转发流经主机的数据包,起转发的作用,和Nat表关系很大
    • PREROUTING链:主机外报文进入位置,所有的数据包进来的时侯都先由这个链处理
    • POSTROUTING链:报文经过路由被转发出去,所有的数据包出来的时侯都先由这个链处理
    • 注意链名大写
  • 链(chains)是规则的容器

  • 规则(policy):一条条过滤的语句

注意:对于filter表的控制是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制

四表中常用的表

Nat表

负责网络地址转换,即来源与目的ip地址和port的转换。应用:和主机本身无关。一般用于局域网共享上网或者特殊的端口转换服务相关

NAT功能一般企业工作场景:

1))用于做企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)2)做内部外部P地址一对一映射(dmz),硬件防火墙映射I到内部服务器,ftp服务。(PREROUTING).

3 ) web,单个端口的映射,直接映射80端口(PREROUTING)。

这个表定义了三个链(Chains),nat 功能就相当于网络的 acl控制。和网络交换机 acl类似

表相关的链

  • OUTPUT:和主机发出去的数据包相关
  • INPUT:和进入主机的数据包相关
  • PREROUTING:数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址,端口等,(通俗比喻,就是收信时,根据规则重写收件人的地址,这看上去很不地道啊!哈哈。)例如:把公网IP:124.42.60.113映射到局域网的10.0.0.19服务器上。如果是web服务,可以把80转为局域网的服务器上9000端口。
  • POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址、源端口等,(通俗比喻,就是寄信时,写好发件人的地址,要让人家回信时能够有地址可回。) ,例如:我们现在的笔记本和虚拟机都是10.0.0.0/24,就是出网的时候被我们企业路由器把源地址改成了公网地址了。生产应用:局域网共享上网。

Filter表

强调:主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。filter表是iptables 默认使用的表。这个表定义了三个链(Chains):.企业工作场景:主机防火墙。

表相关的链

  • INPUT:负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包
  • FORWARD:负载流经主机的数据包,作用是转发的功能,和nat表关系很大
  • OUTPUT:负责处理从主机发出去的数据包

Iptables过程(写这助理解)

流入本机:PREROUTING  -->  INPUT  --> PROCESS(进程)
经过本机:PREROUTING --> FORWARD --> POSTROUTING
从本机流出:PROCESS(进程) --> OUTPUT --> POSTROUTING

iptables表和链的工作流程图


iptables过滤图

iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。

* 防火墙是层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的
* 如果匹配上规则,即明确表明是阻止还是通过,数据包就不再向下匹配新规则了
* 如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配直到匹配默认规则得到明确的阻止还是通过
* 防火墙默认规则是对应链的所有的规则执行完才会执行的
* Iptalbes防火墙规则的执行顺序默认从前到后(从上到下)依次执行,遇到匹配的规则就不在继续向下检查,只有遇到不匹配的规则才会继续向下进行匹配。 # 注意 :拒绝规则DROP如果写在最上层,下面的规则都将不匹配执行,所以插入新的规则可以用-I参数插到最上层

Iptables安装

  • 查看是否安装了iptables:systemctl status iptables
  • 安装iptables:yum install iptables* -y
  • 启动iptables:systemctl start iptables
  • 关闭防火墙: systemctl disable --now firewalld
  • 关闭selinux:vim /etc/selinux/config


Iptables 命令说明

格式:iptables [-t 表名] [参数 链名] [参数 协议] [参数 端口] [参数 动作]

参数表如下:

参数符号 说明
-t 指定操作的表
-L 列出当前的规则
-v 显示数据包和数据包大小
-n 不反解地址
-A 追加一条规则到链中
-I 插入一条规则,插入到顶部
-F 清空
-Z 清空计数器(包数量 、包大小)
-D 删除链中的规则
-R 修改规则
-S 列出所有的规则
-N 创建一个自定义链
-X 删除一个自定义链
-P 指定链的默认策略

iptables使用协议表如下:

条件/协议名 说明
TCP 按TCP协议匹配,http归属到TCP中
UDP 按UDP协议匹配
ICMP 按ICMP协议匹配,类似ping
ALL 所有协议都可以

[UDP协议和TCP协议](TCP/UDP协议_百度百科 (baidu.com))

[ICMP协议](ICMP_百度百科 (baidu.com))

端口搭配参数

参数 说明
--sport 源端口,发送请求的端口
--dport 目标端口,访问的端口

” 动作 “ 表如下:

“动作名” 说明
ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链
REJECT 拦阻该数据包,并传送数据包通知对方
DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
REDIRECT 将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则

-i,-o,-m,-j,-s,-d参数,可以指定网卡,模块,动作,协议,地址

参数 说明
-i 进来的网卡
-o 出去的网卡
-m 指定模块
-j 执行的动作(上表)
-p 指定协议
-s 源地址,发送请求的地址
-d 目标地址,访问的地址

Iptables常用命令

iptables -h 查询帮助

iptables -L -v 列出(filter表)所有规则

iptables -L -n 列出(filter表,默认的)所有规则(区别-v,-n是不反解版)

iptables -L -n -t nat 列出(nat表)所有规则

iptables -F 清除(filter表)所有规则

iptables -F -t nat 清除(nat表)中所有规则

service iptables save 保存配置(保存配置后必须重启iptables)

systemctl restart iptables 重启

Iptables常用语法

-A:追加到规则的最后一条

-D:删除记录

-I:添加到规则的第一条

-p:(proto)规定通信协议,常见的协议有:tcp、udp、icmp、all

-j:(jump)指定要跳转的目标,常见的目标有:ACCEPT(接收数据 包)、DROP(丢弃数据包)、REJECT(重定向)三种,但是一 般不适用重定向,会带来安全隐患

常见案例

案例1:只允许22端口(目标端口)可以访问,其他端口全部无法访问
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
[root@m01 ~]# iptables -L -v
# 查看(结果太长不写了)
[root@m01 ~]# iptables -L -v 案例2:只允许22,80,443端口可以访问(目标端口),其他端口全部无法访问。
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 80 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 443 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 这时获取百度就响应超时了,不知道curl的端口
[root@m01 ~]# curl www.baidu.com
curl: (7) Failed connect to www.baidu.com:80; Connection timed out 案例3:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 80 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 443 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP 案例4:要求能够通过22端口(目标端口)去链接地址192.168.15.81(目标地址),但是其他的不行
# 通俗理解:通过22端口可以连接到192.168.15.81地址,192.168.15.81:22
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 可以通过新开窗口测试,或者新开虚拟机测试 案例5:要求地址192.168.15.71(源地址)允许通过22端口(目标端口)连接地址192.168.15.81(目标地址),其他不行
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 可以从71去连接81,81已经断开 案例6:要求192.168.15.71对外部不可见
[root@prometheus ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP
# 相当于虚拟机里的这个地址对外不可见,会连接不上虚拟机 案例7:要求使用eth0网卡的所有请求全部拒绝(进来的网卡,连接虚拟机)
[root@prometheus ~]# iptables -t filter -A INPUT -p TCP -i etho -j DROP
案例8:使用eth1网卡登录进来的窗口,不允许访问百度。(出去的网卡,连接虚拟机)
[root@prometheus ~]# iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP 案例9:要求访问服务器的8080端口转发至80端口
[root@m01 ~]# iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80 案例10:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
# 先查看windows下的地址:ipconfig > WMnet8 >IPV4地址
[root@m01 ~]# iptables -t filter -I INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j DROP # IP过滤
# 禁止192.168.1.3 IP地址的所有类型数据访问
iptables -A INPUT ! -s 192.168.1.3 -j DROP # 开放80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #开放80端口 # 开放端口范围
iptables -I INPUT -p tcp --dport 22:80 -j ACCEPT #开发22-80范围的端口 # 不允许80端口流出
iptables -I OUTPUT -p tcp --dport 80 -j DROP # filter是默认的表,可以不指定,也可以指定

模块

-m:指定模块

multiport模块

连续匹配多个端口

  • 参数:--dports 的意思是指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)
# 案例:要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP

iprange模块

指定一段连续的ip地址范围

  • 参数:

    • --src-range from[-to]:源地址范围
    • --dst-range from[-to]:目标地址范围
# 案例:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP

string模块

匹配指定字符串

  • 参数

    • --string pattern :指定要匹配的字符串
    • --algo {bm|kmp} :匹配的查询算法
# 案例:要求访问数据包中包含HelloWorld的数据不允许通过
[root@m01 ~]# cd /usr/share/nginx/html/
[root@m01 html]# rm -rf ./*
[root@m01 html]# echo "Helloworld" > index.html
[root@m01 html]# echo "Hello" > demo.html # 规则
[root@m01 html]# iptables -t filter -A INPUT -p TCP -m string --string "Helloworld" --algo kmp -j DROP [root@m01 html]# curl http://192.168.15.81/demo.html
Hello
[root@m01 html]# curl http://192.168.15.81/index.html # Helloworld被过滤掉了

time模块

根据时间段匹配数据包

  • 参数:
  • --timestart hh:mm[:ss] :开始时间
  • --timestop hh:mm[:ss] : 结束时间
  • --monthdays day[,day...] : 指定一个月的某一天
  • --weekdays day[,day...] : 指定周 还是 周天
# 案例: 要求每天的22到23之间,不允许访问
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m time --timestart 14:00 --timestop 15:00 -j DROP # 注意这里使用的时间是UTC,记得-8

icmp模块

禁ping, 默认本机无法ping别人 、别人无法ping自己

  • 参数:--icmp-type {type[/code]|typename}
  • echo-request (8) 请求
  • echo-reply (0) 回应
# 要求别人不能ping本机,但是本机可以ping别人(优化上普通案例3)
[root@m01 ~]# iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP
# 本机ping百度
[root@m01 ~]# ping www.baidu.com
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=128 time=15.1 ms
# 别人不能ping本机
[root@m01 ~]# ping 192.168.15.81
PING 192.168.15.81 (192.168.15.81) 56(84) bytes of data.

connlimit模块

限制链接数,并发连接数

  • 参数

    • --connlimit-upto n : 如果现有连接数小于或等于 n 则 匹配
    • --connlimit-above n : 如果现有连接数大于n 则匹配
# 要求主机连接最多有2个(最多开两个窗口)
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP


limit模块

针对 报文速率 进行限制; 秒、分钟、小时、天。

  • 参数

    • --limit rate[/second|/minute|/hour|/day] :报文数量
    • --limit-burst number :报文数量(默认:5)
# 案例 :要求限制速率在500k/s左右,大约每秒为333个数据包
# 生成一个测试文件
[root@m01 ~]# dd if=/dev/zero of=a.txt bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 7.64477 s, 137 MB/s
# 限速(控制是不准确的!)
[root@m01 ~]# iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT
[root@m01 ~]# iptables -t filter -A OUTPUT -p TCP -j DROP # 传输
[root@m01 ~]# scp a.txt root@192.168.15.71:/root

传输是不准确的,慢慢在降低,直到稳定!


补充知识:

查看centos版本

cat    /etc/redhat-release

查看本机端口占用的命令:

命令:netstat -nutlp

[root@m01 ~]# netstat -nutlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1591/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1304/sshd
tcp6 0 0 :::80 :::* LISTEN 1591/nginx: master
tcp6 0 0 :::22 :::* LISTEN 1304/sshd

iptables脚本设置

#!/bin/sh
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
service iptables save
systemctl restart iptables.service

补充案例

企业案例

如果日志文件/var/logmessages出现:kernel:nf_conntrack:table full,droppint packet,解决办法如下:

# 上述的结果会让业务访问的很慢
net.nf_conntack_max = 250000000
net.netfilter.nf_conntrack_max = 250000000
# 响应时间调短
net.netfilter.nf_conntrack_timeout_established = 170
net.netfilter.nf_conntrack_timeout_wait = 120
net.netfilter.nf_conntrack_timeout_close_wait= 60
net.netfilter.nf_conntrack_timeout_fin_wait = 100

易错点

设置完iptables规则后保存(service iptables save)有时候启动会失败

在第一步的时候安装iptables时,请用 yum install -y iptables,加上,不然有些包装不上,系统默认安装的包不齐全

在过滤端口的时候,容易把自己干掉,从虚拟机上清除掉所有规则就好


【有错请指正,感谢指正】


Iptables 实操的更多相关文章

  1. 72 个网络应用安全实操要点,全方位保护 Web 应用的安全

    原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?         本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...

  4. Mysql MHA(GTID)配置(实操)

    实现环境 centos6.7 MYSQL5.6.36 主:192.168.1.191 从1:192.168.1.145 从2:192.168.1.146 监测:放在从2上 192.168.1.146 ...

  5. Selenium之unittest测试框架详谈及实操

    申明:本文是基于python3.x及selenium3.x. unittest,也可以称为PyUnit,可以用来创建全面的测试套件,可以用于单元自动化测试(模块).功能自动化测试(UI)等等. 官方文 ...

  6. unittest测试框架详谈及实操(二)

    类级别的setUp()方法与tearDown()方法 在实操(一)的例子中,通过setUp()方法为每个测试方法都创建了一个Chrome实例,并且在每个测试方法执行结束后要关闭实例.是不是觉得有个多余 ...

  7. .net基础学java系列(四)Console实操

    上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...

  8. RTN 实操

    创建房间 test-rtn 10001 e2uii6r7r 8LfwOcreM76OiV1V1y8jXrMG_BNa-cmktpWUznRa:kdYdsEpcYLc5ceWEHPaK0ZDI7Qc=: ...

  9. 6.3 Pandora 实操 - 数据立方

    简介 数据立方是适用于大规模实时数据(每天百亿条,10TB+ 级别数据)查询与分析的数据库系统,提供交互式的访问数据的能力,支持数据过滤.分组.聚合,实现亚秒级以内对亿行级别的数据表进行多维探索分析. ...

随机推荐

  1. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  2. Cocoapods 版本更新与更新到指定版本

    1.本地现有的Cocoapods的版本号是1.1.0.rc.2,想升级到最新版本 1.先切换gem源 gem sources --remove https://rubygems.org/ gem so ...

  3. Spring Cloud服务离线

    服务离线,即某服务不能对外提供服务了.服务离线的原因有两种:服务下架与服务下线.这两种方案都是基于Actuator监控器实现的. 服务下架:将注册到Eureka Server中的Eureka Clie ...

  4. Js和Thymeleaf如何获取model中的值

    一.Jquery获取Model中的数据 1.将model中的值赋给hidden,然后Js获取隐藏域的值. 后台的实现: @RequestMapping("/QEditorMod1" ...

  5. springboot中如何向redis缓存中存入数据

    package com.hope;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jack ...

  6. 注册页面css版本

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. Nginx 中 location 的匹配顺序

    nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ...

  8. [Java Web 王者归来]读书笔记3

    第四章 JSP JSP基本语法 1 JSP中嵌入Java 代码 <% Java code %> 2 JSP中输出 <%= num %> 3 JSP 中的注释 <%-- - ...

  9. 使用bochs调试汇编程序

    使用bochs调试汇编程序 前面我们已经搭建好了bochs的环境,并且将我们的汇编程序写入了硬盘里面,现在我们来看看如何通过bochs来调试我们的程序. 前文:https://www.cnblogs. ...

  10. 使用.NET 6开发TodoList应用(3)——引入第三方日志库

    需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选 ...