iptables 介绍
Netfilter/Iptables(以下简称 Iptables)是 unix/Linux 自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具, 它的功能十分强大, 使用非常灵活, 可以对流入和流出服务器的数据包进行很精细的控制.
iptables 是 linux2.4 及 2.6 内核中集成的服务.
iptables 主要工作在 OSI 七层的二, 三, 四层, 如果重新编译内核, iptables 也可以支持 7 层控制
iptables 防火墙使用时名词概念
容器: 装东西的器皿, docker 容器技术, 将镜像装在了一个系统中, 这个系统就称为容器
iptables 称为一个容器 --- 装着防火墙的表
防火墙的表又是一个容器 --- 装着防火墙的链
防火墙的链也是一个容器 --- 装着防火墙的规则
iptables--- 表 --- 链 --- 规则
规则: 防火墙一条一条安全策略
防火墙匹配规则流程:
防火墙是层层进行过滤的, 实际是按照配置规则的顺序从上到下, 从前到后进行过滤
如果匹配上规则, 即明确表示是阻止还是允许, 数据包也就不在往下进行区配新的规则
如果规则中没有明确表示是阻止还是允许, 也就没有匹配规则, 向下进行匹配, 直到匹配默认规则是阻止还是允许
防火墙默认规则是所有规则都执行完毕后才执行的
表与链: 4 表 5 链
Filter 表: 实现防火墙过滤功能
INPUT 链: 对于指定到本地套接字的包, 即到达本地防火墙服务器的数据包, 相当于从外面要进入到里面
FORWARD 链: 路由穿过的数据包, 即经过本地防火墙的数据包
OUTPUT 链: 本地创建的数据包
NAT 表: 实现将数据包中的 IP 地址或端口信息, 内网到外网进行改写 / 外网到内网进行改写
PREROUTING: 一进来就对数据包进行改变, 在路由之前, 进行数据包 IP 地址或端口信息的转换
OUTPUT: 本地创建的数据包在路由之前进行改变, 本地防火墙要出去的流量进行相应转换
POSTROUTING: 在数据包即将出去时改变数据包信息, 在路由之后, 进行数据包 IP 地址或商端口信息的转换
Managle 表: 对数据进行标志
raw 表: 忽略不计
iptables 的参数说明
iptables -F: 清除防火墙默认规则
iptables -X: 清除防火墙自定义链
iptables -Z: 清除防火墙计数器信息
iptables 防火墙信息查看方法
iptables -L: 以列表形式显示所有规则信息
iptables -L -n:-n 表示以数字形式显示 IP 地址或端口信息, 不转换为字符串显示
iptables -t nat -L -n:-t 表示指它查看或配置相应的表
iptables -L -n -v:-v 表示显示详细的规则信息, 包含匹配计数器数值信息
iptables -L -n --line-number:--line-number 表示规则序号信息
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: 表示将规则添加到指定链上
-D: 表示将规则从指定链上删除
-I: 表示将规则插入到指定链上
-R: 表示将规则信息进行修改
-p: 指定相应的服务协议信息(tcp upd icmp all)
-dport: 表示指定目标端口信息
-sport: 表示指定源端口信息
-j: 指定对相应区配规则执行什么操作(ACCEPT,DROP,REJECT)
实例 2: 阻止相应网段主机访问服务端指定端口服务
10.0.0.0/24 访问 80 端口阻止
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 80 -j DROP --- 禁止网段
iptables -t filter -R INPUT 1 -s 10.0.0.9 -p tcp --dport 80 -j DROP --- 禁止单个主机
iptables -t filter -A INPUT -i eth0 -s 10.0.0.253 -p tcp --dport 80 -j DROP -- 禁止从 eth0 网卡进入的流量访问
参数信息:
-s: 指定匹配的源地址网段信息或主机信息
-d: 指定区配的目标地址网段信息或区配的主机信息
-i: 指定匹配的进入流量接口信息, 只能配置在 IPNUT 链上
-o: 指定区配的发出流量接口信息, 只能配置在 OUTPUT 链上
实例 3: 除了某个地址可以访部 80 端口, 其它地址都 不能访问
只允许 10.0.0.8 访问, 其它的都不能访部
- iptables -t filter -A INPUT -s 10.0.0.8 -p tcp --dport 80 -j ACCEPT
- iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 80 -j DROP
二合一写法:
iptables -t filter -A INPUT ! -s 10.0.0.8 -p tcp --dport 80 -j DROP -- 利用! 进行取反, 除 10.0.0.9 以外的主机全部拒绝
实例 4: 指定阻止访问多个端口服务
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: 表示可以匹配个多个不连续端口信息
实例 5: 实现禁 Ping 功能
实现禁 ping 功能测试链路是否正常, 基于 ICMP 协议, icmp 协议分为多种:
icmp-type 8: 请求类型
icmp-type 0" 回复类型
情况一: 实现禁止主机访问防火墙服务器(禁 ping)
- iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
- iptables -t filter -A OUTPUT -p icmp --icmp-type 0 -j DROP
情况二: 实现禁止防火墙访问主机服务器(禁 ping)
- iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j DROP
- iptables -t filter -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
实践 6: 实现防火墙状态机制控制
NEW: 发送数据包里面控制字段为 syn=1, 发送第一次握手的数据包
ESTABLISHED: 请求数据包发出之后, 响应回来的数据包称为回复的包
RELATED: 基于一个连接, 然后建立新的连接
INVALID: 无效的的数据包, 数据包结构不符合正常要求的
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
企业案例 1: 部署一个安全的企业防火墙
1. 保存防火墙配置信息
[root@web01 ~]# 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 策略配置永久保存
1. 利用防火墙启动脚本命令参数, 实现永久保存
/etc/init.d/iptables save
2. 利用防火墙配置信息保存命令, 实现永久保存
iptables-save>/etc/sysconfig/iptables
企业案例 2: 利用 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
ps: 网络数据包传输过程一定是有去有回的
实践二: 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 目的地址改写.
来源: http://www.bubuko.com/infodetail-2983474.html