Linux 学习之服务器篇 防火墙与NAT服务器
jinhucheung opened this issue · comments
0. 前言
防火墙是整个数据包进入主机前的第一道关卡,那什么是防火墙?防火墙有什么机制?防火墙可以实现与不能实现的功能有哪些?其实Linux防火墙主要通过Netfilter与TCP Wrapper两个机制来管理,通过Netfilter可以实现让Private IP
主机上网,也可以让Internet连接到LAN中主机,所以防火墙相当重要
1. 认识防火墙
1.1 什么是防火墙
在Linux 学习之服务器篇 网络安全与主机基本防护:网络升级/限制端口/SELinux中我们可以知道,数据包进入主机时,会通过防火墙/服务程序/SELinux/文件系统,防火墙作为保护主机的第一道关卡,其主要功能是限制某些服务的数据进出
所以防火墙主要任务是在规划出:
- 切割被信任(LAN)与不被信任(Internet)的网段
- 划分出可提供Internet的服务与必须受保护的服务
- 分析出可接受与不可接受的数据包
1.2 Linux上的防火墙主要类别
Linux实现防火墙功能有一些三种形式:
Netfilter
其通过分析数据包表头信息来限制其访问与处理一些动作(比如转换来源/目标的IP地址或端口信息),主要分析OSI的第二/三/四层TCP Wrapper
控管程序对于数据包的处理OR丢弃,主要以程序名来限制数据包Proxy
通过代理服务器,中转我们主机的数据包,同时起到保护主机的作用
1.3 Netfilter防火墙的使用限制
前面提到Netfilter防火墙主要是分析数据包表头信息,其进行的分析工作主要有:
- 拒绝让Internet的数据包进入主机某些端口
- 拒绝让某些来源IP的数据包进入
- 拒绝让带有某些特殊flags的数据包进入
- 分析主机MAC地址,决定是否连线
只不过即使有防火墙的限制,可是也不能说我们主机安全,比如我们向Internet开放WWW服务,由于要允许Internet上主机都可以连接我们主机的80端口,所以这些数据包要通过防火墙,达到服务进程处,这些数据包要是携带病毒,防火墙也是没办法处理的
2. TCP Wrappers
TCP Wrappers是通过客服端想要连接的程序名,然后分析客服端的IP,来决定是否放行的
其通过配置文件/etc/hosts.{allow|deny}
来管理
2.1 哪些服务支持TCP Wrappers
支持TCP Wrappers
服务分为两类,分别是:
- 由
super damon(xinted)
所管理的服务 - 有支援
libwrap.so
函数库的服务(可通过ldd
来查看)
2.2 TCP Wrappers配置文件
TCP Wrappers
的配置文件/etc/hosts.{allow|deny}
,其语法如下
<service(program name)>:<ip/domain/hostname>:action
其中hosts.allow
设置程序放行的ip,而hosts.deny
则相反,优先级上,hosts.allow
高于hosts.deny
当两个文件都不存在时,Linux默认以放行来处理
3. Netfilter
Linux实现Netfilter功能(数据包过滤)的软件是iptables
,其内核所提供,在效能上非常好
3.1 数据包进入的流程:规则顺序的重要
Netfilter防火墙是通过设定一条条规则来过滤数据包的,而这些规则在匹配数据包上有顺序(由上到下识别),匹配成功后就执行相应的action
,不再往下匹配
如果都不匹配,那等着此数据包的就是Poliey
(预设动作)了
比如下图,当一个数据包匹配rule 01
,就满足,执行其action -- [DROP],那么该数据包就会被主机给丢弃
3.2 iptables的表格(table)与链(chain)
由于防火墙有很多条规则,为了方便则是某类动作,我们将一组规则整合成chain(链)
,比如处理进入的数据包的规则组称为INPUT
,处理发出的数据包的规则组称为OUTPUT
,
而再将这些链组合在一起,专门针对某些功能,那就是table
了
iptables预设有以下三个table
,如下图
各表相关的功能如下
filter
主要跟进出主机的数据包有关,预设table为filterINPUT
主要跟进入主机的数据包有关FORWARD
主要跟转递数据包有关,与nat table
相性高OUTPUT
主要跟主机发出的数据包有关
nat
主要对数据包中目标/来源的IP与port进行修改PREROUTING
在路由判断前进行的规则,主要修改目标IP/portPOSTROUTING
在路由判断后进行的规则,主要修改来源IP/portOUTPUT
与发出的数据包有关
mangle
主要与数据包的flags有关
当数据包在防火墙规则匹配过程中,各表与链的相关性如下图
虽然上图很复杂,但我们可以看出iptables控制的三种数据包的流向:
- 数据包进入Linux主机--使用路线A
- 数据包由Linux主机转递--使用路线B
- 数据包由Linux主机发出--使用路线C
3.3 iptables的语法
1) 规则的查看与清除
- 查看规则 :
iptables-save [-t table]
- 清除规则 :
iptables -F
清除所有的已制定的规则iptables -X
清除所有使用者制定的chainiptables -Z
所有chain的计数与流量统计都归0iptables -F INPUT
清空 filter表INPUT所有规则iptables -D INPUT 3
删除input的第3条规则
2) 设置预设政策
iptables [-t tables] -P [INPUT,OUTPUT,FORWARD等] [ACCEPT,DROP]
3) 添加规则:限制IP/network/网络接口
# iptables [-AI 链名] [-io 网络接口] [-p 协议] \
> [-s 來源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
参数说明:
AI 链名
针对某条链进行规则的 "插入" 或 "累加"A
在链的尾部增加一条规则I
在链的头部插入一条规则,成为第一条规则
io 网络接口
:设置数据包进出的网络接口i
数据包所进入的接口,如INPUT
链搭配o
数据包所出去的接口,如OUTPUT
链搭配
p 协议
:设置此规则适用的数据包格式- 如
tcp/udp/icmp等
- 如
s 来源 IP/网域
:设定此规则的数据包來源,可指定 IP或网域,例如:- IP :192.168.0.100
- 网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
- 若规定为[不许]时,加上 ! 即可,例如:
- -s ! 192.168.100.0/24 表示不许192.168.100.0/24 的数据包来源;
d 目标IP/网域
: 设置此规则的数据包目标j
:后接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
4) 添加规则:限制端口
iptables [-AI 链] [-io 网络接口] [-p tcp,udp] \
> [-s 來源IP/网域] [--sport 端口范围] \
> [-d 目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]
参数:
--sport 端口范围
:限制來源的端口,端口可以是连续的,例如 1024:65535--dport 端口范围
:限制目标的端口
5) 添加规则:匹配mac与state
匹配数据包的mac地址
iptables -A INPUT [-m mac] [--mac-source mac地址 ] -j action
匹配数据包的状态:
iptables -A INPUT [-m state] [--state 状态] -j action
数据包的状态有:
INVALID
无效的数据包,例如资料破损的数据包ESTABLISHED
已经连线成功的连续状态NEW
想要新建立连线的数据包状态RELATED
表示这个数据包是与我们主机发出去的数据包有关
5) 添加规则:限制ICMP包的类型
iptables -A INPUT [-p icmp] [--icmp-type 类型] -j action
类型是icmp包的类型,比如8
是echo request
,用于ping
连接
6) IPv4的内核功能:/prov/sys/net/ipv4/*
内核也一些功能,来处理网络状态:
/proc/sys/net/ipv4/tcp_syncookies
抵制基于SYN Flooding的DOS攻击/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
抵制基于Ping Flooding的DOS攻击/proc/sys/net/ipv4/conf/*/rp_filter
逆向路径过滤,抵挡一些不合理的数据包/proc/sys/net/ipv4/conf/*/log_martians
记录不合法的IP来源
7) 简单的防火墙规则
通常一些简单的防火墙规则有以下:
规则归0
: 清除所有已经存在的规则预设政策
: 除了INPUT链预设为DROP,其他预设为ACCEPT信任本机
: 开放lo接口回应数据包
: 让主机主动向外要求而回应的数据包可以进入本机(ESTABLISHED,RELATED)信任用户
: 非必要,可以让LAN的来源可访问主机资源
4. NAT服务器的设置
NAT服务在于修改数据包的来源/目标的Socket Pair,其关注的是nat表的PREROUTING链(修改目标的Socket Pair)与POSTROUTING(修改来源的Socket Pair)
4.1 SNAT/DNAT以及设置方法
1) SNAT:修改数据包的来源Socket Pair
如上图所示,SNAT通常用于让LAN的主机通过服务器的Public IP连上Internet
设置方法:iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
$innet
是LAN的network,如192.168.100.0/24
$EXTIF
是对外的网络接口,如eth0MASQUERADE
让IP伪装成数据包出去(-o)的网络接口上的IP
或者设置成,经由eth0出去的数据包,将它们的来源IP改成 192.168.1.210-192.168.1.220
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.210-192.168.1.220
2) DNAT:修改数据包的目标Socket Pair
如上图所示,DNAT通过用于Internet主机访问LAN中的主机
设置方法:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.100.10:80
将从eth0进入且目标端口是80的数据包,都转移到192.168.100.10:80上