jinhucheung / blog

学习笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linux 学习之服务器篇 防火墙与NAT服务器

jinhucheung opened this issue · comments

commented

0. 前言

防火墙是整个数据包进入主机前的第一道关卡,那什么是防火墙?防火墙有什么机制?防火墙可以实现与不能实现的功能有哪些?其实Linux防火墙主要通过Netfilter与TCP Wrapper两个机制来管理,通过Netfilter可以实现让Private IP主机上网,也可以让Internet连接到LAN中主机,所以防火墙相当重要

commented

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端口,所以这些数据包要通过防火墙,达到服务进程处,这些数据包要是携带病毒,防火墙也是没办法处理的

commented

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默认以放行来处理

commented

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为filter
    • INPUT 主要跟进入主机的数据包有关
    • FORWARD 主要跟转递数据包有关,与nat table相性高
    • OUTPUT 主要跟主机发出的数据包有关
  • nat 主要对数据包中目标/来源的IP与port进行修改
    • PREROUTING 在路由判断前进行的规则,主要修改目标IP/port
    • POSTROUTING 在路由判断后进行的规则,主要修改来源IP/port
    • OUTPUT 与发出的数据包有关
  • mangle 主要与数据包的flags有关

当数据包在防火墙规则匹配过程中,各表与链的相关性如下图

虽然上图很复杂,但我们可以看出iptables控制的三种数据包的流向:

  • 数据包进入Linux主机--使用路线A
  • 数据包由Linux主机转递--使用路线B
  • 数据包由Linux主机发出--使用路线C
commented

3.3 iptables的语法

1) 规则的查看与清除

  • 查看规则 : iptables-save [-t table]
  • 清除规则 :
    • iptables -F 清除所有的已制定的规则
    • iptables -X 清除所有使用者制定的chain
    • iptables -Z 所有chain的计数与流量统计都归0
    • iptables -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包的类型,比如8echo 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的来源可访问主机资源

可以参考
iptableRule.sh:设置防火墙规则,面向一般服务器

commented

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 是对外的网络接口,如eth0
  • MASQUERADE 让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上