怎样利用iptables搭建防护盾课程由慕课网JesonChen老师讲解,本文为笔记,是视频课程的精华,以下是具体的课程。
一、简介
一、简介
iptables:Linux系统下的应用层防火墙工具。(也可以应用于局域网网络访问策略)
场景:模拟用iptables控制并发的http访问。
场景描述:
客户端机器IP1(通过Linux自带的ab命令)→→目标机器IP2(http服务)进行压力测试
其他设置(需要了解内核,所以暂时忽略,下面只写部分命令)
ab -n 100000 -c 40 http://10.10.163.233/test.txt #并发10万次请求,累增40次并发
设置了iptables控制客户端机器并发链接数量后,负载压力变小
课程意义:
1、搭建企业实际使用的防火墙规则
2、防止被攻击
3、利用iptables进行数据包转发,做代理服务器
二、iptables规则原理和组成
Netfilter:是Linux操作系统核心层内部的一个数据包处理模块
Hook point:数据包在Netfilter中的挂载点(5个挂载点分别为:PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING)
iptables规则组成:四张表 + 五条链(Hook point) + 规则
四张表:filter表、nat表、mangle表、raw表
Mangle表:修改数据包,改变包头中内容(TTL,TOS,MARK)【需要路由支持】
filter表:访问控制、规则匹配(常用)
nat表:地址转发
五条链:PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING
表和链的关系:将链放入表中实现某种功能。以下是具体流程表:
发往网络
数据进入→ IN →PREROUTING(nat、mangle、raw)→ Destinationg判断 →
发往本机
FORWARD(filter、mangle)→→→→→→→→→→→→→→→→→→→→→→→
OUT ← POSTROUTING(nat、raw、mangle)
INPUT(filter、mangle)→ LOCALHOST →OUTPUT(filter、nat、mangle、raw)→
iptables规则组成
数据包访问控制:ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)
数据包改写:SNAT(对数据包发出地址改写)、DNAT(对数据包接收地址改写)
信息记录:LOG(将访问过程记录日志)
命令 table 选项 chain(链) parameter&Xmatch target(规则)
iptables nat -A INPUT -p tcp -j ACCEPT
-t filter -D FORWARD -s DROP
-L OUTPUT -d REJECT
-F PREROUTING --sport DNAT
-P POSTROUTING --dport SNAT
-I --dports
-R -m tcp
-n state
multiport
注释:-A(追加规则,默认加在最后一条)、-D(删除)、-L(和n连用:不显示主机名列出规则)、-F(清理规则)、-P(设置默认IPTABLES规则)、-I(追加规则,默认追加为第一条规则)、-R()
三、iptables实例应用。
实例1:
规则1:对所有的地址开放本机的TCP(80、22、10-21)端口的访问
规则2:允许对所有的地址开放本机的基于ICMP协议的数据包访问
规则3:其他未被允许的端口禁止访问
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 10: 21 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -L
iptables -A INPUT -j REJECT #前面是允许访问的,后面为禁止访问的,所以需要后插
netstat -lntp
其他客户端扫描测试服务器端口:nmap -sS -p 10-1000 10.10.163.233
iptables -nL #不显示主机名显示规则列表
延伸:删除80端口允许访问,禁止80端口被访问
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 90 -j REJECT
存在的问题:1、本机无法访问本机(telnet 127.0.0.1 22)
2、本机无法访问其他主机(curl http://www.immoc.com)
在实例1的基础上,修改只允许10.103.13.232访问本机的httpd服务
iptables -I INPUT -i lo -j ACCEPT #允许所有数据通过LO网卡
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许ESTABLISHED,RELATED两种状态向外网访问数据的通过
补充:在实例1的基础上,修改只允许10.103.188.233访问本机的httpd服务
iptables -I INPUT -p tcp -s 10.10.188.233 --dport 80 -j ACCEPT
curl -I http://10.10.188.232 #客户端访问服务器测试
实例2:
规则1:ftp主动模式下iptables的规则配置
FTP主动模式原理
客户端(顺序向下) 动作 服务器端(开放21端口)
1、登陆服务器 →向服务器输入用户名和密码→ 21端口
2、登陆成功 ←←←←←←←←允许登陆
3、随机开放端口 (客户端自身随机开放端口链接服务器)
4、PORT命令 ↗↗上报随机端口号给21端口以便交换数据
3、随机端口 (客户端自身监听这个随机开发的端口,以便接收)
(服务器20端口向客户端主动发送数据) ←← 20端口
iptables对于FTP主动模式下
①、FTP连接的默认模式为被动模式
②、vsftpd服务支持主动模式需要注意的配置选项
port_enabe=yes #开启主动模式
connect_from_port_20=yes #开启20端口
③、iptables需要开启21端口的访问权限。
#iptables -I INPUT -p tcp -dport 21 -j ACCEPT
模拟登陆
iptables -F #清除所有设置
ftp 10.10.188.233 #然后输入用户名和密码
iptaboes -F #以下为服务器端设置
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j REJECT
iptables -nL
passive #主动被动模式切换命令
以上内容没讲清楚(待后续继续学习)
规则2:ftp被动模式下iptables的规则配置
FTP被动模式原理
客户端(顺序向下) 动作 服务器端(开放21端口)
1、登陆服务器 →向服务器输入用户名和密码→ 21端口
2、登陆成功 ←←←←←←←←允许登陆
3、PASV命令 (要求被动模式) 4、开放随机端口
5、接收服务端端口号信息 ←告诉客户端随机端口号
6、链接到随机端口获取数据 →→→→→→ 随机端口
iptables对于FTP被动模式下
方法一:为vsftpd指定数据端口,并且通过iptables开放相应需要传输的端口段
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
/etc/init.d/vsftpd restart
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
方法二:使用连接追踪模块(系统内核的一个模块)
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
modprobe nf_conntrack_ftp #临时加载连接追踪模块
vim /etc/sysconfig/iptables-config #开机自动加载连接追踪模块
IPTABLES_MODULES="nf_conntrack_ftp" #加入连接追踪模块
实例3:
规则一:要求员工在公司内部(10.10.155.0/24,10.10.188.0/24)能访问服务器上的任何服务
规则二:当员工在外能够通过VPN连接到公司
外网(员工)→拨号到→VPN服务器→内网FTP,SAMBA,NFS,SSH
规则三:公司有一个门户网站需要允许公网访问
知识补充:常见端口
常见允许外网访问的服务端口(加s的都是加密的,安全的服务)
网站 www http 80/tcp
https 443/tcp
邮件mail smtp 25/tcp
smtps 465/tcp
pop3 110/tcp
pop3s 995/tcp
imap 143/tcp
不允许外网访问的服务
文件服务器 NFS 123/udp
SAMBA 137,138,139/tcp 445/tcp
FTP 20/tcp,21/tcp
远程管理 SSH 22/tcp
数据库 MYSQL 3306/tcp
ORACLE 1521/tcp
配置规则的基本思路
允许本地访问
ACCEPT规则 允许已监听状态数据包通过
允许规则中允许的数据包通过(注意开发SSH远程管理端口)
DENY规则 拒绝未被允许的数据包(iptables 规则保存成配置文件)
配置过程(中途增加了部分默认需要的允许服务)
iptables -F
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 10.10.155.0/24 -j ACCEPT #满足规则1
iptables -A INPUT -s 10.10.188.0/24 -j ACCEPT #满足规则1
iptables -A INPUT -s 10.10.140.0/24 -j ACCEPT #允许自己访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许网页访问80
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT #允许VPN常用的端口
iptables -I INPUT -p icmp -j ACCEPT #允许ICMP协议通过
iptables -A -INPUT -j REJECT #其他的的拒绝
/etc/init.d/iptables save #将上面的规则设置保存到配置文件,永久生效
vim /etc/sysconfig/iptables #打开这个配置文件查看
chkconfig iptables on #将这个配置文件设置为开机启动
chkconfig --list|grep iptables #查询是否设置好开机启动
另外一种配置方法就是将上面的命令写成一个脚本文件,加入定时启动或者伴随开机启动
四、iptables防火墙nat表规则配置
nat分类 功能 作用链
SNAT 源地址转换 出口 POSTROUTING
DNAT 目标地址转换 进口PREROUTING
⑴、SNAT场景模拟
Web Server(IP:10.10.188.173)←←←(IP:10.10.188.232)Nat Server(IP:10.10.177.232)
(client通过双网卡服务器访问web server)
Client(IP:10.10.177.233)(不能直接登录)
先在232上面配置
vim /etc/sysctl.conf #设置232的配置文件
net.ipv4.ip_forward = 1 #将默认0的开关打开
sysctl -p #永久执行转发机制
sysctl -a|grep ip_forward #查询转发服务是否打开
iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232
#允许将客户端地址请求的数据转发到目标IP地址
iptables -t nat -L #查看列表
在233上面进行配置
netstat -rn
cat /etc/sysconfig/network #加入一条路由完成配置
或者:route add 0.0.0.0 gw 10.10.177.232
curl http://10.10.188.173/hello/ #测试是否达到目的可以打开目标文件
⑵、DNAT场景模拟
client(IP:10.10.188.173)→→→(IP:10.10.188.232:80)Nat Server(10.10.177.232)
↘ (间接访问HTTP server)
↘ HTTP server(IP:10.10.177.233:80)
先在173上面进行配置
netstat -luntp|grep 80 #查看确认80端口没有开启
iptables -F
iptables -t nat -F #去除所有以前的规则(这是实验)
iptables -t nat -A PREROUTING -d 10.10.188.232 -t tcp --dport 80 -j DNAT --to
10.10.177.233:80
#转发设置
iptables -t nat -L
还需要确认下:10.10.177.233:80 能自我访问才能测试
五、利用iptables防CC攻击
⑴、connlimit模块:用于限制每一个客户端IP的并发连接数
参数:-connlimit-above n #限制并发个数,n为数量,例如:
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
iptables -I INPUT -p tcp --dport 80 -s 10.10.163.232 -m connlimit --connlimit -above 10 -j REJECT #允许某个IP地址最大并发链接数量,超出的话拒绝
⑵、Limit模块:限速,控制流量 例如
iptables -A INPUT -m limit --limit 3/hour #设置并发链接 3个每小时
--limit-burst默认值为5,应用如下
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
#当并发链接超过10个以后限制链接为每分钟1个
iptables -A INPUT -p icmp -j DROP
#当上面超过的量数据直接扔掉
六、iptables实例脚本
⑴、系统化的介绍iptables规则配置
/bin/sh
#iptables rules
#Jeson 2017-1-9
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F
iptabels -t nat -F
iptables -X
iptables -t nat -X
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 10.10.0.0/24 --dport 139 -j ACCEPT
iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCETP
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -p icmp -j DROP
iptables -t nat -A POSTROUTING -o ppp0 -s 10.10.0.0/24 -j MASQUERADE
iptables -N syn-flood
iptables -A INPUT -p tco --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.10.0.0/24 -m multiport --dports 80,110.21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.10.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
⑵、相应介绍iptables中的其他模块
⑶、防攻击策略补充