• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

企业级网络安全构建之 Iptables

========================================================

企业级网络安全构建之 Iptables

主要针对网络访问
========================================================


一、安全体系概览
Firewalls –> TCP Wrappers –> Xinetd –> PAM — > SELinux –> Server specific


二、预备知识:OSI七层模型                                                                            
HOST_A firefox(封装)------- httpd server(解封装)HOST_B                            
应用层            ftp http smtp pop3                                                
表示层                                                                          
会话层                                                                    
                                                                        
传输层              TCP,UDP            s_port: xxxx/tcp                   —> d_port: 80/tcp                 
网络层              IP,ICMP,IGMP        s_IP: 192.168.5.10              —> d_IP: 192.168.5.240             
数据链路层       ARP                    s_mac: 00:50:fc:12:34:56     —> d_mac: 00:50:fc:12:34:59     
物理层                                                                    

TCP:     面向连接,可靠的传输协议    类似于三次握手,四次挥手, window,确认, 重传…
UDP: 非面向连接,不可靠的传输协议


三、Firewalls: netfilter/iptables
netfilter组件    内核空间,是内核一部分 
iptables组件      用户空间,提供管理防火墙的手段,通过iptables插入、删除、修改规则


四、四张表,五条链

表的处理优先级:raw>mangle>nat>filter
filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。


五、数据包的流向图

  以本地为目的的包 数据包 —-> mangle prerouting ——-> nat prerouting ——-> mangle input ——-> filter input
  
  以本地为源的包 数据包 ——-> mangle output ——-> nat output ——-> filter output ——-> mangle postrouting ——-> nat postrouting 
    
   经过本地转发的包 数据包 ——-> mangle prerouting ——-> nat prerouting ——-> mangle forward ——-> filter forward ——-> mangle postrouting ——-> nat postrouting
  
  
六、iptables语法
iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配后的动作]
                  小写             大写            大写                           小写           大写

示例:
iptables -L            
iptables -t filter -L    
iptables -t nat -L
iptables -t raw -L
iptables -t mangle -L
========================================================

常见的操作命令:
-L                                查看,v详细,n不反解   –line-number
-A                                追加,放置最后一条
-I                                插入,默认插入成第一条
-D                                删除
-F                                清空flush
-P                                 设置默认策略policy

匹配的条件:
-s 192.168.2.0/24       源地址
-d 192.168.2.1            目标地址
-p tcp|upd|icmp            协议
-i  lo                            input 从lo接口进入的数据包
-o eth0                         output 从eth0出去的数据包
-p tcp –dport 80           目标端口是80,必须和-p tcp|udp 连用
-p udp –dport 53           目标端口是53/udp

处理方法:
-j ACCEPT                    允许
-j DROP                        丢弃
-j REJECT                    拒绝
-j SNAT                        源地址转换
-j DNAT                        目标地址转换
-j LOG                        写日志
-j MARK                        打标记

========================================================

七、Iptables匹配示例
示例1:
 

1
2
3
4
5
6
7
iptables -F                        
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -A INPUT -j REJECT  
iptables -nL

示例1存在的问题:
1. 本机无法访问本机
解决方案:iptables -I INPUT  -i lo -j ACCEPT

2. 本机无法访问其它主机
iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

注意:RELATED为双向通信时的一个状态,如ftp数据通信。
练习:建立IPTABLE自定义规则,要求拒绝22端口的访问,允许80端口的访问。准许本机访问外发请求,同时也准许访问本地。其他的拒绝。

加难度:
在上题的基础上,允许192.168.1.55 访问我的ssh。
 iptables -I INPUT 6 -p tcp –dport 22 -s 192.168.1.55 -j ACCEPT

禁止本机访问75.86.68.214 目的地址

iptables -I OUTPUT -d 75.86.68.214 -j REJECT

提示:当我们需要在指定的位置加入规则的时候,可以利用iptables的规则号码。
 

3. FTP无法访问
由于,ftp默认是进行的passive(被动模式)连接。iptables的规则可以参考方法一内容。
         ftp进入主动模式连接的话,需要服务端开启20:21端口的规则。
         iptables -I INPUT -p tcp –dport 20:21 -j ACCEPT
         客户端可以通过passvie关闭被动模式,尝试连接。
方法一: 为vsftpd指定数据端口

1
2
3
4
5
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT

方法二: 使用连接追踪模块
 

1
2
3
4
5
[root@station230 ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@station230 ~]# iptables -I INPUT -p tcp --dport 21 -j ACCEPT     
[root@station230 ~]# modprobe nf_conntrack_ftp                    //加载连接追踪模块(临时)
[root@station230 ~]# vim /etc/sysconfig/iptables-config            //开机自动加载
IPTABLES_MODULES="nf_conntrack_ftp"


示例2: iptables标准流程NPUT -s 192.168.3.0/24 -j ACCEPT    //允许公司内网任何访问
 

1
2
3
4
5
6
7
8
9
10
[root@station230 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -j REJECT
[root@station230 ~]# service iptables save
[root@station230 ~]# chkconfig iptables on
[root@station230 ~]# iptables -vnL INPUT
[root@station230 ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
[root@station230 ~]# service iptables restart

 

小知识:
常见协议的端口 /etc/services
[root@station230 ~]# grep ^http /etc/services
服务        协议            端口/传输协议
ssh        ssh            22/tcp
http        http            80/tcp
            https            443/tcp
dns        domain        53/udp,53/tcp
mail        smtp            25/tcp                发信协议
            smtps       465/tcp             # SMTP over SSL (TLS)
            pop3            110/tcp                收信协议
            pop3s        995/tcp
            imap            143/tcp
            imaps        993/tcp
dhcp        bootps      67/udp              # BOOTP server
nfs        nfs            2049/tcp
samba                    137,138,139/tcp
                            445/tcp
ftp        ftp            21/tcp
            ftp-data        20/tcp
ntp       ntp            123/udp             # Network Time Protocol
syslog    syslog        514/udp
========================================================


示例3: 真实环境配置实例
一些常见允许外网访问的服务:                                        
网站 www        http            80/tcp                                    
                    https         443/tcp                                    
邮件 mail        smtp            25/tcp                                
                    smtps       465/tcp            
                    pop3            110/tcp                        
                    pop3s        995/tcp                                    
                    imap            143/tcp                                    
                                            
一些常见不允许外网访问的服务:                                        
文件服务器:    NFS                                        
                    SAMBA                                                
                    FTP            20/tcp,21/tcp
远程管理:     ssh             22/tcp    
                                        

1
2
3
4
5
6
7
8
9
10
[root@station230 ~]# iptables -F
[root@station230 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@station230 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@station230 ~]# iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -s 192.168.3.0/24 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@station230 ~]# iptables -A INPUT -j REJECT


配置该策略后:
1. 员工在公司内部(192.168.2.0/24,192.168.3.0/24)能访问服务器上的任何服务
2. 当员工出差例如在上海,通过VPN连接到公司
    外网 (员工) ===拨号到==> VPN服务器 =====> 内网FTP,SAMBA,NFS,SSH
========================================================

 

八、防火墙NAT功能
SNAT     源地址转换       出口POSTROUTING
DNAT     目标地址转换    进口PREROUTING

SNAT:源地址转换

目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机

目前大多都是解决内网用户用同一个公网地址上网的情况

DNAT:目标地址转换

和SNAT相反,源地址不变,重新修改目标地址,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机

 

错误提示:iptables table `nat': Table does not exist
编译内核,配置选项:
Networking —->
  Networking options —->
  [*] Network packet filtering (replaces ipchains)  —>
    Core Netfilter Configuration  —>
      <*> Netfilter Xtables support (required for ip_tables)
    IP: Netfilter Configuration —>
      <*> Connection tracking (required for masq/NAT)
      <*> IP tables support (required for filtering/masq/NAT)
      <*>   IP range match support
      <*>   Packet filtering
      <*>     REJECT target support
      <*>   Full NAT

==SNAT,源地址转换
作用:让内网用户可以通过NAT服务器访问外网

       内网                                                       NAT服务器                                    外网
client(192.168.5.80)—>eth0(192.168.5.240) NAT Server (1.1.1.254)eth1 —> Web(1.1.1.1) 
client(192.168.1.0)–>eth0(192.168.1.56) NAT Server(192.168.0.101)eth1 -> Web(192.168.0.155) 

1. iptables
#iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -j SNAT –to 1.1.1.254
# service iptables save
当内网的数据包到达POSTROUTING链时,修改数据的源地址1.1.1.254

 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
 iptables -A FORWARD -i eth1 -m state –state ESTABLISHED,RELATED -j ACCEPT
 iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

2. 打开内核的路由转发机制
# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 0
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p   立即生效
=========================================
临时开启路由转发机制:
echo 1 > /proc/sys/net/ipv4/ip_forward
=========================================
客户端测试:所有内网将网关指定NAT服务器的内网地址:
# links  -dump 1.1.1.1
   welcome to china

3. 限制上网
# iptables -A FORWARD -s 192.168.2.168 -j REJECT       //拒绝某个主机上网


==DNAT,目标地址转换
作用:外网用户访问内网服务器
注:内网用户必须已经以通过SNAT或其它方式访问外网
         内网                                                            NAT服务器                                    外网
Web Server(192.168.2.168)<—eth0(192.168.2.10) NAT Server(1.1.1.254)eth1 <— client(1.1.1.1)
Web Server(192.168.0.155)<–eth1(192.168.0.101)NAT Server(192.168.1.56)eth0<–client(192.168.1.0/24)
# iptables -t nat -A PREROUTING -d 1.1.1.254 -p tcp –dport 80 -j DNAT –to 192.168.2.168
# iptables -t nat -nL
# links -dump 1.1.1.254

DNAT扩展:
# iptables -t nat -A PREROUTING -d 1.1.1.254 -p tcp –dport 8080 -j DNAT –to 192.168.2.100:80
# iptables -t nat -A PREROUTING -d 1.1.1.254 -p tcp –dport 8081 -j DNAT –to 192.168.2.200:80

新版本中,不支持-to写法,只能:

iptables -i eth1 -t nat -A PREROUTING -s 111.200.213.0/24 -d 212.151.119.252 -p tcp --dport 9211 -j DNAT --to-destination 192.168.10.119:21

iptables -i eth1 -t nat -A PREROUTING -s 111.200.213.0/24 -d 212.151.119.252 -p tcp --dport 30000:31000 -j DNAT --to-destination 192.168.10.119

iptables -t nat -A POSTROUTING -j MASQUERADE

使用iptables为何不能将外部进入的包NAT到www.iaskjob.com

iptables -t nat -A PREROUTING -i eth0 -d 192.168.8.198 -p tcp --dport 22222 -j DNAT --to-destination 192.168.8.198:8

具体原因可以看这篇贴:https://www.linuxidc.com/Linux/2012-06/63520.htm

 

案例、实现本机端口8080转发到www.iaskjob.com:8080

iptables -t nat -A PREROUTING -d 192.168.8.198 -p tcp --dport 80 -j DNAT --to-destination www.iaskjob.com:8080

iptables -t nat -A PREROUTING -i eth0 -d 192.168.8.198 -p tcp --dport 22222 -j DNAT --to-destination 192.168.8.198:80

 

九、iptables规则防止cc攻击

connlimit模块允许你限制每个客户端ip的并发连接数,即每个ip同时连接到一个服务器个数。

connlimit参数:

  –connlimit-above n    #限制并发个数

iptables -I INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 100 -j REJECT

recent模块:

里面维护了一个地址列表,这个地址列表可以通过“–set”(将地址和时间戳添加进列表)、“–update”(刷新时间戳)、“–rcheck”(检查地址是否在列表)、“–remove”(删除)四种方法来修改列表

--name #设定列表名称,默认DEFAULT。
--rsource #源地址,此为默认。
--rdest #目的地址
--seconds #指定时间内
--hitcount #命中次数
--set #将地址添加进列表,并更新信息,包含地址加入的时间戳。
--rcheck #检查地址是否在列表,以第一个匹配开始计算时间。
--update #和rcheck类似,以最后一个匹配计算时间。
--remove #在列表里删除相应地址,后跟列表名称及地址。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT

备忘:每个IP目标端口为80的新连接会记录在案,可在/proc/net/xt_recent/目录内查看,rcheck检查此IP是否在案及请求次数,如果超过规则就丢弃数据包,否则进入下条规则并更新列表信息。

limit 模块

作业:
1. 了解FTP主、被动模式的区别
2. 实现SNAT、DNAT
3. 了解TCP/IP协议中的TCP协议
4. 了解iptables的七层功能L7
5. 记一些常用协议的端口
========================================================

企业级网络安全构建之 Iptables

Pingbacks已打开。

引用地址

暂无评论

发表评论