Linux系统下防火墙学习

一、防火墙浅解
iptables最大的优势是能够配置有状态的防火墙,带有链接跟踪的防火墙就称为带有状态机制的防火墙,相比非状态防火墙而言更安全,由于能够编写更缜密的安全过滤策略。
有状态的防火墙可以指定并记住为发送或接收信息包所创建的链接状态,防火墙能够从信息包的链接跟踪状态得到该信息。在决定过滤新的信息包时,防火墙所使用的这些状态信息能够增长其效率和速度。有四种有效状态,分别为:ESTABLISHED、INVALID、NEW和RELATED。
ESTABLISHED:指该信息包属于已创建的链接,该链接一直用于发送和接收信息包且彻底有效。
INVALID:该信息包与任何已知的流或链接都不关联,可能包含错误的数据或头。
NEW:该信息包已经或即将启动新的链接,或者它与还没有发送和接受信息包的链接相关联。
RELATED:表示该信息包正在启动新的链接,或者它与已创建的链接相关联。linux

二、防火墙基本语法
对数据报而言,有两种流向:
PREROUTINGFORWARDPOSTROUTING (NAT路由器)
PREROUTINGINPUT本机OUTPUTPOSROUTING (主机防火墙)
Iptables会根据不一样的数据包处理功能使用不一样的规则表。主要的是如下三个:
Filter表:默认的表,包含真正的防火墙规则。内建规则链有:INPUT、OUTPUT、FORWARD
Nat表:包含源地址、目的地址和端口转换使用的规则。内建规则链有:PREROUTING、OUTPUT、POSTROUTING
Mangle表:包含用于设置特殊的数据包路由标志的规则,这些标志会被filter表中的规则检查。内建规则链有:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
五条规则链:
INPUT链:当一个数据包由内核中的路由计算肯定目标是本机系统后,会经过INPUT链的检查
OUTPUT链:保留给系统自身生成的数据包
FORWARD链:通过linux系统路由的数据包
PREROUTING链:用于修改目的地址(DNAT)
POSTROUTING链:用于修改源地址(SNAT)安全

详细语法以下所示:
iptables [-t 表名] <-A| D | I | R>链名[规则编号] [-i | o 网卡名称] [-p 协议类型] [-s 源地址 | 源子网] [ --sport 源端口号] [ -d 目标ip地址| 目标子网] [ --dport 目标端口号] <-j 动做>服务器

参数说明:
[-t 表名]:定义默认策略将应用于哪一个表。没指定默认是filter表
-A:在规则列表中新增一条规则,
-I:插入一条规则,能够指定插入位置,没指定默认在第一条规则前插入
-D:删除规则,能够跟完整的规则描述,也可跟规则编号
-R:替换某条规则,不会改变规则顺序,但必需要指定替换的规则编号
-L:显示防火墙规则,不指定默认查看filter表
-v:显示详细信息
-n:以数字形式显示IP和端口。通常与-v连用
-F:删除指定表中的全部规则
-X:删除自定义空链,若是链里面有规则,则没法删除
-Z:将指定表中的数据包计数器和流量计数器归零
-P:设置默认策略并发

处理数据包的动做及说明:
ACCEPT:接收数据包
DROP:丢弃数据包
REJECT:拦截该数据包,并发回数据包通知对方
REDIRECT:将数据包从新转向到本机或另外一台主机的某个端口
SNAT:改变数据包源地址
DNAT:改变数据包目标地址
MASQUERADE:IP假装,只能用于ADSL等拨号上网的假装,若是主机的IP地址是静态固定的,就要使用SNAT
LOG:日志功能,将符合规则的数据包相关信息记录在日志中,以便分析排错tcp

实操练习:
注:在命令行进行增删改查的防火墙规则都会在服务器重启后失效,想永久有效可写入/etc/sysconfig/iptables文件里,而后重启防火墙。命令行里的话,service iptables save
查看:
Linux系统下防火墙学习
默认查看filter表:
Linux系统下防火墙学习
Linux系统下防火墙学习
查看某个表中某条链里面的规则:
Linux系统下防火墙学习
Linux系统下防火墙学习
增删查改:
iptables -A INPUT DROP
将进入你主机的全部数据包所有丢弃
iptables -A INPUT -m state --state NEW -j DROP
将全部进入你主机的状态为NEW 的数据包所有丢弃,不包含ESTABLISHED和RELATED状态的数据包。也就是再也不容许其余的机器对你的主机发起链接,但你的主机能够主动链接其余的机器,但也仅限于链接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
加上上面这条规则,就容许状态为ESTABLISHED和RELATED的链接产生的数据经过
添加:
Linux系统下防火墙学习
删除:
Linux系统下防火墙学习
插入:
Linux系统下防火墙学习
修改:
Linux系统下防火墙学习
修改后:
Linux系统下防火墙学习ide

更细致的规则编写
Iptables -A INPUT -s 192.168.12.13 -p tcp -dport 22 -j ACCEPT
表示只容许IP地址为192.168.12.13的机器对本机进行SSH链接
限制一段IP的话可用:192.168.12.0/24,表示,192.168.12.1-255此区间内的IP都被限制能或者不能SSH链接本机学习

利用这些基础的防火墙知识,写一个iptables脚本,实现别人不能ping通本身,但本身能够ping通别人的功能:
Linux系统下防火墙学习命令行

9-13行:使用modprobe命令在内核加载一些ip,iptables相关模块
15-16行:设置全部规则链的默认策略为DROP
19:设置容许接收本地回环数据
20:设置容许接收状态为ESTABLISHED和RELATED的链接所发往本机的数据
21:设置容许接收来自2二、80端口的数据
22:设置容许接收来自ping命令的应答消息。本机要ping别的主机,别的主机会发送确认信息,咱们主机要接收并回复才能确承认以ping通
24-27:和19-22意义相同,不过做用目标是OUTPUT链。3d

icmp协议中,icmp-type为8表示ping request,即ping请求,imcp-type为0表示echo relay,即回显应答,ICMP也是TCP/IP的一种,也须要三次握手,在上面的代码中,本机能够不断发出request请求去ping别人同时接收来自被ping主机的echo relay,便可以ping通,可是在OUTPUT链中没有设置能够发送echo relay,别的主机ping本机时收不到回应,三次握手创建不成功,ping执行失败。
其实,在Linux系统下,禁ping有一个更简单的操做,这里为了用防火墙实现因此有了以上内容:
禁ping操做:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
sysctl -p
以上两条操做可实现上面代码的相同功能。日志

规则扩展:iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p tcp -m state --state NEW -m multiport --dport 21,22,80 -j ACCEPT多端口规则匹配:使用参数 -m multiport 能够指定15个之内的非连续端口上例中匹配到的端口所有放行iptables -A INPUT -s -m iprange --src-range 10.0.10.100-10.0.10.200--dst-range:目标IP段指定匹配连续的IP段iptables -A INPUT -s 10.150.133.141 -d 10.18.8.193 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 5 -j ACCEPT限制icmp一次链接可发的ping包的数量--limit:限制指定包的传入速度上面的例子是用来比对:每分钟平均流量是否超过一次20个封包。还有每秒钟/second、每小时/hour、天天/day。--limit-burst:限制特定包瞬间传入的峰值上面的例子是用来比对一次同时涌入的封包是否超过5个,超过此上限的封包将被直接丢弃

相关文章
相关标签/搜索