iptables 防火墙规则

 

IP报文

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TCP报文

 

 

 

 

 源端口和目标端口:各占2个字节,16比特的端标语加上32比特的IP地址,共同构成相当于传输层办事接见点的地址,即“插口”;

 这些端口可用来将若干高层和谈向下复用;

序号字段和确认序号字段:

 序号:占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而起数据供100字节,则下一个报文段的序号就是400;

 确认序号:占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;

 因为序号字段有32比特长,可以对4GB的数据进行编号,如许就可包管当序号反复应用时,旧序号的数据早已在收集中消散了;

数据偏移字段

 数据偏移:占4比特,默示数据开端的处所离TCP报文段的肇端处有多远。这实际上就是TCP报文段首部的长度。因为首部长度不固定,是以数据偏移字段是须要的。

 保存字段: 6比特,供往后应用,今朝置为0。

6个比特的把握字段

 紧急比特URGent:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长;

 确认比特ACK:只有当ACK=1时,确认序号字段才有意义;

 急迫比特PSH:当PSH=1时,注解恳求远地TCP将本报文段立即传送给其应用层,而不要比及全部缓存都填满了之后再向上交付。

 复位比特ReSeT:当RST=1时,注解呈现严重错误,必须开释连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;

 同步比特SYN:在建树连接时应用,当SYN=1而ACK=0时,注解这是一个连接恳求报文段。对方若赞成建树连接,在发还的报文段中使SYN=1和ACK=1。是以,SYN=1默示这是一个连接恳求或毗邻接管报文,而ACK的值用来区分是哪一种报文;

 终止比特FINal:用来开释一个连接,当FIN=1时,注解欲发送的字节串已经发完,并请求开释传输连接;

窗口字段

 窗口Window:占2字节,默示报文段发送方的接管窗口,单位为字节。此窗口告诉对方,“在未收到我的确认时,你可以或许发送的数据的字节数至多是此窗口的大小。”

 通知窗口advertised window:接管端按照其接管才能承诺的窗口值,是来自接管端的流量把握。接管端将通知窗口的值放在TCP报文的首部中,传送给对方。

 拥塞窗口congestion window:是发送端按照收集拥塞景象得出的窗口值,是来自发送端的流量把握。

 查验和覆盖了全部的TCP报文段:TCP首部和TCP数据。这是一个强迫性的字段,由发端策画和存储,由收端进行验证。

选项字段容许每台主机设定可以或许接管的最大TCP载荷才能(缺省536字节) 。

 

 

 

 

 

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

Sequence number(顺序号码)

Acknowledge number(确认号码)

 

 

TCP连接过程详解  

 

 

LISTEN:侦听来自远方的TCP端口的连接请求

 

SYN-SENT:再发送连接请求后等待匹配的连接请求

 

SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认

 

ESTABLISHED:代表一个打开的连接

 

FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

 

FIN-WAIT-2:从远程TCP等待连接中断请求

 

CLOSE-WAIT:等待从本地用户发来的连接中断请求

 

CLOSING:等待远程TCP对连接中断的确认

 

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

 

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

 

CLOSED:没有任何连接状态

 

 

 

原理TCP

 

3次握手,4次断开

TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。

1)第一次握手:建立连接时,客户端A发送SYN包服务器B,并进入SYN_SEND状态,等待服务器B确认。

2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN,同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK,此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

确认号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。

 

 

 

 

 

 

 

1.01 小时

 

 

 

 

 

 

 

 

 

 

关闭连接:  下面两张图一起看

 

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

 CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

 

 

 

 

 

四次断开 流程

1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 

2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 

3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。 

4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

 

 

描述过程:
Client调用close()函数,给Server发送FIN,请求关闭连接;Server收到FIN之后给Client返回确认ACK,同时关闭读通道(不清楚就去看一下shutdown和close的差别),也就是说现在不能再从这个连接上读取东西,现在read返回0。此时Server的TCP状态转化为CLOSE_WAIT状态。
Client收到对自己的FIN确认后,关闭 写通道,不再向连接中写入任何数据。
接下来Server调用close()来关闭连接,给Client发送FIN,Client收到后给Server回复ACK确认,同时Client关闭读通道,进入TIME_WAIT状态。
Server接收到Client对自己的FIN的确认ACK,关闭写通道,TCP连接转化为CLOSED,也就是关闭连接。
Client在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSED状态,TCP协议关闭连接过程彻底结束。

 

 

 

 

 

 

 

 

 

 

Linux  网络防火墙

Netfilter:frame

Iptables  数据报文过滤,NAT,mangle等规则生成的工具

 

网络:IP报文首部,TCP报文首部

 

 

防火墙: 硬件,或者也是软件

真正实现防火的是规则(匹配标准,处理办法)

 

Framework

  默认规则

 

 

规则:匹配标准

Ip  SIP(源IP)   DIP(目标IP)

TCP  SPORT(源端口)    DPORT(目标端口)

UDP   SPORT(源端口)    DPORT(目标端口)

ICMP  icmp-type 报文类型  (icmp主要用于ping的)

 

 

 

 

Hock function  钩子函数

 

5个钩子函数:

 

 Input  在选路确定之后,且数据包的目的是本地主机

 Output  来自本机进程的数据包在其离开本地主机的过程中

Forward 目的地是其它主机地数据包

Prerouting  在完整性校验之后,选路确定之前

postrouting  在数据包离开本地主机“上线”之前

 

 

Filter (过滤) 表

Input

Output

Forward

 

Nat地址转换 表

Prerouting

postrouting

 

Mangle(拆开,修改,封装) 表

Prerouting

postrouting

Input

Output

Forward

 

 

 

 

 

 

防火墙联链

 

 

为了减少“无效匹配”次数,除了可以调整防火墙的规则顺序外,还有一个法宝就是使用用户自定义链。不过,在使用用户自定义链之前,我们必须先想好如何分类这些规则才能达到最精简的效果。比如,可以根据“上层协议”来区分,也可以根据“应用层协议”区分,也可以根据ip来划分,总之没有一定的标准,也没有永远正确的答案,只要能够让整个防火墙的无效匹配次数降到最低,那就是我们所需要的。

 

 

每个规则都有两个内置的计数器

被匹配的报文个数

被匹配的报文大小之和

 

 

匹配标准:

通用匹配    

 -s  或者 --src 指定地址

-d   或者 --dst  指定目标地址

-p  {tcp | udp | icmp }  指定协议

-i  interface 指定数据报文流入的借口

-o  interface  指定数据报文流出的接口

 

 

-j   target 跳转

     Accept  允许

     Drop  拒绝

     Reject 拒绝

 

   扩展匹配:

 隐含扩展:不用特别指明那个模块进行的扩展,因此此时使用

                       -p {tcp|udp|icmp|

                       --sport   源端口

                        -dport 目标端口

 

               --tcp-flags mask comp  只检查mask指定的标志位,是逗号分隔的标志列表,  comp :此列表中出现的标记为必须为1, comp中没出现,而mask中出现的,必须为0

 例  --tcp-flags SYN,FIN,ACK,RST  SYN  

 代表这四个标志位,只有SYN为 1,其他都为0,也就代表,这是三次握手的第一次 ,这个语法的简写是 --syn

 

 

 

 

 

 

 

 

 

 

 

-p  icmp

--icmp-type

   0 :echo-reply

   8 : echo-request

   

 

 

-p  udp

--sport

 --dport

 

 

 

 

                       

 显示扩展,必须指明那个模块进行的扩展,在iptables中,使用 -m选项可完成此功能

 

 

State:状态扩展

  结合ip_conntrack 追踪回话的状态

   NEW 新连接请求

   ESTABLISHED:已建立的连接

INVALID 非法连接

RELATED 相关联的

 

-m state --state NEW , ESTABLISHED-j ACCEPT

检查状态,并且状态为 NEW(新连接请求的) , ESTABLISHED ( 已经建立的连接)) 通过

 

 

根据状态连接,来实现数据包报文的放行

 

iptables -t filter -A INPUT -d 192.168.12.11   -p tcp --dport 22 -j ACCEPT

Service iptables save  保存防火墙规则

 

 

 

 

 

防火墙规则保存在 /etc/sysconfig/iptables

 

 

Cat  /etc/sysconfig/iptables

 

 

 

然后在

Service iptables restart

 (按理说这时候防火墙规则应清空的)

 

 

Iptables -L -n

 

 

 

可以看到 即使防火墙重启了,规则还在,所以我想重启的时候防火墙会读取 /etc/sysconfig/iptbales 里的内容

 

 

 

 

 

 

保存防火墙的规则有两种

 

1  service iptables save

默认保存在 /etc/sysconfig/iptables

 

2 iptables-save  > /etc/sysconfig/iptables.2016  

指定防火墙规则保存在 /etc/sysconfig/iptables.2016文件里

 

重启以后,要第二种方式保存规则的办法生效
iptables-restore < /etc/sysconfig//iptables.2016  

是恢复文件/etc/sysconfig//iptables.2016  中的规则到当前系统

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Iptables [-t talble(表名) ]  COMMAND  chanin [num] 匹配标准  -j 处理办法

 

        

Iptables -t filter -A INPUT -s 172.16.0.0/16  -j DROP

拒绝172.16.0.0 网段的 IP段

 

 

 

 

 

 

 

马哥防火墙第二节课

 

  

命令

管理规则

  -A 添加一条规则,添加在链的尾

  -I  CHIN [num] 插入一条规则,插入为对应chin上的第num条

  -D  CHIN [num] 表示删除指定规则:

   -R  CHIN [num] 替换指定的规则

管理链

 -F【chain】  flush  清空指定规则链

 -P CHAIN 设定指定链的默认策略

 -N 自定义新的空链

 -X 删除一个自定义的空链

 -Z 重置规则链中所有的规则计数器

-E  重命名自定义链条

 

查看类

-L  指定表中的规则

   -n: 以数字格式显示主机地址和端口号

-v  显示规则详细信息

-x  显示计数器的精确值

--line-numbers 显示规则号码

    

Iptables -L -n -v  显示防火墙详细规则

 

 

 

 

 

动作(target):

 ACCEPT 放行

 DROP  丢弃

 REJECT    拒绝

 DNAT  目标地址转换

 SNAT  源地址转换

 Redirect  端口重定向

 NASQUEADE 地址伪装

LOG  日志

MARK  打标机

 

 

 

 

 

放行  192.168.12.33 对于本机192.168.12.32 sshd  22/tcp的访问

 

Iptables  -t filter -A INPUT  -s 192.168.12.33 -d  192.168.12.32  -p tcp  --dport 22 -j   ACCEPT

 

 

Iptables -t filter -A OUTPUT  -s  192.168.12.32   -d 192.168.12.33  -p tcp  --sport 22 -j ACCEPT

 

 

 

Iptables -L -n

 

 

 

 

 

 

service iptables status

 

 

 

 

Iptables 不是服务,但是有服务脚本,服务脚本主要作用在于管理保存的规则

 

 

 

Lsmod  

lsmod 命令:是一个小程序,用来显示文件、proc/modules的信息,也就是显示当前内核模块装载的模块。主要用来 查看防火墙的模块有没有开启

 

 

 

 

 

 

 

 

Service iptables start

 

 

 

 yum -y install httpd vsftpd mysql-server

 

 

放行  192.168.12.33 对于本机192.168.12.32 sshd  22/tcp的访问

 

Iptables  -t filter -A INPUT  -s 192.168.12.33 -d  192.168.12.32  -p tcp  --dport 22 -j   ACCEPT

 

 

Iptables -t filter -A OUTPUT  -s  192.168.12.32   -d 192.168.12.33  -p tcp  --sport 22 -j ACCEPT

 

 

 

Iptables -L -n  -v

显示防火墙详细信息

 

 

 

 

 

Service httpd start

 

 

打开网页输入192.168.12.32 (web服务器)  可以访问

 

 

 

 

然后

Iptables -P  INPUT  DROP

Iptables -P  OUTPUT  DROP

Iptables -P  FORWARD DROP

Web服务器上拒绝所有放行和通过的端口

 

 

 

会发现看不到了,防火墙拒绝了所有的访问,除了你刚刚设置的ssh访问

 

用真实机(同网段的) ping不通  web服务器的

 

 

 

 

 

 

 

允许别的主机访问本机的80端口  ,

Iptables -I  INPUT -d 192.168.12.32  -p tcp   --dport 80  -j  ACCEPT

 

报文能进来,但是不能出去,所以还要添加

 

 

iptables -I  OUTPUT  -s 192.168.12.32  -p tcp   --sport 80  -j  ACCEPT

 

 

现在在用真实机子访问 192.168.12.32 web服务器

 

 

能运行了

 

192.168.12.32 只有80端口和22端口能让别的主机访问,真实主机 依然还是ping不通 192.168.12.32

 

 

 

 

 

 

 

切换到 Web服务器(192.168.12.32)

现在ping 自己也ping不通了

 

设置让自己能够ping通自己

iptables -A INPUT  -s 192.168.12.32  -d  192.168.12.32  -i  lo  -j ACCEPT

iptables -A OUTPUT  -s 192.168.12.32  -d  192.168.12.32  -o  lo  -j ACCEPT

 

 

 

除了ping自己以外,ping 任何人也ping不通的

 

 

 

现在设置我们可以ping任何人,但别人不能ping我们,ping 是icmp协议

 iptables -A  OUTPUT -s 192.168.12.32  -p  icmp  --icmp-type 8 (固定值)    -j ACCEPT

 iptables -A  INPUT  -d 192.168.12.32  -p  icmp  --icmp-type 0 (固定值)    -j  ACCEPT

 

现在ping同网段的别的主机  

Ping 192.168.12.30

 

 

 

 

现在们可以ping任何人,但别人不能ping我们

 

 

 

 

 

 

 

如果是一台web服务器,那么防火墙设置 就请求80端口,那么就能够预防DDOS,洪水攻击

 

 

 

 

 

 

Ip_conntrack

Linux中有一个基于Netfilter的连接跟踪机制,即ip_conntrack,每一个conntrack表示的就是一个流,该流里面保存了大量的信息字段,这些字段本地有效,指导着数据包的转发策略

 

 

/proc/net/ip_conntrack 找不到这个配置文件,晕

Red hat 6 当中。配置文件的位置在于

vim /proc/net/nf_conntrack

 

 

 

可以看到,red hat 6( ip是192.168.12.11 ) 只跟真实主机有ssh服务器的联系

 

 

 

或者你用

 Iptstate 提供 top 类界面,可用来实时查看 iptables 的状态。

 

 

192.168.12.1(也就是本机) 端口63574(随机) 连接 主机 192.168.12.11 的ssh服务器

 

 

 

如果没有这个命令  yum install iptstate

 

 

 

Iptstate  -t

iptstate命令以top指令类似的风格时显示Linux内核中iptables的工作状态。

显示所有链接的个数

 

 

Service iptables stop

 

一停止模块,追踪功能也停止了

 

查不到任何信息

 

 

 

 

 

 

modprobe nf_conntrack_ipv4

手动把模块装上去

 

 

 

cat /proc/net/nf_conntrack

 

本地和真实主机的ssh连接信息 出现了

 

 

Ip_conntrack  有便利,有坏处,慎用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验

有个服务器

 192.168.12.11

放行 sshd ,httpd 服务

 

 

 

 

切换到 192.168.12.11 服务器

 

 

 iptables -A INPUT -d 192.168.12.11  -p tcp  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

 

放行任意用户 连接本地(192.168.12.11)的22端口,并且,状态是 NEW,(新连接请求

) ESTABLISHED (已经连接的)

 

 

 

Lsmod | grep ip

 

 

可以看到,已经开始追踪了

 

 

 

 

 

 

 

 

 

 

 

 

 iptables -A OUTPUT -s 192.168.12.11 -p tcp --sport 22  -m state --state ESTABLISHED -j  ACCEPT

 

 让连接的用户出去     状态是 已经建立的连接 22端口

 

iptables -A INPUT -d 192.168.12.11  -p tcp  --dport 80 -m state --state NEW,ESTABLISHED -j  ACCEPT

 

 

放行任意用户 连接本地(192.168.12.11)的80端口,并且,状态是 NEW,(新连接请求

) ESTABLISHED (已经连接的)

 

 

iptables -A OUTPUT -s 192.168.12.11 -p tcp --sport 80  -m state --state ESTABLISHED -j  ACCEPT

 

 

 

让连接的用户出去     状态是 已经建立的连接 80端口

 

 

 

 

 iptables -P  INPUT DROP

 iptables -P OUTPUT DROP

拒绝所有链接,端口

 

 

 

 

本机输入192.168.12.11

 

 

 

 

可以访问

 

 

 

 

Iptstate

 

 

 

查看连接状态

可以看到本机的 192.168.12.1 (真实主机)  连接了   80端口,等信息

 

 

 

 

 

 

 

red hat 中

 Nf_Conntrack 保存 可以连接多少条 连接数的配置文件在

 

  /proc/sys/net/netfilter/nf_conntrack_max   

视频里是

 /proc/sys/net/ipv4/ip_conntrack_max  但是我这里没有,因为视频版本太旧了

 

 

 

 

理解nf_conntrack和调整nf_conntrack_max  nf_conntrack 工作在 3 层,支持 IPv4 和 IPv6,而 ip_conntrack 只支持 IPv4。目前,大多的 ip_conntrack_* 已被 nf_conntrack_* 取代,很多 ip_conntrack_* 仅仅是个 alias,原先的 ip_conntrack 的 /proc/sys/net/ipv4/netfilter/ 依然存在,但是新的 nf_conntrack 在 /proc/sys/net/netfilter/ 中,这个应该是做个向下的兼容

 

 

 

这里就不做修改了

 

所以得nf_Conntrack 的配置文件

 

 

 

 

 

 

 

 

 

 

现在放行别人ping自己

 

 

 iptables -A INPUT -d  192.168.12.11 -p icmp --icmp-type 8  -m state --state NEW,ESTABLISHED -j ACCEPT

 允许任何 地址从我这里进来,走的是icmp ( 也就是ping )   协议

 

 

iptables -A OUTPUT -s 192.168.12.11 -p icmp --icmp-type 0  -m state --state ESTABLISHED -j ACCEPT

 

允许任何 地址从我这里出去,走的是icmp ( 也就是ping )  协议

 

 

然后打开真实主机,看看是否能够ping通

 

 

 

OK

 

 

 

 

 

 

Iptables -L -n --line-numbers

查看防火墙规则,并且显示行号

 

 

 

 

 

可以看到,出去的规则有三条,现在我要把他设置成一条规则

 

 

 iptables -I OUTPUT -s 192.168.12.11  -m state --state ESTABLISHED -j  ACCEPT

 

 

 

 

然后不断的 iptables -L -n -v

 

 

 

你会看到,放出的规则当中,一直都是第一条匹配到了,得到了数据,其他的都可以删了

 

 

不断的

Iptables -D  OUTPUT 2

删除 OUTPUT 放行的防火墙规则中的第二条规则

 

 

 

 

Iptables -L -n -v

然后看到放出的规则当中,只有一条通用的规则

 

现在用 真实主机去访问 192.168.12.11 服务器的80端口。看看是否能通

 

OK

 

 

 

 

 

 

 

 

 iptables -A INPUT -i lo -j ACCEPT

 iptables -A  OUTPUT -o lo -j ACCEPT

允许自己ping自己

 

 

 

以下的实验没成功  不要看

 

现在 192.168.12.11

Service vsftp start

开启 ftp 服务

 

 

然后用另外一台机子(192.168.12.39)链接,

ftp 192.168.12.39

账号 ftp (ftp默认机制有匿名用户,不需要密码)

密码

Ls

 

 

这时候你ls 会看到,ls没用,因为他是现在是数据连接了,因为我们只开启了21端口,只能链接ftp,不能传送数据  ,此时ftp用户连接着本地的Ftp 服务器,所以他们们的状态是 相关联 ( RELATED)的,

 

 

 

再切换回 192.168.12.11

 

Iptables -A INPUT -d 192.168.12.1  -p tcp  -m state --state ESTABLISHED,RELATED  -j  ACCEPT

允许 任何ip 访问本地的 192.168.12.1  只要他的状态是 相关联的,或者是一直保持联系的

 

 

想要 ftp 能够ls 必须要 装上两个模块 (ip_conntrack_ftp  和 ip_nat_ftp ),并且

 

在防火墙规则当中,放行的规则要包过

 

RELATED,ESTABLSHED  

 

 

现在

vim /etc/sysconfig/iptables-config

 

 

 

 

 

IPtables -L -n

 

 

在放行的规则添加规则,   在进入的时候添加 规则

 

 

 iptables -A INPUT -d 192.168.12.11  -p tcp -m state --state ESTABLISHED,RELATED -j  ACCEPT

放行只要状态是 相关联的,和状态是已经连接的任何IP

 

 

 现在修改 放行的规则,加上RELATED 状态

iptables -R  OUTPUT 1 -s 192.168.12.11  -m state --state  ESTABLISHED,RELATED -j ACCEPT

 

是要状态是正在连接着的,相关联的     统统放行

 

 

 

 

 

 

 

第三节课

 

 

 

 

 显示扩展,必须指明那个模块进行的扩展,在iptables中,使用 -m选项可完成此功能

 

-m   iprange

 --src-range

 --dst-ranges

 

 

 

iptables -A INPUT -p tcp -m iprange  --src-range 192.168.12.1-192.168.12.100 --dport 22 -m state --state NEW,ESTABLISHED -j  ACCEPT

 

放行状态是 新连接的,或者 已经连接的  192.168.12.1 - 192.168.12.100 任意IP 连接本地的22号端口

 

 

 

 

 

-m   connlimit 连接数限制

例:限制某个IP最多同时只能发起 多少个连接请求

 

 --connlimit-above n  低于了n个

 

 

 

 

 iptables -A  INPUT -d 192.168.12.11  -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT

 

访问192.168.12.11 IP 80端口的 ,同时低于两个请求就放行,超过两个以上不放行

 

 

 

 

 

-m  limit

--limit  速率  (每秒多少人)

--limit-burst   给的是上限  (一批多少人)

 

 

 

 

Iptables -D  INPUT 1

删除进来的第一个规则

 

 

 

-m string

 

 --algo {bm |  kmp }

--string “字符串” 

 

 

 

切换到 192.168.12.11 服务器

 

/var/www/html/index.html

里编写h7n9 dw a dwa d dda gd

 

用真实主机去访问

 

 

 

现在我要用防火墙去过滤某些字符串,只要页面包含 h7n9 的字符串统统拒绝

 

iptables -A OUTPUT   -s 192.168.12.11  -m string  --algo  kmp  --string "h7n9" -j REJECT

  客户端 访问内容包含 “h7n9”的字符串统统拒绝

 

 

 

 

 

 

现在用真实主机访问下试试

 

 

 

 

 

 

 

过滤成功

 

 

 

 

 

 

 

 

 

 

 

 

 

iptables -A  INPUT  -d 192.168.12.11 -p icmp --icmp-type 8   -j  LOG --log-prefix "--firewall log for icmp-- "

记录 任意IP 只要ping了自己 ,都会记录在日志文件当中,

 

 

tail -F  /var/log/messages

 

 

与此同时我用192.168.12.100 的主机

Ping 192.168.12.11

 

然后在切换到192.168.12.11

 

可以看到别人在ping 我们,并且有详细的参数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第四节   nat及过滤   

 

 

 

 

 

 

Iptables -N  clean_in

定义一条新的规则链条

 

Iptables -L -n

 

 

 

可以看到第三个规则链条

 

 

 

 

 

Iptables -A  clean_in  -d  255.255.255.255  -p  icmp  -j  DROP

默认拒绝所有

 

 

iptables -L -n  --line-numbers

 

 

 

 

 

 

 

 

 

iptables -A  clean_in  -d  192.168.255.255  -p  icmp  -j  DROP

 

 

 

 

 iptables -A  clean_in -p  tcp  ! --syn -m state --state  NEW  -j  DROP

 

--syn 是三次握手的第一次的简写

如果是tcp协议,并且不是三次握手的第一次,又是新的状态  默认拒绝

 

 

iptables -A  clean_in  -p tcp  --tcp-flags  ALL  ALL -j  DROP

也是一条默认拒绝的规则

 

 

iptables -A  clean_in  -p tcp  --tcp-flags  ALL  NONE  -j  DROP

默认拒绝的规则

 

 

iptables -A  clean_in  -d 192.168.12.11  -j  RETURN

 

 

iptables -I  INPUT  -j  clean_in

 

无论到那个地址,只要到INPUT 规则的链条,先交给 clean_in 链条进行处理

Clean_in 如果没问题,再交给 INPUT 处理

 

 

 

 

 

 

IPtables -L -n  --line-numbers

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 iptables -X  clean_in

 

删除这条防火墙规则,他说有引用链条,所以先取消引用链条

 

 

 

 

 

 

 

暂时删除不了

 

 

 

 

 

 

 

 

 

 

利用iptables的recent模块来抵御DOS攻击

 

 

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

如果访问我 ssh 22号端口的连接到达3个立即拒绝

 

1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

 

 

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

 

最近对我们的服务器上的ssh 发起请求的连接的IP 地址记录下来

 

 

 

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

 

 

2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。

 

 

 

下面对最后两句做一个说明:

 

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

 

2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

--update 是指每次建立连接都更新列表;

--seconds必须与--rcheck或者--update同时使用

--hitcount必须与--rcheck或者--update同时使用

 

 

 

 

 

 

 

 

iptables  -A  INPUT  -d 192.168.12.11  -p tcp  --dport 22  -m connlimit  --connlimit-above  3  -j  DROP

 

如果访问 192.168.12.11 主机的  ssh 服务的 22号端口的连接到达3个立即拒绝

 

 

 

 

 

 

 

 Recent 模块,--set设置,SSH 空间(模块)

最近对我们的服务器上的ssh 发起请求的连接的IP 地址记录下来

 

 iptables -A INPUT -d 192.168.12.11  -p tcp --dport 22 -m state --state NEW  -m recent --set --name SSH

 

 

 

 iptables -A INPUT -d 192.168.12.11  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds  300 --hitcount 3  --name SSH  -j  DROP  

3.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。

 

 

Iptables -L -n

 

 

 

 

测试

我复制了3次 远程登录连接,第三次就被锁定了

 

 

 

 

 

 

 

可以看到规则写的连接数已经大于3个,所以拒绝了

 

3个太小,稍微坐下调整

 

 

 

iptables -R INPUT 2 -d 192.168.12.11  -p tcp --dport 22 -m connlimit  --connlimit-above 6 -j DROP

 

 

 

替换第二条规则, 如果访问 192.168.12.11 主机的  ssh 服务的 22号端口的连接到达6个立即拒绝

 

 

 

 

 

 

 

 

一些参数

屏蔽一个IP
# iptables -I INPUT -s 192.168.0.1 -j DROP

怎么防止别人ping我??
# iptables -A INPUT -p icmp -j DROP

防止同步包洪水(Sync Flood 
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT

防止各种端口扫描 
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

Ping洪水攻击(Ping of Death 
#iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NAT 应用

 

DNAT 目标地址转换

SNAT 源地址转换 (POSTROUTING , OUTPUT)

 

 

 

 

-j  SNAT

  --to-source

 

 

 

注意:【系统在路由及过虑等处理直到数据包要被送出时才进行SNAT】

(有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用)
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING链)
 源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池
 (一组连续的 IP 地址)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
 -j SNAT --to 1.1.1.1
将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
 -j SNAT --to 1.1.1.1-1.1.1.10
同上,只不过修改成一个地址池里的 IP

 

 

SNAT基于原地址的转换

基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能

所以我们在iptables中就要定义到底如何转换:

定义的样式:

比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.

 

 

 

 

 

-j MASQUERADE

 

动态源地址转换(动态 IP 的情况下使用)

 

 

 

 

下面是源地址转换的实验

 

 

 

准备三台机子

 

 

内网

192.168.12.11

外网

192.168.100.101

中继器

192.168.100.100

192.168.12.39

 

 

 

切换到外网

把网关指向中继器

route add default gw 192.168.100.100

 

 

 

 

 

 

 

 

 

 

 

 

再切换到内网,把网关也指向中继器

 

 

 route add  default gw 192.168.12.39

 

 

 

 

 

 

 

切换到中继器

Vim /etc/sysctl.conf

 

 

 

设置启动转发路由功能

 

Sysctl -p

 

 

然后再切换到外网,去ping 内网看是否能够ping 通

 

 

切换到192.168.100.101

 

 

 

 

 

 

 

 

 

Ping 192.168.12.11

成功

OK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

现在我要测试,让内网不能ping外网

环境略有改变

 

 

 

 

内网

192.168.10.11

外网

192.168.100.101

中继器

192.168.100.100

192.168.10.39

 

 

内网网关指向192.168.10.39

外网网关指向192.168.100.100

外网 yum -y install httpd vsftpd

外网开启httpd  

 

 

 

切换到中继器

iptables  -A  FORWARD -s 192.168.10.0/24 -p icmp  -j  REJECT

设置192.168.10.0 网段的用户不能使用ping

 

Iptables  -L -n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

切换到内网

 

 

 

 

 

不能ping 通外网

Curl  192.168.100.101

 

能访问外网

 

 

 

 

 

 

 

 

 

 

 

 

然后切换到中继器

Iptables  -F

 

iptables -P FORWARD DROP

拒绝一切转发功能的规则

 

 

现在切换到内网,看看是否能ping通外网,和 查看外网的web页面

 

 

 

 

 

不能ping 通也不能访问

 

 

 

 

切换到中继器

 iptables -A  FORWARD  -m state  --state  ESTABLISHED -j ACCEPT

放行已经建立连接的请求

 

iptables -A  FORWARD -s 192.168.10.0/24  -p tcp --dport 80  -m state --state NEW -j ACCEPT

放行 192.168.10 网段的任意IP ,只要访问外网80端口 并且状态是新请求的,就放行

 

现在切换到内网

 

 

能访问外网的80端口,并且不能ping通

 

 

 

 

iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8  -m state --state NEW -j ACCEPT

设置192.168.10.0 网段(内网)的用户能够ping 通 外网

 

 

切换到内网 192.168.10.11

 

ping 通外网

 

 

 

切换到外网

Yum -y install vsfptd

 

 service vsftpd start

 

 

 

切换到中继器

 iptables -A  FORWARD -s 192.168.10.0/24  -p tcp --dport 21  -m state --state NEW -j ACCEPT

 

内网(192.168.10.0) 所有主机访问  外网 (192.168.100.101)的21 端口 都放行

 

 

 

 

 

 

iptables -R FORWARD 1  -m state --state ESTABLISHED,RELATED -j  ACCEPT

 修改第一条规则,加上RELATED

 

 

意思就是说只要 状态是  确定的, 有关系的,都放行

 

现在切换到真实主机 ftp:192.168.100.101试试

 

 

 

能访问

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

语法的介绍~~~~

 

iptables -t nat  -A  POSTROUTING -s  192.168.10.0/24  -j  SNAT --to-source  192.168.100.100

 

当客户端来源IP是192.168.10.0/24 网段的时候, 不管访问什么协议,源地址都转换成 192.168.100.100 (本地外网网卡)

 

 

 

 

DNAT目标地址转换

对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上

 

    如何做目标地址转换呢?:

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2

        目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上

 

 

 

 

 

下面的目标地址转换的实验

 

环境

内网

192.168.10.11

外网

192.168.100.101

中继器

192.168.100.100

192.168.10.39

 

 

内网网关指向192.168.10.39

外网网关指向192.168.100.100

外网 yum -y install httpd vsftpd

外网开启httpd  

和上面不一样,中继器的防火墙没有任何规则

 

Iptables -P FORWARD ACCEPT

 

 

 

 

 

 

 

Iptables -t nat -L -n

 

 

 

 iptables -t filter -L -n

 

 

 

 

内网

Yum -y install httpd vsftpd

Service httpd start

 service vsftpd start

 

切换到外网

Curl 192.168.10.11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Yum -y install ftp

 ftp 192.168.10.11

账户ftp

密码

 

 

 

 

 

 

现在我要把外网的网关去掉, 只要访问中继器,就能转到内网

 

 

切换到外网

 

 route del default gw  192.168.100.100

 

 

 

 

 

 

切换到中继器

 

iptables -t nat -A  PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11

做个地址转换,只要访问本地192.168.100.100 网络  转转到内网的 192.168.10.11

 

 

查看

 

 

 

 

 

现在切换到外网,访问 192.168.100.100  看他是否能 转到内网的服务器

 

 

 

 

 

 

 

 

 

 

 

 

 

基于上面的实验,现在我要 用外网访问 中继器的80端口, 中继器会转交到内网的8080端口

 

 

 

 

切换到内网192.168.10.11

 vim /etc/httpd/conf/httpd.conf

 

 

 

 

Service httpd rstart

 

 

 

切换到中继器

 

 

 

 

 

 

iptables -t nat -L -n

 

 

 

修改此规则

 

 

iptables -t nat -R  PREROUTING 1 -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11:8080

 

如果是访问192.168.100.100  的80端口 (中继器的外网口)。便转发 192.16810.11  的8080端口(中继器的内网)

 

 

 

Iptables -t nat -L -n

 

 

 

 

 

现在切换到 外网地址

Curl 192.168.100.100 (中继器的IP)

 

 

 

看到了内网的8080端口的 web服务器

 

现在我要在中继器上设置

外网访问我们内网,内网网页中带有 “neiwang” 字符串就拒绝访问

切换到中继器

iptables -A FORWARD  -m string --algo  kmp  --string  "neiwang" -j DROP

 

 

 

 

 

这时候切换到外网

Curl 192.168.100.100  访问内网,访问不成功,证明过滤成功

 

posted @ 2016-12-20 20:50  6月6日暗  阅读(779)  评论(0编辑  收藏  举报