首页 > 技术文章 > iptables

augustyang 2018-12-18 15:41 原文

 

一 iptables防火墙概念介绍
Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。

功能的优先级次序:raw --> mangle --> nat --> filter

iptables是linux2.4及2.6内核中集成的服务。
  iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持7层控制

 

iptables防火墙使用时名词概念理解
  容器:装东西的器皿,docker容器技术,将镜像装在了一个系统中,这个系统就称为容器
  iptables称为一个容器---装着防火墙的表
  防火墙的表又是一个容器---装着防火墙的链
  防火墙的链也是一个容器---装着防火墙的规则
  iptables---表---链---规则

 

 

iptables4表5链

功能:
  filter: 过滤,防火墙;
  nat: network address translation, 网络地址转换;
  mangle:拆解报文,做出修改,封装报文;
  raw:关闭nat表上启用的连接追踪机制;

表(tables)

  表(tables)是装链的容器, 即所有的链(chains)都属于对应的表(tables), 把Netfilter看成一套房子,表是其中的一个房间

链 (chains)(内置):

  链(chains)是装规则的容器, 把表(tables)当着一个房间, 链(chains)就是房间里面的箱子
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING

 规则(policy)

  规则(policy) 就是具体的方法

 

iptables/Netfilter 表(iptables) 链(chains) 规则(policy)
房子 房间 箱子 衣服

 

 

流入:  PREROUTING --> INPUT
流出:  OUTPUT --> POSTROUTING
转发:  PREROUTING --> FORWARD --> POSTROUTING

 

防火墙匹配规则流程:参见防火墙工作流程图
  1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
  2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
  3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,
   向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
  4. 防火墙的默认规则是所有规则执行完才执行的。

 

 

SYNOPSIS
       iptables [-t table] {-A|-C|-D} chain rule-specification

       iptables [-t table] -I chain [rulenum] rule-specification

       iptables [-t table] -R chain rulenum rule-specification

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name new-chain-name

 

 

 


-t, --table table
This option specifies the packet matching table which the command should operate on. If the kernel is configured with automatic module loading, an attempt will be made to load the appropriate module for that
table if it is not already there.


The tables are as follows:


filter:
This is the default table (if no -t option is passed). It contains the built-in chains INPUT (for packets destined to local sockets), FORWARD (for packets being routed through the box), and OUTPUT (for
locally-generated packets).


nat:
This table is consulted when a packet that creates a new connection is encountered. It consists of three built-ins: PREROUTING (for altering packets as soon as they come in), OUTPUT (for altering
locally-generated packets before routing), and POSTROUTING (for altering packets as they are about to go out).


mangle:
This table is used for specialized packet alteration. Until kernel 2.4.17 it had two built-in chains: PREROUTING (for altering incoming packets before routing) and OUTPUT (for altering locally-generated
packets before routing). Since kernel 2.4.18, three other built-in chains are also supported: INPUT (for packets coming into the box itself), FORWARD (for altering packets being routed through the box),
and POSTROUTING (for altering packets as they are about to go out).


raw:
This table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target. It registers at the netfilter hooks with higher priority and is thus called before
ip_conntrack, or any other IP tables. It provides the following built-in chains: PREROUTING (for packets arriving via any network interface) OUTPUT (for packets generated by local processes)

 

 

 

四个表

 

Filter

实现防火墙安全过滤功能

INPUT

对于指定到本地套接字的包,即到达本地防火墙服务器的数据包

FORWARD

转发流经主机的数据包, 起到转发作用, 和NAT表相关

OUTPUT

从本机发出去的数据包

NAT

实现将数据包中IP地址或者端口信息,内网到外网进行改写/外网到内网进行改写

FREROUTING

一进来就对数据包进行改变

在路由之前,进行数据包IP地址或端口信息的转换

例如:把公网IP: xxx.xxx.xxx.xxx 映射到局域网的 x.x.x.x 服务器

OUTPUT

本地创建的数据包在路由之前进行改变

本地防火墙要出去的流量进行相应转换(了解)

POSTROUTING

在数据包即将出去时改变数据包信息

在路由之后,进行数据包IP地址或端口信息的转换

局域网共享上网

Mangle

对数据进行标记

INPUT

进入到设备本身的包

FORWARD

对路由后的数据包信息进行修改

FREROUTING

在路由之前更改传入的包

OUTPUT

本地创建的数据包在路由之前改变

POSTROUTING

在数据包即将离开时更改数据包信息

Raw

 

PREROUTING

 

OUTPUT

 

 


五链 

 

 

 二 iptables 命令

1. iptables防火墙操作实践练习
  1)iptables防火墙配置初始化
  /etc/init.d/iptables start
  chkconfig iptables on
  iptables -F --- 清除防火墙默认规则
  iptables -X --- 清除防火墙自定义链
  iptables -Z --- 清除防火墙技术器信息

2)iptables防护墙信息查看方法
  /etc/init.d/iptables status
  iptables -L              --- -L 以列表形式显示所有规则信息
  iptables -L -n          --- -n 以数字形式显示IP地址或端口信息,不要转换为字符串显示
  iptables -t nat -L -n           --- -t 表示指定查看或者配置相应的表
  iptables -L -n -v          --- -v 表示显示详细规则信息,包含匹配计数器数值信息
  iptables -L -n --line-number  --- --line-number 显示规则序号信息

3)iptables防火墙端口规则配置:
  实践01:阻止用户访问服务器的22端口
  iptables -t filter -A INPUT -p tcp --dport 22 -j DROP --- -A 表示添加规则到相应链上,默认表示添加规则到结尾
  iptables -t filter -D INPUT -p tcp --dport 22 -j DROP --- -D 表示删除规则从相应链上。
  iptables -t filter -D INPUT 规则序号
  iptables -t filter -I INPUT -p tcp --dport 22 -j DROP --- -I 表示插入规则到相应链上,默认表示插入规则到首部
  iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP --- 指定规则插入位置
  iptables -t filter -R INPUT 6 -p tcp --dport 8080 -j DROP --- -R 指定将配置好的规则信息进行替换

 

总结防火墙参数信息:
  -A        表示将规则添加到指定链上
  -I       表示将规则插入到指定链上
  -D        表示将规则从指定链上删除
  -R        表示将规则信息进行修改
  -p         指定相应服务协议信息(tcp udp icmp all)
  --dport             表示指定目标端口信息
  --sport             表示指定源端口号信息
  -j                      指定对相应匹配规则执行什么操作(ACCEPT DROP* REJECT)

 

实践02:阻止相应网段主机访问服务端指定端口服务
10.0.0.0/24 -- 22端口(阻止)
  iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
  iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP
  iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22 -j DROP

总结参数信息
-s   指定匹配的源地址网段信息,或者匹配的主机信息
-d   指定匹配的目标地址网段信息,或者匹配的主机信息
-i   指定匹配的进入流量接口信息 只能配置在INPUT链上
-o   指定匹配的发出流量接口信息 只能配置在OUTPUT链上

 

实践03:除了莫个地址可以访问22端口之外,其余地址都不能访问
10.0.0.1 10.0.0.253 10.0.0.9(只允许)
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP

iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
通过利用 !进行规则取反,进行策略控制

 

实践04:指定阻止访问多个端口服务
22--80 22,24,25
  iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP --- 匹配连续的端口号访问
  iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP --- 匹配不连续的端口号访问

总结参数信息:
  -m        指定应用扩展模块参数
  multiport       可以匹配多个不连续端口信息

 

实践05: 通过防火墙实现禁ping功能
实现ping功能测试链路是否正常,基于icmp协议实现的
  icmp协议有多种类型:
  icmp-type 8:请求类型 icmp-type 0:回复类型

情况一:实现禁止主机访问防火墙服务器(禁ping)
  iptables -A INPUT -p icmp --icmp-type 8 -j DROP
  iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP

情况二:实现禁止防火墙访问主机服务器(禁ping)
  iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
  iptables -A INPUT -p icmp --icmp-type 0 -j DROP

默认情况:所有icmp类型都禁止
  iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
  iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP

 

 

实践06:实现防火墙状态机制控制
  NEW: 发送数据包里面控制字段为syn=1,发送第一次握手的数据包
  ESTABLISHED: 请求数据包发出之后,响应回来的数据包称为回复的包
  RELATED: 基于一个连接,然后建立新的连接
  INVALID: 无效的的数据包,数据包结构不符合正常要求的

  iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

 

07. 企业当中应用防火墙方法
项目:部署一个最安全的企业级防火墙(案例)
  两种思想:针对默认规则而言。
  逛公园:黑名单
    1、默认规则默认是允许的状态。
    看电影:白名单(更安全,推荐配置)
    2、默认规则默认是不允许的状态。更安全。
    看电影的思想更安全。

1)保存防火墙配置文件信息
  cp /etc/sysconfig/iptables{,.bak}

2)清除配置规则
  iptables -F      清空iptables所有规则信息(清除filter)
  iptables -X      清空iptables自定义链配置(清除filter)
  iptables -Z      清空iptables计数器信息(清除filter)

3)别把自己踢出到门外
  iptables -A INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT
  iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT

4)配置防火墙filter上各个链的默认规则
  iptables -P INPUT DROP
  iptables -P FORWARD DROP
  iptables -P OUTPUT ACCEPT

  -P    指定相应链的默认规则策略,是允许还是阻止

5)允许iptables服务端ping自己的网卡地址
  iptables -A INPUT -i lo -j ACCEPT  #让自己可以ping自己

6)指定外网可以访问的端口信息
  iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT

7)企业中内网之间不要配置防火墙策略
  iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT --- 允许架构内部服务进行访问

8)企业之间有合作关系的,不要将友商的网络禁止(主要经常改动)
  iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT --- 允许一些合作企业的外网服务器进行访问
  iptables -A INPUT -s 10.0.2.0/24 -j ACCEPT

9)如果防火墙上配置了FTP服务,需要配置网络状态机制
  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT --- 允许web服务与ftp服务器建立连接

 

10)实现iptables策略配置永久保存
  ①. 利用防火墙启动脚本命令参数,实现永久保存
  /etc/init.d/iptables save

  ②. 利用防火墙配置信息保存命令,实现永久保存
  iptables-save >/etc/sysconfig/iptables

 

实例拓展:避免自己被踢出门外
  01. 去机房重启系统或者登陆服务器删除刚才的禁止规则。
  02. 让机房人员重启服务器或者让机房人员拿用户密码登录进去
  03. 通过服务器的远程管理卡管理(推荐)
  04. 先写一个定时任务,每5分钟就停止防火墙
  05. 测试环境测试好,写成脚本,批量执行

  以上内容为防火墙filter表的配置实践与原理说明

 

 

08. 防火墙nat表的配置实践
  iptables NAT:(配置NAT表示就是配置以下两个链)
01. postrouting(内网---外网-NAT 源私网IP地址---源公网IP地址)
  路由之后,进行地址映射转换,把源地址进行转换(源私网地址==>源公网地址)
02. prerouting(外网---内网-NAT 目标公网IP地址---目标私网IP地址 映射目标端口)
  路由之前,进行地址映射转换,把目标地址进行转换(目标公网地址==>目标变为私网地址)

实践一:iptables实现共享上网方法(postrouting)
第一个历程:配置内网服务器,设置网关地址
  /etc/init.d/iptables stop --- 内网服务器停止防火墙服务
  ifdown eth0 --- 模拟关闭内网服务器外网网卡
  setup --- 修改内网网卡网关和DNS地址信息


  [root@oldboyedu42-lnb-02 ~]# route -n
  Kernel IP routing table
  Destination Gateway Genmask Flags Metric Ref Use Iface
  172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  0.0.0.0 172.16.1.7 0.0.0.0 UG 0 0 0 eth1
说明:内网服务器网关地址指定为共享上网服务器内网网卡地址

第二个历程:配置共享上网服务器,开启共享上网服务器路由转发功能
  [root@oldboyedu42-lnb-02 ~]# vim /etc/sysctl.conf
  [root@oldboyedu42-lnb-02 ~]# sysctl -p
  net.ipv4.ip_forward = 1

第三个历程:配置共享上网服务器,实现内网访问外网的NAT映射
  iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7
  -s 172.16.1.0/24      指定将哪些内网网段进行映射转换
  -o eth0         指定在共享上网哪个网卡接口上做NAT地址转换
  -j SNAT           将源地址进行转换变更
  -j DNAT         将目标地址进行转换变更
  --to-source ip地址     将源地址映射为什么IP地址
  --to-destination ip地址   将目标地址映射为什么IP地址

扩展如果开启:forward默认drop策略,如果配置forward链
  iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
  iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
  iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
  iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT

网络数据包传输过程一定是有去有回的

实践二:iptables实现共享上网方法(postrouting)
  iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE <- 伪装共享上网
说明:在企业中如何没有固定外网IP地址,可以采取以上伪装映射的方式进行共享上网

总结:配置映射方法
  01. 指定哪些网段需要进行映射 -s 172.16.1.0/24
  02. 指定在哪做映射 -o eth0
  03. 用什么方法做映射 -j SNAT/DNAT
  04. 映射成什么地址 --to-source ip地址/--to-destination ip地址

实践三:iptables实现外网IP的端口映射到内网IP的端口
需求:将网关的IP和9000端口映射到内网服务器的22端口
  端口映射 10.0.0.7:9000 -->172.16.1.8:22
实现命令:
  iptables -t nat -A PREROUTING -d 10.0.0.7 -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22

  (1)-d 10.0.0.8目标地址。
  (2)-j DNAT 目的地址改写。

 

推荐阅读