iptables教程


1.相关概念介绍


防火墙种类:
主机防火墙
位置:主机边缘,内核的TCP/IP协议栈
本质:在多个网络通讯的拦截位置设置拦截规则
网络防火墙
位置:网络边缘,也就是内网与外网间的进出口
网络攻击
针对主机防火墙,在主机内部攻击
针对网络防火墙,在内网进行攻击
软硬件防火墙实现的区别
硬件:芯片级别直接处理网络协议报文,但规则仍需要人工创建
软件:在内核的网络协议栈处理报文,人工定义规则
防火墙与杀毒软件的区别
防火墙:防范网络攻击。攻击者试图通过网络探测系统缺陷以达到不可告人目的。
杀毒软件:防范病毒攻击。恶意代码植入,导致运行出错,杀毒软件通过病毒库的病毒特征进行杀毒,特征越匹配,杀毒越精确。
如果防范新的网络攻击
防火墙不能根据行为来防范攻击,例如留下访问后门。那么其他防范方法有:
IDS:入侵检测系统
根据定义的规则监控指定进程的可疑行为并报警。发邮件报警。两类:
HIDS:hist IDS 主机内部
NIDS:Network IDS  
在内网的多台主机部署传感器,该传感器在主机内对网络报文的行为做监测,一旦发现问题立即发告警
IPS:入侵防御系统
也就是 IDS加防火墙,一旦监测到可以行为立即处理
HoneyPot:蜜罐,通过诱捕实现追踪抓捕
留下一个漏洞,攻击者进来后,对其监控追踪
开源的实现安全评估和风险评估工具
bt: backtrack 一个集成很多安全工具的inux发行版,现在更名为Kali linux
入侵检测、渗透测试有:
Nessus 
nmap 网络扫描利器
网络防火墙的分类
网络层防火墙
在内核中的TCP/IP协议栈检测报文帧首部、TCP/IP首部,例如源主机和目标主机连接的IP、端口、连接追踪、状态(三次握手、四次断开)
无法防范应用层的报文攻击
效率高,但安全性差
应用层防火墙
某种服务的反向代理,假装服务的提供者,隐藏真实服务器来达到减少攻击的目的
举例:ngnix、httpd(fcgi)
安全性高,但并发量大时效率差
实际生产环境中,通常由一台位于网络边缘的网络层防火墙检测公网的请求,通过后,接着应用层防火墙(通常是反向代理)对其做检测,没问题后就发往最终服务器。
iptables套件 是网络层防火墙
iptables规则
ipfw(linux 2.0)
ipchains (linux 2.2) 多条规则(一条链)对一个报文依次做检查
iptables 多条链排列对一个报文依次做检查
netfilter过滤器
是在内核的TCP/IP协议栈上的框架,设置了5个卡槽,每个报文都经过其中的1个或多个
将应用层的iptables规则往这些卡槽送规则,实现定制防火墙功能

iptables与netfilter的关系
iptables是用户空间的工具,将规则发往内核的netfilter,立即生效

2.iptables原理


功能:4个功能也叫做4个表
filter: 过滤连接功能,
作为防火墙,有白、黑名单之分,白名单基于DROP策略,黑名单基于ACCEPT策略
主机防火墙:使用INPUT、OUT链
网络防火墙,使用FORWARD链
nat: 地址转换功能,转换源和目标的IP和端口,有三种方式:
SNAT--源地址/端口转换
DNAT--目标地址/端口转换
PNAT--全源/目标的地址/端口转换
要启用connection_track连接追踪; 如果并发量多会占用内存,消耗资源
mangle:  与NAT不同,转换TCP/IP报文头部中除IP和端口之外的信息,例如TTL
raw: 目标是关闭nat表上启用的连接追踪功能;
优先级:raw > mangle > nat > filter raw 最优先
每种功能(上面的1、2)都可以设置多条规则,因此叫做表而不是链
卡槽:也叫链,共5条
PREROUTING: 路由前
INPUT: 到达本机内部应用进程的报文的必经之路
FORWARD: 本机转发报文的必经之路
OUTPUT: 从本机内部应用进程发出的报文的必经之路
POSTROUTING: 路由后
表与链的关系:
filter:INPUT、FORWARD、OUTPUT
nat:PREROUTING、OUTPUT、POSTROUTING
场景:内网主机通过网关(nat)访问外网的服务器
作用:
1.为了安全隐藏内部网络
2.节约IP地址
地址变化:
SNAT:请求从网关出去时改源地址  POSTROUTING  
DNAT:响应从网关回来时改目标地址 PREROUTING
mangle: 修改报文头而已,例如TTL,因此任何一个位置也行
raw:PREROUTING、OUTPUT
    比nat优先级高,禁止nat的连接追踪功能。与nat的位置相同(),但POSTROUTING就没必要了
同一条链上表规则的优先级顺序
PREROUTING nat、mangle、nat
FORWARD mangle、filter
INPUT mangle、filter
OUTPUT nat、mangle、nat、filter
POSTROUTING mangle、nat
数据报文流向
跟本机内部进程通信:
1.向别的主机发请求:
先出去:OUTPUT、POSTROUTING
后进来:INPUT、PREROUTING
2.响应别的主机:
先进来:PREROUTING、INPUT
后出去:OUTPUT、POSTROUTING
由本机转发:
PREROUTING、FORWARD、POSTROUTING
接收请求转发时 PREROUTING中改目标IP
接收响应转发时 POSTROUTING中改源IP


3. iptables的语法



主要语法
对链的规则进行插入、追加、替换和删除
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
对链或规则列出、清空、归零计数器
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -S [chain [rulenum]] #表示按iptables-save的方式列出规则
对自定义链新建、删除和重命名
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -E old-chain-name new-chain-name
对链更改默认策略
iptables [-t table] -P chain target

策略描述
rule-specification = [matches...] [target]
匹配条件
match = -m matchname [per-match-options]
目标动作
target = -j targetname [per-target-options]


查看详细的iptables表
iptables [-t table] -L [chain [rulenum]] [options...]
其他可用选项
    -n:用服务端口好代替服务名
-v:显示包数、字节数、输入和输出接口名
-vv:更详细信息
--line-numbers:显示规则在链中的行号
-x:以精确数字显示包数和字节数

iptables规则的保存和还原
iptables-save > /etc/sysconfig/iptables #指定保存的位置
service iptables save #默认在/etc/sysconfig/iptables保存
iptables-restore < /etc/sysconfig/iptables #从指定的位置恢复
service iptables restart #默认从/etc/sysconfig/iptables恢复
永久生效: 
1.命令/etc/rc.local文件中 
2.自定义脚本,让脚本开机运行

4.策略规则中的匹配条件


通用匹配
-s IP: 源地址
-d IP: 目标地址
-i IN_IF: 入接口
-o OUT_IF: 出接口 
隐式匹配
-p tcp [-m tcp]
--sport PORT[-PORT] 可以是一个IP范围
--dport PORT[-PORT] 同上
--tcp-flag  (syn|ack|rst|fin)[,(syn|ack|rst|fin)].. (syn|ack|rst|fin)[,(syn|ack|rst|fin)]..
选项参数1是要检查标志位列表(用逗号分隔),选项参数二是为1的标志位列表(逗号分隔)
例如:--tcp-flags syn,ack,rst,fin syn   跟TCP三次握手四次断开相关,需要检查4个标志位,其中syn标志位需要设置为1生效
还有all none,检查所有标志位,但所有标志位为0
--syn  相当于--tcp-flags syn,ack,rst,fin syn
-p udp [-m udp]
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0: echo-reply, 表示ping响应
8: echo-request, 表示ping请求
显式匹配:
必须明确指定-m选项来指定扩展模块(例如 -m mutiport),且需要iptables和netfilter同时支持才行
mutiport: 可用于匹配非连续或连续端口:最多指定15个端口
--sports port[,port[,port:port]] 逗号分隔的为非连续,冒号分隔的为连续
--dports 同上
--ports 同时指定源端口和目标端口,常见于forward中
iprange: 匹配连续地址而非网络
[!] --src-range IP[-IP]
[!] --dst-range
string: 应用层字符串匹配
--algo {kmp|bm} 高效算法 比较编码后的二进制
--string "STRING" 要过滤的字串
--hex-string "HEX_STRING"
time: 基于日期时间的访问控制
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop 
--timestart hh:mm[:ss]
--timestop
--weekdays day[,day]
Mon,Tue,Wed,Thur,Fri,Sat,Sat
connlimit: 连接数限制,对每IP的发起的并发连接数做限制
[!] --connlimit-above n 表示n以上的连接数
limit: 速率限制。通过令牌桶的令牌数限制速率,例如客户端拿到本机一个令牌就能往本机发一个数据包
--limit n[/second|/minute|/hour|/day]
--limit-burst n 允许令牌桶空闲多个令牌
允许超出的令牌数
state: 状态检查(对tcp、udp、icmp有效),有连接追踪功能
通过内核的内存空间的条目记录每个会话连接(源和目标的IP和端口)的状态建立时间,该条目包含一个倒计时的计时器,计时器归零前能知道同一客户端之前访问同一服务,计时器归零后该条目自动删除。其跟踪会话连接,比较之后的会话是否与当前会话有关联性而做规则检查。
缺点:如果服务器访问大,记录条目用完时无法追踪新请求而产生拒绝,会出现请求超时不予响应。
注意:这里的连接追踪跟TCP的有连接状态与UDP的无连接状态无关。
追踪的连接:
--state
NEW 新建立一个会话
ESTABLISHED 已建立的连接
RELATED 有关联关系的连接
INVALID 无法识别的连接
好处:解决对于反弹式木马能让本机的80服务端口作为一个客户端向外部木马服务器发请求的问题
更改连接追踪的最大条目
/proc/sys/net/nf_conntrack_max
各协议连接的追踪属性
/proc/sys/net/netfilter/目录
nf_conntrack_tcp_timeout_established 432000 追踪的超时时间,单位为秒,432000也即是5天内访问仍能识别  
当前追踪的所有连接
/proc/net/nf_conntrack
layer7: 7层协议过滤。基于协议的防火墙,需要给内核打补丁,重新编译;将iptables卸载,给iptables源码打补丁再编译。现在不在维护,只支持2.6.28的内核。
--l7proto
例如:qq 腾讯QQ协议


5.目标动作


内置动作
禁止/允许放行,常用在filter中
ACCEPT 允许
REJECT 丢弃,返回不通消息
DROP 丢弃,悄悄的丢弃。这种很常用
地址转换,常用在NAT中
SNAT 源地址转换 ,静态的
MASQERADE 源地址转换,动态的能根据源地址变化而变化,例如适用从ADSL地址变化的场景
DNAT 目标地址转换,静态的
REDIRECT 端口重定向
其他,常用在RAW中
LOG 日志
--log-prifix "iptables:"
--log-level 4
记录到/var/log/message日志中
更详细参数,见man iptables
MARK 标记

自定义链相关动作
chain名 跳转到自定义连接
RETURN 从自定义链返回到主链


6.iptables书写要注意的地方


流向:
与本机进程通信:
流入:--> PREROUTING --> INPUT 
流出:--> OUTPUT --> POSTROUTING
经由本机转发
请求:--> PREROUTING --> FORWARD --> POSTROUTING
响应:--> PREROUTING --> FORWARD --> POSTROUTING

写规则的要点:
先确定功能(表)
确定报文流向(链)
确定实现的目标
确定匹配条件

包过滤优化规则:
1.尽量减少规则。例如使用状态规则
有限放行:NEW 。基于不同的服务
INPUT: ESTABLISHED、RELATED
OUTPUT: ESTABLISHED、RELATED
2.非同一服务,匹配机会多的放前面。例如,web规则放在ssh规则前面
3.同一服务,匹配更严格的放前面。例如,web规则放在established状态规则前面


7.iptables应用场景


主机防火墙:控制到达主机的请求
原理:使用filter表的INPUT和OUTPUT链对应用做限制访问
例子:内网中有服务器S和客户端C,要求在S上配置主机防火墙,只能让C访问其上的SSH、HTTP以及FTP服务,要求iptables规则使用自定义链。提示:在S中使用filter的INPUT和OUTPUT链实现需求。

网络防火墙控制到达网络的请求
原理:使用filter表的FORWARD链对应用做限制访问,必须开启路由功能: /proc/sys/net/ip_forward。另外客户端和服务端必须以该防火墙作为网关。
例子:有2个内网分别为Net1和Net2,服务器S和网关G在Net1,客户端C和网关G在Net2;要求在G上配置网络防火墙,让C通过它访问S,且只能访问S上的SSH、HTTP以及FTP服务。提示:C和S需要以G作为网关,在G中使用filter的FORWARD链实现需求

补充公网与内网的概念
内网中的主机h1的网关指向网关防火墙r
公网中的主机h2的网关不指向网关防火墙r,但是能通过公网访问到此r
从内网访问公网就是h1访问h2,从公网访问内网就是h2访问h1
内网的主机h1能向公网主机h2发送数据包,但是h2的数据包不能通过r发回来,因为r的路由表不会有公网到内网的路由
在书写iptables的nat表时,请求和响应的地址转换,只需配置作为请求的地址转换即可

内网访问公网的地址转换
原理:使用nat表的SNAT或MASQUERADE。发出的请求,在r处的出口做源地址转换,收到的响应,在r处的入口做目标地址转换。
例子:有公网Wnet和内网Net,客户端C和网关G在Net,服务器S和网关G在Wnet;要求网关G上配置NAT服务,让C通过G访问S上的所有服务。提示,C以G作为网关,而S不以G为网关,在G使用NAT中的SNAT实现需求,SNAT是前半段转换源地址,后半段转换目标地址。附加问题,如果SNAT的出口IP是变化的,怎么办?怎么验证?(看S的访问日志,如果客户端IP为G就对了)

公网访问内网的地址转换
原理:使用nat表的PNAT发出的请求,在r处的入口做目标地址转换,收到的响应,在r处的出口做源地址转换。
例子:有公网Wnet和内网Net,客户端C和网关G在WNet,服务器S和网关G在net;要求网关G上配置NAT服务,让C通过G的80端口服务访问S上8080端口的HTTP服务。提示,C不以G作为网关,S以G作为网关,在G使用PNAT实现需求,PNAT包含DNAT,所以其前半段既转换目标地址和目标端口,后半又转换源地址和源端口。怎么验证?(看S的访问日志,如果客户端IP为C就对了)

公网访问内网的内网
原理:使用nat表的FNAT发出的请求,在r处的出口做目标地址和源地址转换,收到的响应,在r处的入口做目标地址和源地址转换
例子:有公网Wnet和两个内网Net1和Net2,其中客户端C和网关G在Wnet、G和内网路由器R在Net1、R和服务器S在Net2,要求网关G上配置NAT服务,让C通过G访问S上的HTTP服务。提示,C不以G作为网关,G以R作为网关,S以R作为网关,在G使用FNAT实现需求,前半段先做目标地址和源地址转换,后半段也做目标地址和源地址转换。注意这种跨网络的访问存在于LVS的负载均衡集群中。

8.关于RAW表


RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。实际测试发现filter链仍然处理一些NOTRACK的包,但没有进行connect tracking,所以filter链条里必须将UNTRACKED状态的包放行

iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。所以解決方法一般有两个:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

iptables -t nat -L -n  这里虽然查看nat,但会启动链接追踪,如果并发连接数大,则会影响正常服务,非常危险。应该用modprobe -r 模块名,来拆除模块


9.其他


如何抵御对22端口的DDOS攻击?
更改ssh服务默认端口
限制不允许互联网连接,只允许通过VPN跳板后连接
客户端拨号到VPN服务器,将VPN服务器作为跳板,设置内网服务器的访问客户端限制为VPN服务器所在范围






posted @ 2014-11-28 14:07  tsw1107  阅读(202)  评论(0编辑  收藏  举报