Linux防火墙IPTABLES的安装与配置

一、IPTABLES防火墙

1.IPTABLES概述

iptables其实不是真正的防火墙,我们可以把他理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫做netfilter。netfilter才是真正的安全框架(frameword),netfilter位于内核空间。iptables其实就是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。netfilter\iptables组成linux平台下的包过滤防火墙,与大多数linux软件一样,这个防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换等功能。

2.iptables中的五张表

filter表:iptables中使用最广泛的表,作用是进行过滤,也是由filter表来决定一个数据包是否继续发往目的地址或者被拒绝。

nat表:用于望楼地址转换,可以改变数据包的源地址或者目标地址

mangle表:用于修改IP的头部信息,如修改ttl

raw表:为iptables提供了一种不经过状态追踪的机制,在大流量对外业务的服务器上使用这个表,可以避免状态追踪带来的性能问题。

security表:提供在数据包中加入SELinux特性的功能。在实际应用中,security一般不常用。

 

这里,我们使用的CentOS 7进行iptables安装配置演示。

二、禁用默认防火墙

CentOS默认的防火墙是firewalld,所以我们首先需要通过命令,停用并禁用默认的防火墙:.

systemctl stop firewalld 

systemctl mask firewalld

Linux防火墙IPTABLES的安装与配置

我们可以看到,默认的防火墙已经停止运行。

三、软件的安装

我们通过yum命令,安装iptables

yum –y install iptables

yum update iptables

yum –y install iptables-services

我们可以通过systemctl status iptables检测安装是否完成。

Linux防火墙IPTABLES的安装与配置

安装完成后,我们就可以根据需求,进行防火墙配置了.。

四、常见参数说明

这里,我们先对iptables的常用参数进行说明:

需要注意的是,Linux是个严格区分大小写的系统,所以所有命令,也需要严格遵循大小写。

参数

说明

-A

添加一条规则

INPUT

链名

PREROUTING 链名
OUTPUT 链名
-s

指定源地址,可以是IP地址或网段。-s “空”表示所有

-d 目标地址
-p 指定协议
--dport

指定主机端口(本机开放或拒绝端口)

--sport 指定主机端口(如:禁止链接对方某端口)
-i 指定网卡名,表示报文流入的接口
-o 指定网卡名,表示报文流出的接口
-j 指定所需要的操作
ACCEPT 允许
REJECT 拒绝, 拒绝提供服务
DROP 拒绝,丢弃数据包不回应
--src-range 源地址范围
--dsc-range 目标地址的范围
--mac-source 源主机的mac地址
-t 指定表名,默认的是filter表
-v 查看详细信息
-nvL --line-numbers

查看fliter表中规则的顺序

-nvL -t mangle 查看mangle表中的防火墙规则

-F

清空fliter表
-I 指定链插入规则
-R 替换规则
-m

指定模块

 

五、iptables的常用规则

iptables -L -n :查看现有的规则

iptables -P INPUT ACCEPT:允许所有(在配置时,先允许)

iptables -F:清空所有默认规则

iptables -X:清空所有自定义规则

iptables -Z:所有计数器归0

iptables -A INPUT -i lo -j ACCEPT:允许来自于lo接口的数据包(本地访问)

iptables -A INPUT -p tcp --dport 22 -j ACCEPT:开放22端口(远程链接linux端口)

iptables -A INPUT -p tcp --dport 21 -j ACCEPT:开放21端口(FTP端口)

iptables -A INPUT -p tcp --dport 80 -j ACCEPT:开放80端口(HTTP端口)

iptables -A INPUT -p tcp --dport 443 -j ACCEPT:开放443端口(HTTPS端口)

iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT:允许ping

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT:允许接受本机请求之后的返回数据related,是为ftp设置的

iptables -P INPUT DROP:其他入站一律丢弃

iptables -P OUTPUT ACCEPT:所有出站都允许

iptables -P FORWARD DROP:所有转发一律丢弃

iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT:添加内网ip信息(接受所有TCP)请求

iptables -P INPUT DROP:过滤所有非以上规则的请求

iptables -I INPUT -s ***.***.***.*** -j ACCEPT:封停该ip

iptables -D INPUT -s ***.***.***.*** -j DROP :解封该ip

除了以上命令行修改规则,我们也可以通过直接修改配置文件的方式进行修改使用,路径为/esc/sysconfig/iptables,在配置文件中所有命令不加前置命令iptables。不过尽量采用脚本命令模式。

六、实际生产中,iptables常用的命令配置

iptables -F:清除所有规则

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1-j ACCEPT:允许某些调用localhost应用访问。

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT:允许其他地方ping

iptables -A INPUT -p cmp --icmp-type fragmentation-needed -j ACCEPT :允许从其他主机/网络设备发送MTU调整报文

iptables -A INPUT -p tcp --dport 80 -j ACCEPT:开放80端口(HTTP端口)

iptables -A INPUT -p tcp --dport 443 -j ACCEPT:开放443端口(HTTPS端口)

iptables -A INPUT -p tcp -s 10.0.1.17 --dport 22 -j ACCEPT:仅允许内网10.0.1.17,通过tcp访问22端口。

iptables -A INPUT -p udp -s 10.0.1.17 --dport 161 -j ACCEPT:仅允许内网10.0.1.17,通过UDP访问161端口。

iptables -A INPUT -j DROP:禁止非开放白名单流量进入。

iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT:允许本机响应规则为01-08的数据包发出

iptables -A OUTPUT -j DROP:禁止本机主动发出外部链接,可以有效的防止类似“反弹shell”的攻击

iptables -A FORWARD -j DROP:禁止本机转发数据包

七、重启服务

当我们配置完成后,需要重启iptables服务,启动服务通过如下命令:

systemctl enable iptables.service:注册iptables服务

systenctl start iptables.service:开启服务

systemctl status iptables .service:查看状态

systemctl restart iptables.service:重启防火墙

八、网络地址转换

在实际工作中,iptables还经常用于网络地址转换(NAT),通过网络地址转换,可以有效的减少直接部署公网IP地址的服务器数量,增强网络环境的完全性。

例如:下图中无外网IP的服务器(Server B)需要发起链接访问互联网的场景,假设Server A有外网网卡eth0(220.217.143.73)和eth1(10.128.70.112)。

Linux防火墙IPTABLES的安装与配置

具体步骤:

源地址转换:

1.在Server B上指定其网络默认网关是Server A的内网地址(10.128.70.112)

2.在Server A上启动路由功能。

sysctl -w net.ipv4.ip_forward=1

3.在Server A上设置iptables规则。

iptables -t filter -A FORWARD -j ACCEPT

iptables -t nat -A POSTROUTING -o enth 0 -j SNAT -to 220.217.143.73

通过上述三步操作,Server B将会通过Server A访问互联网,此时在互联网上看到的源地址是Server A的外网IP。

 

目标地址转换:

目标地址转换用于外部用户直接访问无外网IP的服务器,例如:外部用户希望访问Server B上的MySQL数据库,端口3306,那么在Server A上可以进行如下配置:

iptables -t nat -A PREROUTING -d 220.217.143.73 -p tcp -m tcp --dport 3306-j DNAT --to-destination 10.128.70.111:3306

iptables -t nat -A POSTROUTING -d 10.128.70.111 -p tcp -m tcp --dport 3306 -j DANT --to-source 10.128.70.112