Linux学习之iptables

一、iptables的相关概念:

1、Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件

2、在Linux的内核中使用netfilter构架实现防火墙功能

3、iptables是Linux系统中为用户提供的netfilter管理工具,用于实现对Linux内核中防火墙的管理

4、netfilter/iptables的典型应用:

作为主机防火墙实现外部网络与主机之间的访问控制

作为网络防火墙提供外部网络与内部网络的访问控制

二、iptables服务管理

CentOS 6:

service  iptables  {start|stop|restart|status}

start:读取事先保存的规则,并应用到netfilter上;

stop:清空netfilter上的规则,以及还原默认策略等;

status:显示生效的规则;

restart:清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上;

默认的规则文件:/etc/sysconfig/iptables

CentOS 7:

systemctl  start|stop|restart|status  firewalld.service

systemctl  disable firewalld.service

systemctl  stop  firewalld.service

三、iptables规则管理:

规则的有效期限:

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;

保存规则:保存规则至指定的文件:

CentOS 6:

~]# service  iptables  save

将规则保存至/etc/sysconfig/iptables文件中;下次开机时会自动读取此文件的规则

~]# iptables-save  >  /PATH/TO/SOME_RULES_FILE

CentOS 7:

~]# iptables-save  >  /PATH/TO/SOME_RULES_FILE

重新载入预存规则文件中规则:

通用方法:

~]# iptables-restore <  /PATH/FROM/SOME_RULES_FILE

CentOS 6:

~]# service  iptables  restart

自动生效规则文件中的规则:

(1) 用脚本保存各iptables命令;让此脚本开机后自动运行;

/etc/rc.d/rc.local文件中添加脚本路径;

/PATH/TO/SOME_SCRIPT_FILE

(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;

/etc/rc.d/rc.local文件中添加:

iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE

三、iptables的功能结构:

功能<--链(四表五链):

raw:PREROUTING, OUTPUT

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat:PREROUTING,[INPUT],]OUTPUT,POSTROUTING

filter:INPUT,FORWARD,OUTPUT

四、iptables的匹配规则:

组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;

匹配条件:

基本匹配条件

扩展匹配条件

处理动作:

基本处理动作

扩展处理动作

自定义处理机制

iptables的链:内置链和自定义链

内置链:对应于hook function(五个链)

自定义链:用于内置链的扩展和补充,可实现更灵活的规则管理机制

五、iptables的语法格式:

iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

使用帮助:

CentOS 6: man iptables

CentOS 7: man iptables-extensions

-t table:

raw, mangle, nat, [filter]默认

COMMAND:

链管理:

-N:new, 自定义一条新的规则链;

-X:delete,删除自定义的规则链;

-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:

ACCEPT:接受

DROP:丢弃

REJECT:拒绝

-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;

规则管理:

-A:append,追加;

-I:insert, 插入,要指明位置,省略时表示插入为第一条;

-D:delete,删除;

(1) 指明规则序号;

(2) 指明规则本身;

-R:replace,替换指定链上的指定规则;

-F:flush,清空指定的规则链;

-Z:zero,置零;

iptables的每条规则都有两个计数器:

(1) 匹配到的报文的个数;

(2) 匹配到的所有报文的大小之和;

查看规则:

-L:list, 列出指定鏈上的所有规则;

-n:numberic,以数字格式显示地址和端口号;

-v:verbose,详细信息;

--line-numbers:显示规则的序号;

chain:

PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

匹配条件:

基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;

-s:检查报文中的源IP地址是否符合此处指定的地址或范围;

-d:检查报文中的目标IP地址是否符合此处指定的地址或范围;

-p: {tcp|udp|icmp}

-i:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;

-o:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;

扩展匹配条件: 需要加载扩展模块,方可生效;

隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;

tcp:

--source-port[:port]:匹配报文的源端口;可以是端口范围;

--destination-port[:port]:匹配报文的目标端口;可以是端口范围;

--tcp-flags  mask  comp

例如 SYN,ACK,FIN,RST

例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;

--syn:用于匹配第一次握手,相当于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;

udp:

--source-port[:port]:匹配报文的源端口;可以是端口范围;

--destination-port[:port]:匹配报文的目标端口;可以是端口范围;

icmp

--icmp-type {type[/code]|typename}

echo-request:8

echo-reply:0

显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]];

处理动作:

-j targetname [per-target-options]

ACCEPT

DROP

REJECT

RETURN:返回调用链;

LOG:记录日志;

DNAT:目标地址转换;

SNAT:源地址转换;

MASQUERADE:地址伪装;

...

自定义链:

示例:

1、开放本机web服务器给非192.168.0.0/24网络中的主机访问;

~]# iptables -t filter -A INPUT ! -s 192.168.0.0/24 -d 172.16.17.71 -p tcp --dport 80 -j ACCEPT

2、禁止本机被非172.16.0.0/16网络中的主机进行ping请求;

~]# iptables -I INPUT ! -s 172.16.0.0/16 -p icmp --icmp-type 8 -j DROP

3、开放本机的dns服务给所有主机;

~]# iptables -I INPUT -d 172.16.17.71 -p udp --dport 53 -j ACCEPT

显式扩展:必须显式地指明使用的扩展模块进行的扩展;

1、multiport扩展

以离散方式定义多端口匹配;最多指定15个端口;

[!] --source-ports[,port|,port:port]...:指定多个源端口;

[!] --destination-ports[,port|,port:port]...:指定多个目标端口;

[!] --ports port[,port|,port:port]...:指明多个端口;

~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT

2、iprange扩展

指明连续的(但一般不包括整个网络)ip地址范围;

[!] --src-range [-to]:源IP地址;

[!] --dst-range [-to]:目标IP地址;

~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

3、string扩展

对报文中的应用层数据做字符串模式匹配检测;

--algo {bm|kmp}:字符串匹配检测算法;

[!] --string pattern:要检测的字符串模式;

[!] --hex-string pattern:要检测的字符串模式,16进制格式;

~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT

4、time扩展

根据将报文到达的时间与指定的时间范围进行匹配;

Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

--kerneltz:使用内核上的时区,而非默认的UTC;

~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

5、connlimit扩展

根据每客户端IP做并发连接数数量匹配;

--connlimit-upto n:连接的数量小于等于n时匹配;

--connlimit-above n:连接的数量大于n时匹配;

~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

6、limit扩展

基于收发报文的速率做匹配(令牌桶过滤器);

--limit rate[/second|/minute|/hour|/day]  平均速率   rate为具体的速率

--limit-burst number 峰值速率

~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT

7、state扩展

根据“连接追踪机制”去检查连接的状态;

[!] --state state

conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:

NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;

ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;

RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;

INVALID:无效的连接;

UNTRACKED:未进行追踪的连接;

调整连接追踪功能所能够容纳的最大连接数量:

/proc/sys/net/nf_contrack_max

已经追踪到到的并记录下来的连接:

/proc/net/nf_conntrack

不同的协议的连接追踪时长:

/proc/sys/net/netfilter/

iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时

连接追踪的副作用:

连接追踪功能有最大连接数量限制,虽然可以通过调整参数增加其记录的追踪记录,但是当有大量的连接发往服务器时,会导致有大量的内存空间需要用来保存连接追踪记录,且容易造成内存碎片,久而久之会导致服务器性能下降

注意:前端的负载均衡器不要启用连接追踪机制

~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

如何使用自定义链:

自定义链:需要被调用才能生效;自定义链最后需要定义返回规则;

引用计数不为0的自定义链不能够被重命名,也不能被删除;只能清空其内的规则并解除调用状态,方可重命名或删除

返回规则使用的target叫做RETURN;

~]# iptables -N icmp
~]# iptables -E icmp in-icmp
~]# iptables -A in-icmp -d 172.16.17.71 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A INPUT -d 172.16.17.71 -p icmp -j in-icmp
~]# iptables -A in-icmp -j RETURN     //如果in-icmp中的规则匹配不到,则返回由调用链的规则匹配

netfilter: nat table

nat: network address translation

snat: source nat

dnat: destination nat

pnat: port nat

snat:POSTROUTING, OUTPUT

让本地网络中的主机通过某一特定地址访问外部网络时;

dnat:PREROUTING

把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时;

nat表的target:

SNAT:

--to-source [ipaddr[-ipaddr]][:port[-port]]

--random

~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 172.16.100.67

DNAT:

--to-destination [ipaddr[-ipaddr]][:port[-port]]

~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78:22

MASQUERADE:

源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址;

--to-ports port[-port]

--random

~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE

练习:INPUT和OUTPUT默认策略为DROP;

1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

~]# iptables  -t   filter -A INPUT -d 172.16.17.71 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon  -j ACCEPT
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
~]# iptables -t filter -A OUTPUT-s 172.16.17.71 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT

2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

~]# iptables -t filter -R INPUT 2 -d 172.16.17.71 -s 172.16.0.0/16 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
~]# iptables -t filter -R INPUT 3 -d 172.16.17.71  -s 172.16.0.0/16 -p tcp -m state --state RELATED  -m limit --limit 5/min  -j ACCEPT
~]# iptables -t filter -A INPUT -d 172.16.17.71  -s 172.16.0.0/16 -p tcp -m state --state ESTABLISHED  -j ACCEPT
~]# iptables -t filter -A OUTPUT -d 172.16.0.0/16 -s 172.16.17.71 -p tcp -m state --state ESTABLISHED -j ACCEPT

3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 172.16.17.1-172.16.17.100 -m limit --limit 2/min -j ACCEPT
~]#  iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 172.16.17.1-172.16.17.100  -j ACCEPT
~]#  iptables -t filter -A OUTPUT -s 172.16.17.71 -p tcp --sport 22 -m iprange --dst-range 172.16.17.1-172.16.17.100 -m state --state ESTABLISHED -j ACCEPT

4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

~]# iptables -t filter -A INPUT -d 172.16.17.71 -p --tcp-flags ALL ALL -j DROP

5、允许本机ping别的主机;但不开放别的主机ping本机;

~]# iptables -A INPUT ! -d 172.16.17.71 -p icmp --icmp-type 8 -j ACCEPT
时间: 2024-10-20 03:23:23

Linux学习之iptables的相关文章

Linux学习笔记——iptables浅析

最近总结一些知识点越发吃力了,看来还是知识储备不足,用的不熟啊,还是硬着头皮来吧,争取多写点,毕竟好记性不如烂笔头不是么. 防火墙,就是用于实现Linux下访问控制的功能,它分为硬件的或者软件的防火墙两种.对于TCP/IP的模型来讲,第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测.但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查.所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低.市面上通常的防火墙方案,都是两者

[Linux] 学习笔记之安装学习环境(sshd, lrzsz)

紧接前一篇,在VMWare安装完Linux,这个时候我们要使用远程工具连接到虚拟机上去了,以前一直使用Putty,后来到新公司之后,推荐使用SecureCRT,使用之后,觉得效果不错,但是每次连接都失败,linux新手伤不起,在网上搜啊搜,终于找到解决办法.   搜索了很多资料之后,发现是由于我未在Linux上安装ssh服务导致无法使用SecureCRT连接. 1. 可以使用ssh localhost对此进行测试,具体使用如下: 2. 使用apt-get或者yum安装ssh服务,具体哪种操作系统

linux学习(三)

crontab: 对作业的控制一般有两种at与cron,at一般使用在那些只需要执行一次的任务中,而cron就是用于那些循环的作业.每一个用户都可以有自己的crontab文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件.系统管理员是通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件.crontab文件中每一个条目对应一个任务,每个条目有六个域分别是:分钟1-59,小时0-23,日1-31,月1-12,星期0

快速入门linux系统的iptables防火墙 1 本机与外界的基本通信管理

概述 iptables是一种运行在linux下的防火墙组件,下面的介绍可以快速的学习iptables的入门使用. 特点(重要) 它的工作逻辑分为 链.表.规则三层结构. 数据包通过的时候,在对应表中,规则从上向下匹配,匹配到即跳出,后续规则忽略. 常用于过滤数据包和转发数据包(代理服务器). 工作方式基于IP 端口 和MAC 结构 链名 PREROUTING FORWARD POSTROUTING INPUT OUTPUT 含义 一般是指从外网发送到当前主机上 并且在路由规则处理之前 一般指从外

Linux学习汇总——Linux程序管理,终端类型及命令获取帮助方式

本章Blog相关Linux知识点 计算机=硬件+软件 . 冯诺依曼理论,五大部件:CPU -- 运算器.控制器, 存储器,输入设备,输出设备. Shell 环境配置通过环境变量进行配置的 ,环境变量保存对应用程序的配置,在当前进程有效 .若长期有效,需保存到配置文件中. 语言分类: 解释型语言--写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件:编译型语言:解释性语言在运行程序的时候才翻译,效率比较低.两种方式只是翻译的时间不同 程序与进程的关系: 程序运行--进程启动

Linux学习汇总——Linux程序管理,终端类型及获取命令帮助方式

本章Blog相关Linux知识点 计算机=硬件+软件 . 冯诺依曼理论,五大部件:CPU -- 运算器.控制器, 存储器,输入设备,输出设备. Shell 环境配置通过环境变量进行配置的 ,环境变量保存对应用程序的配置,在当前进程有效 .若长期有效,需保存到配置文件中. 语言分类: 解释型语言--写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件:编译型语言:解释性语言在运行程序的时候才翻译,效率比较低.两种方式只是翻译的时间不同 程序与进程的关系: 程序运行--进程启动

Linux学习—部署yum网络仓库

yum除了可以配置本地仓库外,还可以配置服务器网络仓库,这时需要先配置服务器并上传文件 步骤如下: 1.安装 vsftpd 为了完成服务器与客户端的文件传输,需要使用FTP协议,在Linux下使用vsftpd软件(Very Secure FTP Daemon)完成部署FTP服务器 使用rpm命令安装vsftpd: ① rpm -ivh vsftpd-2.2.2-24.el6.x86_64.rpm 2.启动vsftpd服务及设置重启后自动启动 使用命令netstat查看vsftpd的监听状态为关闭

Linux学习第十二周总结

linux学习第十一周总结 http协议和APACHE 实现LAMP架构 日志管理 网络文件共享服务 一 .HTTP协议和apache 1.HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议. HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等). HTTP是一个属于应用层的面向对象的协议,由于其简捷.

Linux学习路线图及常逛自学网站推荐

今天来给大家科普一下Linux的一些基础知识.(敲黑板)谁的小眼睛还没有看老师,分享开始了. 1.了解Linux的常用版本 红帽子企业Linux(Red Hat Enterprise Linux):它是RedHat公司的Linux发行版,面向商业市场,包括大型机.红帽公司从Red Hat Enterprise Linux 5开始对企业版LINUX的每个版本提供10年的支持,Red Hat Enterprise Linux常简作RHEL.Red Hat Enterprise Linux大约3年发布