Iptables
一、防火墙基础知识
1、防火墙是什么
工作于主机或网络边缘,对于进出的定义的报文的规则做检查,进而对被规则匹配到的报文作为相应处理的
套件
2、防火墙的作用
防火墙的作用主要是防黑客,防恶意攻击,有点类似于acl机制。主要针对服务器或者保护局域网中的主机。
防火墙主要作用是不防病毒和木马的,但是有一定的防护作用。
3、防火墙的分类
主机防火墙:工作在主机上的软件防火
网络防火墙:工作在网络边缘保护局域网,在网络中检测 ip 首部 tcp首部 帧首部
应用层网关防火墙:让消息报文进入到防火墙检测应用层报文,过沥恶意,优点,比较安全,缺点效力较低
ids 入侵检测系统 监控系统、如果有攻击或者恶意的马上处理掉
ips 入侵防御系统 翁中捉鳖 根据防tcp/udp通信协议,可以让它进到防火墙中,但是他出不了防火墙,过
沥了它的响应报文
honeypot 蜜罐 诱捕 服务器伪装了它的真实端口,故意开放假的端口让来攻击的报文消息有去无回
4、Iptables liunx 防火墙组件
iptables 不是防火墙,是一套组件是工作在网络层的防火墙组件
5、防火墙报文工作原理图
6、写规则时应该注意什么
流向:
与本机进程通信:
流入: -->PREROUTING-->INPUT
流出: -->OUTPUT-->POSTROUTING
经由本机转发:
请求:-->PREROUTING-->FORWARD-->POSTROUTING
响应:-->PREROUTING-->FORWARD-->POSTROUIING
规则中如果限定原地址、目标地址、源端口、目标端口等与流向相关的设定
写规则时要注意:
服务端:先进后出
客户端:先出后进
客户端端口是随机的,因此大多数场景下无须限定
iptables --> 语法检查 --> netfilter(执行)
规则立即生效
7、表和链的概念
四表 raw mangle nat filter
表是容器,表是由链组成的,表有优先级之分,优先级排列是 raw mangle nat filter,
iptables在过沥报文是先由表到链匹配规则,一张表一张表的匹配,同一张表中的链的规则如果相似,或者
冲突,最后生效的是排在链上面靠前的那条规则。
五钩: 对报文检测的条件卡哨、报文来了、根据规则条件来判断报文允不允许通过。实际内置在linux内核中
的五个函数,也叫链,链上可以写规则。linux开机默认启动(kernel 2.2以上版本才有)
作用
Raw 目标是关闭nat表上启用的连接追踪功能
mangle 修改tcp/ip报文首部的某些信息 比如ttl
nat 地址转换,启用connection_track;
Filter 过滤,定义是否允许通过防火墙
PREROUTING:路由前
INPUT:到达本机内部的报文必经之路
FORWARD:由本机转发的报文必经之路
OUTPUT:由本机发出的报文的必经之路
POSTROUTING:路由后
8、表和链的关系图
filter: INPUT, FORWARD, OUTPUTnat: PREROUTING(SNAT), POSTROUTING(DNAT), OUTPUTmangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTINGraw: PREROUTING, OUTPUT
9、写规则的语法
写规则:先确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件
二、常见iptables规则的书写
方向Ssh服务白名单 安全先全部堵上,在发通行证 一般木马黑客可以堵截到,没发通行证给他反弹木马不能堵截,因为它已经在你的主机之中,要堵的话,只能在OUTPPUT链上堵截黑名单 不安全先全部放行,在拉黑部分写规则时的角度客户端时 要先出后进 比如 dns 解析服务端时 要先进后出 限制别人来访问自己
(一)、ssh的设置
全局是做白名单
本机ip地址是 192.168.1.146
要求只允许允许192.168.0.0的网段来连接ssh服务
Iptables -A INPUT -s 192.168.0.0/24 -d 192.168.1.146 -p tcp -dport 22 -j ACCEPTIptables -A OUTPUT -s 192.168.1.146 -d 192.168.0.0/24 -p tcp -sport 22 -j ACCEPTIptables -P INPUT DORPIptables -P OUTPUT DORPIptables -P FORWARD DORP
1、做放行规则时是一定要有进有出,不然放行不成功
2、记住在做默认策略是一定要先放行ssh 服务,不然你没放行ssh,就先DORP,你连不上去
3、修改规则时,一定不能修改你的ssh为DORP,或者删除,不然,你连不上你的ssh,默认策略是DORP,
不允许任何人连接进来的
4、清除所有规则时一定要先放行ssh默认策略,不然你清除了你ssh连接的规则,策略却是拒绝的,你依然
连接不了
以上错误如果犯了的话
解决方法
1、虚拟机的话直接 service iptables restart2、真实环境中的话最好写一个任务计划Crontab -e 5 * * * * service iptables restart3、打电话给机房操作几个比较重要的操作命令Wath -n 1 ‘Iptables -L -n -v’ 刷新查看iptables数据包的情况查看规则排列 iptables -L -n -v --lines-number修改规则为第几条 iptables -t 表 -R 链 1-n 规则I 和 A 的区别I 默认不加序号为插入第一行A 默认为添加规则到链的最后一条
(二)、开启本机内网的icmp
Iptables -I INPUT -i lo -j ACCEPTIptables -I OUTPUT -i lo -j ACCEPT限制icmp的Iptables -A INPUT -s 192.168.0.0/24 -d 192.168.1.146 -p icmp -dport -j ACCEPTIptables -A OUTPUT -s 192.168.1.146 -d 192.168.0.0/24 -p icmp -sport -j ACCEPT
允许自己可以ping别人,别人不能ping自己
--icmp-type 8 请求--icmp-type 0 应答Iptables -A OUTPUT -s 192.168.1.146 -p icmp --icmp-type 8 -j ACCEPTIptables -A INPUT -d 192.168.1.146 -p icmp --icmp-type 0 -j ACCEPTDNSIptables -A OUTPUT -s 192.168.1.146 -p tcp -dport 53 -j ACCEPTIptables -A INPUT -d 192.168.1.146 -p tcp -sport 53 -j ACCEPT
多端口规则 -m multiport
--dports
--sports
对用户开启ssh和web服务
# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPTIP地址范围规则 -m iprange--src-range--dst-range允许172.16.100.1-172.16.100.100的网段的用户来访问telnet# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
(三)、显示扩展模块字符串匹配string:字符串匹配,能够检测报文应用层中的字符串字符匹配检查高效算法kmp, bm专用选项:--algo {kmp|bm} 算法--string "STRING" 匹配到的子串--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串; 另一只格式的子串1、前提允许用户来访问web2、白名单中加黑名单要放在web前面,不然他不显示3、可以让用户来请求进来,但是防火墙不给以回应# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP拒绝用户访问有“sex”子串的服务基于时间做访问控制 time: 专用选项:--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]] 起始时间--datestop 结束时间--timestart hh:mm[:ss] 一天的起始时间--timestop hh:mm[:ss] 一天的结束时间--weekdays day[,day] 一周的那几天Mon, Tue, Wed,Thu, Fri,Sat,Sun# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40--weekdays Mon,Tue,Thu,Fri -j REJECT拒绝用户在一周的 Mon,Tue,Thu,Fri早上8点20 到晚上18点40访问服务器172.16.100.7的web服务 由于进来的已经拒绝了,出去的也就不用拒绝,再者默认策略是拒绝的连接数限制,对每IP所能够发起并发连接数做限制; connlimit:专用选项:[!] --connlimit-above [n]例子:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP 只允许用户连接ssh的数量最多为两个速率限制 limit: 专用选项:--limit n[/second|/minute|/hour|/day]--limit-burst n例子:# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5-j ACCEPT只允许用户ping icmp请求每分钟20个回应 ,如果从来没有ping过的用户允许加5个回应
三、基本命令解释
1、规则的工作机制和保存
iptables --> 语法检查 --> netfilter(执行)规则立即生效切记:先添加放行自己会话规则文件:/etc/sysconfig/iptables保存启用中的规则于规则文件中:# iptables-save > /etc/sysconfig/iptables# service iptables save生效规则文件中的规则:# iptables-restore < /etc/sysconfig/iptables# service iptables restart
2、执行的操作:清空现有规则,读取并生效规则文件中的规则
COMMAND:链:-F:flush, 清空规则链;-N:new, 自建一条链-X: delete, 删除一条自定义的空链-Z:zero,计数器归零-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;-E:重命名自定义链3、链中的规则:-A 添加一条规则-I 插入一条规则-D 删除一条规则-R 修改一条规则4、查询:-L:以列表方式显示-n: 数字格式显示主机地址和端口;-v: 详细格式,-vv, -vvv--line-numbers: 显示规则编号-x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值
iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
5、匹配条件
1)通用匹配:-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;--src, --source-d 地址:指定报文目标IP地址匹配的范围;--dst, --destination-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING2)扩展匹配(1)隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;-p tcp: 指定tcp协议-p udp: 指定udp协议--sport PORT[-PORT]: 指定源端口--dport PORT[-PORT]: 指定目标端口--tcp-flag 要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)例如:--tcp-flags syn,ack,rst,fin synall none--syn-p udp [-m udp]--sport--dport-p icmp [-m icmp]--icmp-type0: echo-reply, ping响应8: echo-request, ping请求(2)显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;-m 扩展模块名称模块:iptables,netfilter各拥有一部分代码multiport: 多端口匹配可用于匹配非连续或连续端口;最多指定15个端口;专用选项:state: 状态检查专用选项:
--state 的概念
连接追踪中的状态:是iptables的一个模块,有一个模板,能够记录用户来连接服务的基本状态。 他可以记录tcp、udp、icmp等多种协议的状态连接
NEW: 新建立一个会话ESTABLISHED:已建立的连接RELATED: 有关联关系的连接INVALID: 无法识别的连接
应用注意
进来的连接只允许的状态有 new established 这两种状态
出去的连接状态只允许有 established
开启连接状态 时 应该注意 不能再服务器压力比较大的机子上开启
要开启的话要修改连接追踪的设置
好处优化防火墙的规则条目
实际应用 放行ssh web ping
Iptables -A INPUT -d 192.168.1.146 -m multiport --dports 22,21,80 -m state --state NEW -j ACCEPTIptables -I INPUT -m state --state ESTABLISHED -j ACCEPTIptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPTIptables -P OUTPUT DORPIptables -P FORWARD DORPIptables -A INPUT -d 192.168.1.146 -p --icmp-type 8 -j ACCEPTModprobe nf_conntrack-ftpIptables -A INPUT -d 192.168.1.146 -p tcp -m state --state RELATED -j ACCEPTIptables -R OUTPUT 1 -s 192.168.1.146 -p tcp -m state --state ESTABLISHED RELATED -jACCEPT
写规则的优化
优化规则:尽量减少规则条目,彼此不相关的匹配机会较多放在上面,属于同一功能匹配规更严格放在上面;
配置修改
调整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max当前追踪的所有连接/proc/net/nf_conntrack不同协议或连接类型追踪时的属性:/proc/sys/net/netfilter目录:
放行被动模式下的FTP服务:
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/模块:nf_conntrack_ftp2、放行请求报文:(1)放行NEW状态对21端口请求的报文;(2) 放行ESTABLISHED以及RELATED状态的报文3、旅行响应报文:(1) 放行ESTABLISHED以及RELATED状态的报文
处理目标:内置目标:DROP 删除REJECT 丢弃返回信息ACCEPT 访问创建自定义链:iptables [-t table] -N chain删除自定义且0引用的空链iptables [-t table] -X chain重命名自定义链:
iptables [-t table] -E old_name new_nameIptables -t fitler -N http_inIptables -A http_in -d 192.168.1.7 -p tcp --dport 80 -m iprange --src-range 192.168.100.1-192.168.100.100 -j DORPIptables -A http_in -d 192.168.1.7 -p tcp --dport 80 -m state --state NEW -j ACCEPTIptables -A INPUT -m state --state ESTABLISHED -j ACCEPTIptables -t fitler -N ssh_inIptables -A ssh_in -d 192.168.1.146 -p tcp --dport 22 -m state NEW -j ACCEPTIptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
子链调用主链
Iptables -A INPUT -d 192.168.1.146 -p tcp --dport 80 -j http_in 实现跳转子链处理不了的返回给主链Iptables -A http_in -j RETURNIptables -A INPUT -d 192.168.1.146 -p tcp --dport 22 -j ssh_inIptables -P INPUT DORPIptables -P OUTPUT DORPIptables -P FORWARD DORP
便于管理的话,可以直接直接清除那条链
不过注意要先放行默认策略
也可以不清空,保存在某个地方
Iptables-save > /root/iptables
删除自定义的空链,且0引用
Iptables -t -X chain
有引用的话,要删除规则
Iptables -t tables -D chain xx
以上的都是主机防火墙
四、网络防火墙
实际应用中是主机防火墙和网关防火墙配合使用
环境搭建好
Vmware1 :172.16.1.143/16 客户端
Vmware2 :eth0 192.168.1.146/25 eth1 172.16.1.140/16 网关防火墙
Vmware3 :eth0 192.168.1.149/25 web服务
准备环境的搭建
Vmware1 设置ip和默认路由
Vmware2
Ip设置
网卡设置
开启路由转发
Vim /etc/sysctl.conf
重启生效
Sysctl -p
Vmware3
Ip设置
网卡设置
环境测试
Vaware1 测试网页
把iptables中的规则给删除避免对实验的影响
五、网关防火墙设置
1、[root@www ~]# iptables -P FORWARD DROP 防火墙关闭转发功能客户端访问不了[root@www ~]# iptables -A FORWARD -s 192.168.1.149 -j ACCEPT[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -j ACCEPT
再用防火墙做规则就可以访问啦
开发远程web和ssh
清空上面两条
[root@www ~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -p tcp --dport 80 -m state --state NEW -j ACCEPT[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -p tcp --dport 20 -m state --state NEW -j ACCEPT
安全连接放开了可以打开了网页服务和ssh
开放远程ftp
[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -p tcp --dport 21 -m state --state NEW -j ACCEPT[root@www ~]# Modprobe nf_conntrack-ftp[root@www ~]#iptables -R FORWARD 1 -p tcp -m state --state ESTABLISHED RELATED -j ACCEPT
自动装载模块
网络防火墙SNAT及DNAT设置
SNAT
实验 工作示意图如上
环境搭建现在反过来
Vmware1 做web
Vmware2 做snat转发 开启转发
Vmware3 做客户端
Ip 还是原来的
Vmware3测试
Vmware2 做snat
[root@www ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.1.140
来自192.168.1.0这个网络的源地址都把他的源地址改为172.1.16.140 适用 于静态ip转发
[root@www ~]# iptables -t nat -I POSTROUTING 1 -s 192.168.1.0/24 -j MASQUERADE 适用于静态自动转发
Vmware3 访问vmware1测试转发
Vmware1查看转发结果
DNAT 转发和上面环境一样不过把防火墙规则清除
防火墙上添加规则
Vmware2
[root@www ~]# iptables -t nat -A PREROUTING -d 172.16.1.140 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.149
Vmware1访问vmware3
Vmware3上日志测试结果