首页 > 代码库 > iptables 规则策略设置
iptables 规则策略设置
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, OUTPUT nat: PREROUTING(SNAT), POSTROUTING(DNAT), OUTPUT mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING raw: 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 ACCEPT Iptables -A OUTPUT -s 192.168.1.146 -d 192.168.0.0/24 -p tcp -sport 22 -j ACCEPT Iptables -P INPUT DORP Iptables -P OUTPUT DORP Iptables -P FORWARD DORP
1、做放行规则时是一定要有进有出,不然放行不成功
2、记住在做默认策略是一定要先放行ssh 服务,不然你没放行ssh,就先DORP,你连不上去
3、修改规则时,一定不能修改你的ssh为DORP,或者删除,不然,你连不上你的ssh,默认策略是DORP,
不允许任何人连接进来的
4、清除所有规则时一定要先放行ssh默认策略,不然你清除了你ssh连接的规则,策略却是拒绝的,你依然
连接不了
以上错误如果犯了的话
解决方法
1、虚拟机的话直接 service iptables restart 2、真实环境中的话最好写一个任务计划 Crontab -e 5 * * * * service iptables restart 3、打电话给机房操作 几个比较重要的操作命令 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 ACCEPT Iptables -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 ACCEPT Iptables -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 ACCEPT Iptables -A INPUT -d 192.168.1.146 -p icmp --icmp-type 0 -j ACCEPT DNS Iptables -A OUTPUT -s 192.168.1.146 -p tcp -dport 53 -j ACCEPT Iptables -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 ACCEPT IP地址范围规则 -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、前提允许用户来访问web 2、白名单中加黑名单要放在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, POSTROUITING 2)扩展匹配 (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-type 0: 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 ACCEPT Iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT Iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT Iptables -P OUTPUT DORP Iptables -P FORWARD DORP Iptables -A INPUT -d 192.168.1.146 -p --icmp-type 8 -j ACCEPT Modprobe nf_conntrack-ftp Iptables -A INPUT -d 192.168.1.146 -p tcp -m state --state RELATED -j ACCEPT Iptables -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_ftp 2、放行请求报文: (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_name Iptables -t fitler -N http_in Iptables -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 DORP Iptables -A http_in -d 192.168.1.7 -p tcp --dport 80 -m state --state NEW -j ACCEPT Iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT Iptables -t fitler -N ssh_in Iptables -A ssh_in -d 192.168.1.146 -p tcp --dport 22 -m state NEW -j ACCEPT Iptables -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 RETURN Iptables -A INPUT -d 192.168.1.146 -p tcp --dport 22 -j ssh_in Iptables -P INPUT DORP Iptables -P OUTPUT DORP Iptables -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上日志测试结果