防火墙

一、什么是防火墙

1, 工作于网络或主机边缘,对于进出本网络或主机的报文,按照事先设定好的检查或匹配规则,进行检查,对能够被规则匹配到的报文,按照规则定义的处理机制进行处理的组件。

2它是一种计算机硬件和软件的结合,使InternetIntranet之间建立起一个安全网关Security Gateway),从而保护内部网免受非法用的侵入,防火墙主要由服务访问规则、验证工具、包过滤应用网关4部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件硬件

3,防火墙有软件和硬件之分

防火墙可以是一种硬件、固件或者软件,例如专用防火墙设备、就是硬件形式的防火墙,包过滤路由器是嵌有防火墙固件的路由器,而代理服务器等软件就是软件形式的防火墙。

二、标志位即其作用

ACK:确认标志

确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1Figure1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据

PSH:推标志

该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnetrlogin 等交互模式的连接时,该标志总是置位的。

RST:复位标志

复位标志有效。用于复位相应的TCP连接。

SYN:同步标志

同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0429496729532计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

FIN:结束标志

带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。

服务端处于监听状态客户端用于建立连接请求的数据包(IP packet)按照TCP/IP协议堆栈组合成为TCP处理的分段(segment)。

三次握手

防火墙基础篇


三、Iptables

1

filter:过滤规则,

NAT:网络地址转换

Mangle:修改分组数据的特定规则

Raw:独立于netfilter连接跟踪子系统的规则

2,链

五个内置链:

INPUT: 当收到访问防火墙本地地址的数据包时,应用此链的规则
OUTPUT:当防火墙本机向外发出数据时,应用此链的规则。
FORWARD:当收到要通过防火墙发送给其他网络地址的数据包时,应用此链的规则。
PREROUTING: 在对数据包做路由选择之前,应用此链的规则。
POSTROUTING: 在对数据包做路由选择之后,应用此链的规则

3,表和链

filter: INPUT, FORWARD, OUTPUT

nat: PREROUTING, POSTROUTING, OUTPUT

mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

raw: PREROUTING, OUTPUT

4iptables数据包流程

防火墙基础篇

5,命令

大写字母选项:子命令

小写字母选项:用来匹配标准及其它;

-t {filter|nat|mangle|raw}

-L: list

-n: 数字格式显示IPPORT;

-v: 详细信息, -vv, -vvv

--line-numbers: 显示链中规则的行号;

-x: 显示精确值,不要做单位换算;

-o 输出的网络接口

-i 进入的网络接口

-j 目标跳转

管理链:

-F: 清空链

iptables -F

-P: 设定默认策略

iptables -t filter -P INPUT {DROP|ACCEPT}

-N: 新建一条自定义链;

iptables -N FILTER_WEB

-X: 删除自定义的空链;

-Z: 计算器清零;

iptables -Z

-E: 重命名自定义链

管理规则:

-A: append

-I [n]: 插入为第n条规则

-D [n]: 删除第n条规则

-R [n]: 替换第n条规则

编写规则语法:

iptables [-t ] 大写选项子命令 [规则号] 链名 匹配标准 -j 目标

目标:

DROP: 丢弃数据包

REJECT丢弃数据包,同时发送适当的响应报文

ACCEPT:允许数据包通过

RETURN:在调用链中继续处理数据包

REDIRECT: 端口重定向

DNAT:目标地址转换

SNAT:源地址转换

MASQUERADE:自动原地址转换,-j SNAT --to-source IP 想当于 -j MASQUERADE

LOG:将数据包信息记录到syslog

MARK

匹配标准:

通用匹配

-s|--src|--source [!] IP/NETWORK

-d|--dst|--destination [!] IP/NETWORK

-i incoming_interface: 指定数据报文流入接口; INPUT, PREROUTING, FORWARD

-o outing_interface: 指定数据报文流出接口;OUTPUT, POSTROUTING, FORWARD

-p {tcp|udp|icmp}---除了这三个协议,大都用-m 来匹配

扩展匹配:

-p tcp

--sport

--dport

--tcp-flags 要检查的标志 必须为1标记

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

ALL

NONE

--tcp-flags ALL SYN,FIN

--syn = --tcp-flags SYN,ACK,RST,FIN SYN

练习:放行对web服务的访问:

iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -s 172.16.100.1 -p tcp --sport 80 -j ACCEPT

-p udp

--sport

--dport

例如:本机DNS服务器,要为本地客户端做递归查询;iptablesINPUT, OUTPUT默认为DROP;本机地址:172.16.100.1

# iptables -A INPUT -d 172.16.100.1 -p udp --dport 53 -j ACCEPT

# iptables -A OUTPUT -s 172.16.100.1 -p udp --sport 53 -j ACCEPT

# iptables -A OUTPUT -s 172.16.100.1 -p udp --dport 53 -j ACCEPT

# iptables -A INPUT -d 172.16.100.1 -p udp --sport 53 -j ACCEPT

-p icmp

--icmp-type

请求:8

响应:0

例子:本机172.16.100.1,能ping 172.16.0.0/16中的所有主机;

显式扩展:

-m state --state

NEW, ESTABLISHED, RELATED, INVALID

ftp服务需要装载:nf_conntrack_ftp模块, 可以使用modprobe命令,也可编辑/etc/sysconfig/iptables-config文件实现。

-m mulitport: 可以指定15个以内的离散端口;比如,21-23,80

--source-ports

--destination-ports

--ports

Eg:# iptables -A INPUT -m multiport --source-ports 21-23,80 -m state --state NEW -j ACCEPT

-m iprange: 指定匹配的IP地址范围,如172.16.100.1-172.16.109.254

-m iprange

--src-range

--dst-range

Eg:# iptables -A INPUT -m iprange --src-range 172.16.100.1-172.16.109.254 -m state --state NEW -j ACCEPT

-m limit

--limit 20/min 限制一分钟20

--limit-burst 2 限制一次最多两个

Eg:默认策略必须是DROP

# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -m limit --limit 20/min --limit-burst 2 -j ACCEPT

-m string

--string ""

--algo {bm|kmp}

Eg:# iptables -A OUTPUT

-m time

--datestart

--datestop

--timestart

--timestop

--weekdays

--monthdays

-m connlimit

--connlimit-above [num]

-m recent ------------创建一个访问而来的主机的ip列表,从而对这些主机做限制,recent是一个内核模块

--set --name web(ip列表)web列表被保存在/proc/net/xt_recent/web

--update --seconds [num] --hitcount [num] --name

Eg: # iptables -R INPUT 3 -d 172.16.251.160 -m state --state NEW -m recent --set --name web

# iptables -R INPUT 4 -d 172.16.251.160 -m state --state NEW -m recent --update --seconds 10 --hitcount 3 --name web -j DROP

上述列子可用来防止dos***。

保存规则:

service iptables save

保存至/etc/sysconfig/iptables

iptables-save > /path/to/iptables.rules

生效规则文件中的规则:

iptables-restore < /path/to/ipables.rules

练习:INPUTOUTPUT默认策略为DROP

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

# iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT

# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m time --weekdays Tue,Wed,Thu,Fri,Sat,Sun -m limit --limit 100/sec -m string --algo kmp ! --string "admim" -m state --state NEW -j ACCEPT

# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

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

# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 21 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 08:30:00 --timestop 18:00:00 -j ACCEPT

# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT

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

# iptables -A INPUT -m iprange --src-range 172.16.100.1-172.16.100.100 -m limit --limit 2/min -p tcp --dport 22 -d 172.16.100.1 -i eth0 -m state --state NEW -j ACCEPT

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

# iptables -N clean_in-------------新建一条自定义链

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP-------------标志位全为1的拒绝

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP----------标志位全为0的拒绝

# iptables -A clean_in -d 172.16.100.1 -j RETURN

# iptables -I INPUT 1 -d 172.16.100.1 -j clean_in

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

# iptables -A OUTPUT -s 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPT

# iptables -A INPUT -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT

两个监控的实例,防止dos***

1,调用内核模块recent,监控外来地址的访问,创建访问ip列表,超过一定次数就让它断开

www.web.comweb站点,172.16.251.160是它对应的ip

先为iptbles添加两条记录

# iptables -A INPUT -d 172.16.251.160 -m state --state NEW -m recent --set --name web

# iptables -A INPUT -d 172.16.251.160 -m state --state NEW -m recent --update --seconds 10 --hitcount 3 --name web -j DROP

# ls /proc/net/xt_recent/web

/proc/net/xt_recent/web

启动两个终端,一个用压力测试访问,另一个监控/proc/net/xt_recent/web文件的变化,看它是不是只能在10秒内请求三次并断开

防火墙基础篇

# watch -n1 'cat /proc/net/xt_recent/web'

# ab -c 50 -n 100 www.web.com/index.html

防火墙基础篇

src=172.16.251.160 ttl: 64 last_seen: 4316807871 oldest_pkt: 4 4316807871

访问的源ip地址,上一次访问的时间戳,所有收到的包的数量,以及每一次接收时的时间戳。

防火墙基础篇

这两张图都能说明,用户请求三次就被断开,而且,第三次没有成功。

2,上题非补充,在创建了ip列表之后,再让用户的访问记录到日志中,然后,断掉用户的连接。只需要插入一条记录。

# iptables -R INPUT 2 -d 172.16.251.141 -m state --state NEW -m recent --update --seconds 10 --hitcount 3 --name web -j LOG --log-prefix "webattck"

这里的日子属于内核级别,所以要在/etc/rsyslog.conf中为内核级别的日志定义日志文件,

#vim /etc/rsyslog.conf

添加这么一行

kern.* /var/log/attack----------------自定义日志文件

再重新使用上边的方法来监控/var/log/attack就会发现

防火墙基础篇

NAT 网络地址转换

SNAT: 代理内部客户端访问外部网络;在iptablesPOSTROUTING

-j SNAT --to-source IP

-j MASQUERADE 与上者相似,表示自动获取主机ip将之作为源地址发送报文

Eg: # iptables -t nat -A POSTROUTING -s 192.16.10.0/24 -j SNAT --to--source 192.168.5.2

表示将来自内网所有在192.168.10.0网段内发出报文的ip SNAT192.168.5.2(一般都是作为防火墙的主机ip)然后发送去

DNAT:将内部服务器发布至外部网络;在iptablesPREROUTING

不但能转换目标地址,还能映射目标端口

-j DNAT --to-destination IP:port

Eg : # iptables -t nat PREROUTING -s 172.16.0.0/16 -d 172.16.251.111 -j DNAT --to-destination 172.16.251.1

表示将来自172.16.0.0网段内的报文转发到内网用户主机ip172.16.251.1的主机。