#####################################node
基础原理linux
实战练习之隐式规则算法
实战练习之显式规则vim
SNATbash
DNAT服务器
iptables七层过滤网络
Panabit并发
#####################################ssh
基础原理
tcp
防火墙的定义
工做在主机或网络的边缘,对于进出的数据报文按照事先定义好的规则中的标准进行检查,一旦符合标准随后便采起此规则定义的处理动做的机制称做防火墙。
Linux防火墙iptables
分别由位于内核空间的netfilte和用户空间的iptables组合
netfilter Frame
iptables 数据报文过滤,NAT,mangle等规则生成的工具
数据包进入linux主机有可能会进过5个过滤点,这五个过滤点又称为hook function(钩子函数),他们分别是:
input;output ;forward;prerouting;postrouting
每个钩子函数上均可以有多条规则,叫作规则链。所以有五个规则链:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
iptable能够定义4类规,这里规则中能够由不一样的链构成,所以这个表分别是:
filter(过滤)表
INPUT
OUTPUT
FORWARD
nat(地址转换)表
PREROUTING
POSTROUTING
mangle(拆开、修改、封装)表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw(还原原始)表
PREROUTING
OUTPUT
优先级次序为
raw-mangle-nat-filter
基本语法
iptabels [-t table] common chain [num] 匹配标准-j 处理办法
管理规则
-A 附加一条规则,在链的尾部
-I chain [num] 插入一条规则,插入为对应chain上的第几条,若是省略则表示插入为第一条
-Dchain [num] 删除制定链中第num条规则,若是省略表示删除第一条
-Rchain [num] 替换指定的规则
管理链
-F [chain] 清空制定规则链,若是省略chain,则能够实现删除对应表中的全部链
-P chain 设置制定链的默认策略
-N 自定义一个新的空链
-X 删除一个自定义的空链
-Z 置零制定链中全部规则的计数器
-E 重命名自定链
查看类
-L 显示制定表中的全部规则
-n 以数据格式显示主机地址和端口号
-v 显示详细信息
-vv
-x 显示计数器的精确值
--line-numbers 显示规则号码
iptables不是服务,但有服务脚本,服务脚本的主要做用在于生效保存的规则,由于规则在内核空间的内存之中,重启就没有了。
iptables中止服务的过程就是移除这些模块的过程,脚本做用主要是完成装载及移除iptables/netfilter相关的内核模块
iptables_net iptables_filter iptables_mangle iptables_raw ip_nat ip_conntrack
lsmod | grep ip查看相关功能模块
实战练习之隐式规则
放行本机192.168.1.190 ssh服务被192.168.1.0/24访问
iptables -t filter -A INPUT -s 192.168.1.0/24 -d 192.168.1.190 -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -s 192.168.1.190 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
127.0.0.1的icmp只对本身放行(为了更加可靠,-i 制定interface为回环口)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
本机能够ping通外面
iptables -A OUTPUT -s 192.168.1.190 -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -d 192.168.1.190 -p icmp --icmp-type 0 -j ACCEPT
生成环境中httpd访问量确定比ssh多,因此放在第一个
iptables -I INPUT -d 192.168.1.190 -p tcp --dport 80 -j ACCEPT iptables -I OUTPUT -s 192.168.1.190 -p tcp --sport 80 -j ACCEPT iptables -L -n -v
DNS为本地客户端解析(有可能会转发)还有tcp,全部须要8条规则
iptables -A INPUT -d 192.168.1.190 -p udp --dport 53 -j ACCEPT 客户机请求进来 iptables -A OUTPUT -s 192.168.1.190 -p udp --sport 53 -j ACCEPT 服务端解析返回 iptables -A OUTPUT -s 192.168.1.190 -p udp --dport 53 -j ACCEPT 服务端递归找根 iptables -A INPUT -d 192.168.1.190 -p udp --sport 53 -j ACCEPT 根返回结果给DNS服务器
实战练习之显式规则
-m state 状态追踪
NEW 新链接请求
ESTABLISHED 已创建的链接
NVALID 非法链接请求
RELATED 相关联的(ftp命令链接中的命令激活的另外一个链接)
放行sshd出去必定是对进来包的响应。
iptables -A INPUT -d 192.168.1.190 -p tcp --dport 22 -m state NEW,ESTABLISHED -j ACCEPT (此时ip_conntrack会自动加载) iptables -A OUTPUT -s 192.168.1.190 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT (此时22号端口出去的必须是响应报文)
放行别人ping本身,而且本身只容许回应的包是响应的包。
iptables -A INPUT -d 192.198.1.190 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 192.168.1.190 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
ip_conntrack追踪能够优化OUTPUT链,之后只限定INPUT,OUT使用一条便可,能够提升规则检测效率
iptables -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED -j ACCEPT
FTP放行(状态追踪)
修改配置文件 /etc/sysconfig/iptables-config
IPTABLES_MODULES = "ip_nat-ftp ip_conntrack_ftp"指明加载模块
ip_nat-ftp ip_conntrack_ftp
iptables -A INPUT -d 192.168.1.190 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 命令链接 iptables -A INPUT -d 192.168.1.190 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 命令链接中的命令关联 iptables -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED,RELATED -j ACCEPT 数据链接出口
条目优化
(SHH、HTTP等服务多数都是ESTABLISHED,只有FTP多数是ESTABLISH、RELATED,为了优化INPUT链匹配性能能够以下)
iptables -I INPUT -d 192.168.1.190 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
FTP SSH HTTP 范例以下:
(FTP注意修改配置文件修改配置文件 /etc/sysconfig/iptables-config IPTABLES_MODULES = "ip_nat-ftp ip_conntrack_ftp"指明加载模块)
-A INPUT -d 192.168.1.190 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -d 192.168.1.190 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED -j ACCEPT
multiport 离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
iptables -I INPUT 2 -d 192.168.1.190 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iprange 范围地址[支持取反]
[!] --src-range
[!] --dst-range
iptables -A INPUT -p tcp -d 192.168.1.190 -p tcp -m iprange --src-range 192.168.1.200-192.168.1.250 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
connlimit 链接数限制
[!] --conlimit-above num同一个IP地址并发最大请求数(当默认策略为DROP的时候须要配合取反使用)
iptables -A INPUT -d 192.168.1.190 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT 某个IP的并发链接低于2个就容许 iptables -A INPUT -d 192.168.1.190 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP 等同上面含义(当默认策略为DROP时候推荐上面那种用法)
limit
--limitRATE 时间速率限定(但第一次请求并发量满了,时间速率就会生效)
--limit-burst 第一批请求到达响应数量 (若是不写,默认为5)
iptables -A INPUT -d 192.168.1.190 -p icmp -icmp-type 8 -m limit --limit 6/minute -j ACCEPT 第一批并发请求响应数量为5个, iptables -R OUTPUT 1 -s 192.168.1.190 -m state --state RELATED,ESTABLISHED -j ACCEPT 修改是由于以前是tcp协议
string字符串过滤
--algo {bm|kmp}
--string "STRING"
iptables -I INPUT -d 192.168.1.190 -m string --algo kmp --string "sex" -j REJECTURI 中包含sex的字符被拒绝 iptables -I OUTPUT -s 192.168.1.190 -m string --algo kmp --string "sex" -j REJECT 页面内容中有sex的字符不给予回应iptabls
-N自定义链
被引用链不能使用X删除,链中有规则也不能使用X直接删除,只有空链可使用X删除
iptables -N clean_in iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP iptables -A clean_in -d 192.168.1.255 -p icmp -j DROP iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP iptables -A clean_in -d 192.168.1.190 -j RETURN iptables -I INPUT -j clean_in 引用自定义链
利用 recent模块抵御DOS***
ssh远程链接(能够引用链clean_in以后)
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP 单个IP 并发请求数 不是必须加的 iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
SNAT
--to-source MASQUERADE 动态捕获外网地址
内部维护着NAT会话池,记录那些通过SNAT的报文,到报文回到NAT服务上,源地址是公网客户端请求地址,目标地址是内网客户端
因此说SNAT在数据包回来的时候也会根据NAT会话池作DNAT转换,把目标地址转换为发起请求道公网的那台客户端的IP地址
而TCP报文的序列号确保了DNAT过程当中内网客户端的惟一性(NAT会话表),DNAT是自动进行的。
而转换是在出口网卡时候进行,因此固然是postrouting,或者OUTPUT而不是prerouting
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 220.1.1.1 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j SNAT --to-source 220.1.1.1 只有从ppp0流出的才作NAT会话记录
当服务器收到来自于192.168.1.0网段的用户的请求报文,都作源地址转换并转换为220.1.1.1并发出去,可是又想拒绝内网向外网发出的ping包
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -j REJECT
把FORWARD默认策略修改成DROP以后如何放行httpd请求,还有ping协议,若是是FTP请确保启动ip_nat-ftp模块而且把第一条改成ESTABLISH,RELATED
iptables -P FORWARD DROP iptables -A FORWARD -m -state --state ESTABLISHED -j ACCEPT iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -AFORWARD -s 192.168.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT 回应的包会被第一条ESTABLISHED匹配到,因此没有必要添加type 0 iptables -AFORWARD -s 192.168.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
DNAT
由于外网的请求到达服务器公网网卡,因此必须马上转换目标IP才能经过路由机制经过另外一块内网网卡转送至内网服务器上
因此把内网的服务器发布出去,应该prerouting,不然由于目标地址是本机就会本身送到本机内部。
而且内网服务器网管必须指向NAT服务器内网网卡,若是直接回应给他源地址就不是NAT服务器公网地址了,外网用户发现不是同一条链接,没办法处理。
内网服务器响应报文目标IP应该外网请求用户的IP,当回应报文到达NAT服务器内网网卡时候会自动进行SNAT转换,把源IP从内网服务器变为NAT服务器的公网IP地址,而后送至客户端。
可见不只SNAT用到了DNAT,DNAT的过程也用到了SNAT(这个过程是自动的)
iptables -t nat -A PREROUTING -d 192.168.1.190 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20 [-p tcp --dport80] 前者是公网IP地址,后者是内网WEB服务器
DNAT作FTP的时候,因为FTP服务器的端口是变化的,因此没法提早预测, 以上只要请求80端口的时候才转发,所以DNAT要写清楚。
PNAT
另外也能够映射到内网不一样的端口,好比80映射到内部的8080,以下:
iptables -t nat -A PREROUTING -d 192.168.1.190 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20:8080
string过滤(网关)
-iptables -A FORWARD -m string --alog kmp --string "h7n9" -j DROP
iptables七层过滤
在Linux的防火墙体系Netfilter下有一个独立的模块L7 filter 。从字面上看Netfilter是对网络数据的过滤,L7 filter是基于数据流应用层内容的过滤。不过实际上 L7 filter的本职工做不是对数据流进行过滤而是对数据流进行分类。它使用模式匹配算法把进入设备的数据包应用层内容与事先定义好的协议规则进行比对,若是匹配成功就说明这个数据包属于某种协议。
一、给内核打补丁,并从新编译内核
# tar zxvf linux-2.6.28.10.tar.gz -C /usr/src # tar zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src # cd /usr/src # ln –s linux-2.6.28.10 linux # cd /usr/src/linux/ # patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch # cp /boot/config-2.6.18-164.el5 /usr/src/linux/.config # make menuconfig #####################编译时用的选项####################### Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration <M> Netfilter connection tracking support <M> “layer7” match support <M> “string” match support <M> “time” match support <M> “iprange” match support <M> “connlimit” match support <M> “state” match support <M> “conntrack” connection match support <M> “mac” address match support <M> "multiport" Multiple port match support #####################编译时用的选项####################### Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration <M> IPv4 connection tracking support (required for NAT) <M> Full NAT <M> MASQUERADE target support <M> NETMAP target support <M> REDIRECT target support # make # make modules_install # make install # vim /etc/grub.confg default=0 #chkconfig iptables off #shutdown -r now
二、给iptables源码打补丁,并从新编译iptables
# cp /etc/init.d/iptables ~/iptables # cp /etc/sysconfig/iptables-config ~/ # rpm -e iptables-ipv6 iptables iptstate --nodeps # tar jxvf iptables-1.4.6.tar.bz2 –C /usr/src # cd /usr/src/iptables-1.4.6 # cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/ # ./configure --prefix=/usr --with-ksource=/usr/src/linux # make # make install # vim ~/iptables 修改路径 前面加上/usr if [ ! -x /usr/sbin/$IPTABLES ]; then echo -n $"/usr/sbin/$IPTABLES does not exist."; warning; echo # mv ~/iptables /etc/rc.d/init.d/ 添加服务脚本 # chkconfig --add iptables 开机启动 # service iptables start # cp iptables-config /etc/sysconfig/ 还原以前设置
三、安装l7proto
# tar zxvf l7-protocols-2009-05-28.tar.gz 应用层协议的特征码 # cd l7-protocols-2009-05-28 # make install # /etc/l7-protocols/protocols 此目录中文件表明所支持的协议
四、利用l7-protocols提供的协议的特征码过滤qq、xunlei等应用……
防火墙
192.168.1.190 内部地址
220.1.1.10 外部地址
iptables -A nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 220.1.1.10 内部用户经过SNAT上网 iptables -A FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP 过滤应用层qq协议转发包 iptables -A FORWARD -s 192.168.1.0/24 -m layer7 --l7proto xunlei -j DROP 过滤应用层xunlei协议转发包
控制上网时间
-m time
--datestart --datestop
--timestart --timestop
iptables -A FORWARD -s 192.168.1.10/24-m time--timestart 08:10:00--timestop 12:00:00 -j DROP iptables -A FORWARD -s 192.168.1.10/24-m time--timestart 14:30:00--timestop 18:20:00 -j DROP
总结:虽然L7 filter不是对全部的数据包进行模式匹配,只匹配一个流的前面几个数据包 ,但检测的层次越深性能必然会降低,若是想把这种功能独立出去,可使用Panabit。
Panabit
Panabit 应用层流量分析及控制系统。Panabit 流控是一款真正意义上的应用层级流控产品,基于链接过程和协议特征识别,对于加密协议采用主动探测引擎,通过一套完整的识别流程,准确识别应用,精肯定位具体的软件客户端,把宽带网络的应用可视化和可管理提升到一个新的阶段。Panabit 流控系统能帮助宽带运营网络管理人员实时了解网络应用流量状态及应用概况,经过策略进行灵活可控的流量管理,提高网络运行效率。
其次有专门的团队跟踪研究互联网应用变化,采用抓包的方法不断收集分析协议样本,利用自主开发、描述能力强的“协议特征描述语言”—PSDL(Protocol Signature Description Language),维护协议特征库,快速提供给用户升级。Panabit流控系统,正常 3 个月升级一次版本,1 个月升级一次协议特征库。升级了特征库,将有更多的协议被识别,下降未知流量的比例。
Panabit 流控系统,支持透明网桥、旁路监听两种工做模式。透明网桥模式同时具有流量分析及控制功能;旁路监听模式仅具有流量分析功能。如设备具有多个网络接口,也可同时启用网桥和旁路监听,此种模式在实际环境中应用场景很少,不作详细介绍。如下是最广泛的透明网桥模式的部署拓扑及说明,以一路网桥(一进一出)为例:
注:Panabit 透明地串接在核心交换机与路由器之间,内网口接核心交换机,外网口接路由器;网桥上无需配置 IP 地址,仅至关于一条网线,无需改变原有拓扑和网络设置;内外网线所有连通后,0.5 配置界面图中的数据接口状态将显示为“正常”,此时网络恢复畅通。将管理口链接到核心交换机,从内网能够访问到管理地址,至此 Panabit 流控系统的上线工做完成。
配置过程请参考