IPtables
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。
- netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
- iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。
数据包发送原理
数据包在进入到我们的网卡没有经过路由决策时有PREROUTING链,在经过路由决策后可以经过INPUT链进入到本机应用层或者通过转发经由FORWARD链直接出去而不进入本机应用层,出去还需要经过POSTROUTING链,而进入本机后出来到达路由决策前具有OUTPUT链。
链是数据包流向经过的路径,那么如何使用这些链呢,防火墙规则里有多个表,而我们的链就是放在表里的规则上的。
规则的功能分为以下4种:
规则 | 功能 |
---|---|
filter | 过滤功能,定义是否允许通过防火墙,INPUT,OUTPUT,FORWARD都需要用到过滤的功能 |
nat | 地址转换,启用connection_track模块;PREROUTING,POSTROUTINIG,FORWARD都需要用到转换的功能 |
mangle | 用于对数据包相关字段的修改;PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING都可以用到 |
raw | 目标是关闭nat表上启用的连接追踪功能;PREROUTING, OUTPUT都需要用到此功能 |
一、NAT
1.SNAT
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
做SNAT转发,修改数据包来源报头:
客户端:172.16.18.5
NAT主机:172.16.18.6
公网:192.168.1.123
内部请求出去时:客户端所发出的封包表头中,来源会是172.16.18.5,然后传送到 NAT 这部主机; NAT 这部主机的内部接口 (172.16.18.6) 接收到这个封包后,会主动分析表头数据, 因为表头数据显示目的并非本机,所以开始经 过路由, 将此封包转到公网 IP 处(192.168.1.123); 主机透过 iptables 的 NAT table 内的 Postrouting 链将封包表头的来源伪装成为本机公网IP ,并且将两个不同来源 (172.16.18.5 及 公网IP) 的封包对应写入暂存内存当中, 然后将此封包传送出去了;
接受返回数据包时:在 Internet 上面的主机接到这个封包时,会将响应数据传送给那个公网IP的主机;当 NAT 服务器收到来自 Internet 的数据后,会分析该数据包的序号,并比对刚刚记录到内存当中的数据, 由于发现该封包为后端主机之前传送出去的,因此在 NAT Prerouting 链中,会将目标 IP 修改成为后端主机(172.16.18.5),然后发现目标已经不是本机, 所以开始透过路由分析封包流向;将数据传送到172.16.18.6 这个内部接口,然后再传送到最终目标主机上去!
2.DNAT
当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
外部主机想要连接到目的端的WEB服务,则必须要连接到我们的 NAT 服务器上; 我们的 NAT 服务器设定 port 80转发 ,所以当 NAT 服务器接到这个封包后(源地址192.168.1.34|目标地址192.168.1.123), 会将目标地址在PREROUTING转为172.16.18.5,源地址不变 ,且将该封包相关信息记录下来,等待内部服务器的响应;172.16.18.5 会响应数据给192.168.1.34 ,当这个响应经过POSTROUTING时伪装源地址为192.168.1.123,目标地址不变(192.168.1.34)传送出去!
首先安装服务:
[root@foundation79 Desktop]# yum install iptables-services.x86_64 -y
iptables命令选项输入顺序:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> –sport 源端口 <-d 目标IP/目标子网> –dport 目标端口 -j 动作
规则链名 | 实现功能 |
---|---|
INPUT | 处理输入数据包 |
OUTPUT | 处理输出数据包 |
PORWARD | 处理转发数据包 |
PREROUTING | 用于目标地址转换(DNAT) |
POSTOUTING | 用于源地址转换(SNAT) |
动作 | 功能 |
---|---|
accept | 接收数据包 |
DROP | 丢弃数据包 |
REDIRECT | 重定向、映射、透明代理 |
SNAT | 源地址转换 |
DNAT | 目标地址转换 |
MASQUERADE | IP伪装(NAT),用于ADSL |
LOG | 日志记录 |
1.添加规则:
将源地址是 172.25.254.0/24的数据包进行地址伪装
[root@localhost backup]# iptables -t nat -A POSTROUTING -s 172.25.254.0/24 -j MASQUERADE
You have new mail in /var/spool/mail/root
[root@localhost backup]# iptables -t nat -vnL #查看nat表
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * * 172.25.254.0/24 0.0.0.0/0
iptables -t nat -vnL 查看nat表 -n:数字格式; -v:verbose,详细格式信息; |
–line-number可以显示规则序号,在删除的时候比较方便
2.删除规则
[root@localhost ~]# iptables -t nat -D POSTROUTING 1 #删除nat表中postrouting的第一条规则
二、Filter
建立规则链:
规则链格式
pkts | bytes | target | prot | opt | in | out | source | destination |
---|---|---|---|---|---|---|---|---|
包数 | 字节数 | 目标 | 协议 | 选项 | 流入的接口 | 流出的接口 | 源地址 | 目标地址 |
1.基于端口:
ptables [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源 IP/网域] [–sport 端口范围] [-d 目标 IP/网域] [–dport 端口范围] -j [ACCEPT|DROP|REJECT]
[root@localhost ~]#iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许ssh服务访问22端口
[root@localhost ~]#iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许http服务访问80端口
[root@localhost ~]#iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
[root@localhost ~]#iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
例子:
创建一条屏蔽tcp协议网段为172.25.254.0/24的主机来访问本机的80端口。
[root@localhost ~]# iptables -A INPUT -p tcp -s 172.25.254.0/24 -d 172.25.254.79 --dport 80 -j DROP
[root@localhost ~]# iptables -L -nv #查看iptables的规则
Chain INPUT (policy ACCEPT 9 packets, 660 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 172.25.254.0/24 172.25.254.79 tcp dpt:80
2.基于数据包
iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
常用的有 0: echo-reply, ping响应 、 8: echo-request, ping请求
拒绝被别人ping通:
[root@localhost ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 9 packets, 660 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
3.基于状态创建规则
iptables -A INPUT [-m state] [–state 状态]
例子:创建一条规则,进入本机已建立的会话和与会话有关联关系的给与放行,其他的全拒绝
iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -L -nvChain INPUT (policy ACCEPT 1 packets, 94 bytes)
pkts bytes target prot opt in out source destination
17 1158 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
4.创建一条自定义防火墙规则
iptables [-t table] -N Chain
自定义链只可被应用。
iptables -t filter -N WEBChain
并被tcp 80端口出去的调用此规则。规则是拒绝192.168.1.123从tcp 80端口出去。
5.防火墙规则配置
(1)修改规则
[root@localhost backup]# iptables -R INPUT 2 -j REJECT
[root@localhost backup]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
(2)删除规则
[root@localhost backup]# iptables -D INPUT 2 //删除input的第2条规则
[root@localhost backup]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
[root@localhost backup]# iptables -F INPUT #清空 filter表INPUT所有规则
[root@localhost backup]# iptables -F #清空所有规则
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:20
(3)插入规则
插入规则到指定位置:
[root@localhost backup]# iptables -I INPUT 2 -p tcp -m tcp --dport 20 -j ACCEPT
[root@localhost backup]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:20
(4)设置默认规则
设置默认规则为ACCEPT
[root@localhost backup]# iptables -P INPUT ACCEPT
传送门:
防火墙策略