怎样利用iptables搭建防护盾

怎样利用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

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中的其他模块
⑶、防攻击策略补充

请按F5,刷新后再评论
  • 全部评论(0
    还没有评论,快来抢沙发吧!