Linux防火墙基础知识
Linux的防火墙正确的来说并不算是防火墙,只是一种防火墙的功能体现。我们现在来讲解下Linux的这个防火墙功能的详细解释。
Linux的防火墙是由iptables与netfilter两个程序组成的,而iptables是一个单独的程序,netfilter是集成到内核中的一个程序,两个程序合作才能拥有完整的防火墙功能。
Iptables的功能是向netfiler提供规则,netfilter则是将规则执行起来。
Linux防火墙还分为主机防火墙与网络防火墙。
主机防火墙:工作在一个主机的边缘,数据报文刚刚进入网卡的时候,设定一个防火墙。
网络防火墙:工作在一个局域网边缘的防火墙。
防火墙定义:工作于主机或网络边缘,对于进出的报文根据定义的规则做检查,进而对被规则匹配到的报文作为相应处理的套件
防火墙的功能:
IDS:Intrusion Detect System,***检测系统
检测系统进程,如果有可疑行为就会报警
HIDS:Host IDS
NIDS:Network IDS
IPS:Intrusion Protect System,***防御系统
检测系统进程,如果有可疑行为就会进行相应操作,比如杀掉进程
HoneyPot: 蜜罐,专门利用别人会扫描的端口,将其开放用来吸引***进入你准备的陷阱
bt:backtrack,专为安全应用的发行版
Nessus,nmap
防火墙拥有五个钩函数(hook function)
PREROUTING:路由前
INPUT:到达本机内部的报文必经之路
FORWARD:由本机转发的报文的必经之路
OUTPUT:由本机发出的报文的必经之路
POSTROUTING:路由后
规则功能:优先级从左到右,从高到低
raw, mangle, net, filter
filter: 过滤,定义是否允许通过防火墙
net: 地址转发,启用connection_track
SNAT
DNAT
PNAT
mangle: 会修改报文首部,例如:将网络首部跳数增加
raw:目标是关闭net表上启用的连接追踪功能
四个功能四个表
五个钩子五个链
做过滤的位置:
路由前与路由后都不做过滤,都不适合,一个过早一个过晚。
表和链的对应关系:
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTING(SNT,源地址转换), POSTROUTING(DNAT,目标地址转换),OUTPUT
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING,OUTPUT
数据报文流程:
跟本机内部进程通信:
进入:PREROUTING,INPUT
出去:OUTPUT,POSTROUTING
由本机转发:
PREROUTING, FORWARD, POSTROUTING
数据报文的流向:
源IP和目标IP由流向决定
主机防火墙主要是用于到达主机的请求。
app head:应用层首部
tcp head: TCP首部
ip head: ip 首部
icmp:internet control messaging protocol
iptables: 用户空间的工具,写规则,并自动发往netfilter,立即生效;
netfilter:接受并生效规则
基本语法: iptables [-t TABLE(表)] COMMAND CHAIN CRETIRIA -j TARGET -t TABLE: nat,mangle,raw,filter 默认是:filter COMMAND: 对链做管理: -F:flush,清空规则链,默认为对应表的所有链 -N:new,自建一条链,只有被默认的链,中的某条规则选中,跳转过去才会被用到,没有规则,就会回到主链接着匹配 -X:delete,删除自定义的空链 -Z:zero,计数器归零 -P:policy, 设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP,允许或拒绝,所有规则不匹配才会用到 -E:重命名自定义链 对链中的规则做管理: -A: 在链中的尾部增加规则 -I:插入一条新规则,在首部 -D:删除规则的 -R:替换规则的 查询: -L:查询规则 -n:显示的结果中IP地址不会被反解成主机名,数字格式显示主机地址和端口 -v:详细格式,-vv,-vvv --line-numbers:显示规则编号 -x:exactly,不要对计数器的结果做单位换算,而显示其精确值 防火墙查询信息解析: pkts:包数,被本规则匹配到的报文数 bytes:字节数,被本规则匹配到的所有包大小只和 target: 处理机制 prot:协议,ip报文中的报的协议 opt: 选项 in:流入的接口,从哪个网卡进来的 out:流出的接口,从哪个网卡出去的 source: 源地址 destination: 目标地址 -A使用方法: iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标 匹配条件: 通用匹配 -s 地址:指定报文源IP地址匹配的范围,匹配IP地址的源地址,可以是IP也可以是网络地址,可以使用!取反 --src, --source: 都是-s一样的意思 -d 地址: 指定报文目标IP地址匹配的范围,匹配IP地址的目标地址,可以是IP也可以是网络地址,可以使用!取反 --dst, --destination: 都是-d一样的意思 -p 协议:指定匹配报文的协议类型,一般有三种tcp,udp和icmp; -i INTERFACE: 数据报文流入的接口,放在数据流入的前半段,PREROUTING,INPUT,FORWARD -o INTERFACE:数据报文流出的接口,放在数据流出的后半段,OUTPUT,FORWARD,POSTROUTING 扩展匹配: 隐式扩展:当使用-p{tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项 -p tcp: --sport PORT[-PORT]: 指定源端口 --dport PORT[-PORT]: 指定目标端口 --tcp-flags: 做标志位扩展 --tcp-flag 要检查标志位列表(用都好分割),必须为1的标志位列表(逗号分割) 例如: --tcp-flags syn,ack,rst,fin syn all none: 所有位都为0 all all: 所有为都为1 --syn: 相当于只放型syn为1的 -p udp: --sport PORT[-PORT]: 指定源端口 --dport PORT[-PORT]: 指定目标端口 -p --icmp-type 0: echo-reply,ping响应 8: echo-request,ping请求 显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用扩展专用选项 -m state --state -m limit -m time 处理目标: 内置目标: 过滤: 拒绝 DROP:悄悄的丢弃 REJECT:有返回信息 允许 ACCEPT 在自定义链中无法匹配报文时,将其返回主链 RETURN 删除规则: -D:删除规则的 iptables [-t TABLE] -D CHAIN RULENUM 策略设置: iptables [-t table] -P chain target 修改规则: iptables [-t table] -R chain rulenum rule-specification 插入规则: iptables [-t table] -I chain [rulenum] rule-specification 默认插入到第一条,与-A相反。 隐式扩展: --tcp-flag 要检查标志位列表(用都好分割),必须为1的标志位列表(逗号分割) 例如: --tcp-flags syn,ack,rst,fin syn all none: 所有位都为0 all all: 所有为都为1 --syn:相当于syn为1 -p --icmp-type 0: echo-reply,ping响应 8: echo-request,ping请求 目标: RETURN: 在自定义链中无法匹配报文时,将其返回主链 创建自定义链: iptables [-t table] -N chain 例如:iptables -t filter -N http_in 设置调用自定义连接 iptables -A INPUT -d 192.168.1.1 -p tcp --dport 80 -j http_in 设置访问目标地址为192.168.1.1服务器的80端口的连接都转到httpd_in这个自定义链上 如果自定义链没有匹配的,将会回到主链 iptables -A http_in -j RETURN 删除自定义且0引用的空链: iptables [-t table] -X chain 例如:iptable -X http_in 重命名自定义且0引用的空链: iptables [-t table] -E old_name new_name 例如:iptables -E http_in web_in 以上为主机防火墙的规则定义,我们现在来分析下: 1、如何过滤外部连接进入主机。 外部连接进入主机要先从进入网卡进入,然后通过PREROUTING,再由路由选择进入INPUT,通过INPUT进入主机,接着由OUTPUT出去,再次路由选择,最有从POSTROUTING经过,由出去的网卡出去。 注意:这里的网卡可能是同一个也可能是两块不同的网卡,主要看你主机状态,这点要弄清楚,否则规则可能会写错。 如下图:
由上图可以得出,我们如果要过滤外面进来的连接需要在INPUT这个钩子的表上写规则。 而规则又要卸载filter这个链上面,filter链是默认的,所以不需要特意指定链 命令: iptables -A INPUT -d 192.168.1.129 -p tcp --dport 22 -j ACCEPT 开发22号端口,用于ssh连接,否则你的连接可能会直接挡掉 iptables -P INPUT DROP 将INPUT的默认状态改为DROP从而挡掉所有不允许通过的连接。 以上就是开放一个端口,并且挡掉所有端口的命令,如果你想要开放某个端口可以参照以上例子。 iptables -A INPUT -d 服务器地址 -p 协议 --dport 需要开发的端口 -j ACCEPT
注意:防火墙的过滤规则只在filter的链上做,其他链不做过滤使用。因此一般做过滤都不需要指定链
以上为主机防火墙的实例。
现在来看下网络防火墙的实例
网络防火墙:
网络防火墙主要用于到达网络的请求。
网络防火墙我们一般用户NAT转换的比较多。
打开net转发:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 修改这个数值可以永久打开net转发
sysctl -p: 是sysctl文件重新加载,让配置生效
cat /proc/sys/net/ipv4/ip_forward :查看是否已经打开net转发,1为打开0为关闭
CentOS 7 设置转发:ip route add 0.0.0.0/0.0.0.0 via 192.168.1.1
所有的地址进入都转发到192.168.1.1
ftp的转发也需要开启nf_conntrack_ftp这个模块来,启动追踪。
否则防火墙开启了也不能连接到ftp
设置开机自动装载模块:
1、vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp":开机自动装载模块选项
2、写一个脚本,开机自动运行将iptables的命令键入
设置了以上的NET转发之后,所有将网关指向这台服务器地址的客户端,都讲由这台服务器转发出去。
注意:到此虽然你的转发可以发出去但是却不能收回,因为你的地址只是你个人的,不是公网上的,所以我们现在需要做一个nat源地址替换。
我们要做源地址转换的nat需要在防火墙的POSTROUTING这个链上面做。因为源地址转换的话,就是在路由选择之后要出去了,但是还没出去之前将地址伪装成我们的公网地址,这样数据回来的时候就能找到我们的地址了。 nat:Network Address Translation 网络地址转换,为了安全 地址转换: SNAT:源地址转换 DNAT:目标地址转换 PNAT:端口转换 FULL NAT:全地址转换 SNAT: 专用选项: SNAT --to-source SIP 转换成哪个源地址 MASQUERADE:地址伪装,用于ADSL网络,会将地址转换成拨号之后的地址。 例如:iptables -t nat -R POSTROUTING 1 -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.129 nat转换都会带有一个相反的响应,而相反的响应是不需要专门指定的,nat会自己根据自己的追踪表来确定转换地址: 请求的是目标就会响应源 请求的是源就会响应目标 例如:如果nat转换请求外部主机,那么回来的时候就是响应 请求的时候是源地址转换,回来的时候是目标地址转换 请求的时候需要指定源地址转换,回来的时候nat会根据自己的追踪表来确定目标地址。 DNAT,PNAT: 目标地址转换的时候,可以一样进行端口转换。 --to-destination FULL NAT:全地址转换 既转换目标地址,也转换源地址。 例如:公司内有多个局域网,地址出去的时候需要通过一个路由器,所以转换的时候通过full nat转换目标地址与源地址。 以上是nat的选项 现在来配置一下: 这里需要用-t指定表,因为默认是filter这个表 iptales -t nat -A -s 192.168.0.0/16 -j SNAT --to-soure 192.168.1.1 这样就可以将所有从服务器出去的192.168这个网段的地址伪装成192.168.1.1 这个地址。
以上为基础只是,如果有什么问题也可以在博客留言。