Linux防火墙安装与配置

iptables构建防火墙应用
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫netfilter。netfilter才是防火墙真正的安全框架,netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
iptables 有5张表

  • filter表:iptables中使用最广泛的表,作用是进行过滤,也是由filter表来决定一个数据包是否继续发往目的地址或者别拒绝。
  • nat表:用于网络地址转换,可以改变数据包的源地址或者目的地址
  • mangle表:用于修改IP头部信息,如修改TTL\TOS\MARK
  • raw表:为iptables提供了一种不经过状态追踪的机制,在大流量对外业务的服务器上使用这个表可以避免状态追踪带来的性能问题。
  • security表:提供数据包中加入SELinux特性的功能。一般不用

CentOS7如何安装iptables
CentOS7中默认安装的是firewalle。首先输入

service iptables status

确认是否安装了iptables,如果没有

#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

安装iptables

#安装iptables
yum install -y iptables
#升级iptables
yum update iptables
#安装iptables-services
yum install iptables-services

检查安装是否成功

systemctl status iptables

** Iptables 常用规则**

#查看iptables现有规则
iptables -L -n
#允许所有
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X
所有计数器归零
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

iptables修改规则
iptables的修改规则除使用命令行直接修改外也可以通过配置文件进行修改,使用(/etc/sysconfig/iptables,在配置文件中所有命令不用加前置命令 iptables),尽量采用脚本命令模式

一下是在实际生产中,对iptables命令进行的配置

#清除所有规则
iptables -F
#允许某些调用localhost的应用访问
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#允许从其他地方ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
在某种情况下,如:通过ipsec v*n时,MTU需要动态减少
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
#允许访问80,443端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#仅允许某来源的IP通过TCP访问某端口,如内网IP10.0.1.17访问22端口
iptables -A INPUT -p tcp -s 10.0.1.17 --dport 22 -j ACCEPT
#仅允许某来源的IP通过TCP访问某端口,如内网IP10.0.1.17访问161端口
iptables -A INPUT -p tcp -s 10.0.1.17 --dport 161 -j ACCEPT
#禁止非开放白名单流量进入
iptables -A INPUT -j DROP
#允许本机响应规则编号01-08的数据包发出
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
#禁止本机主动发出外部链接,可以有效地防止类似“反弹shell”的攻击
iptables -A OUTPUT -j DROP
#禁止本机转发数据包
iptables -A FORWARD -j DROP

命令常见参数说明

参数 说明
-A 添加一条规则
INPUT 链名,常用,大写
PREROUTING 链名,大写
OUTPUT 链名,大写
-s 指定源地址可以是IP地址,也可以是网段,“-s为空”,表示所有
-d 目标地址
-p 指定协议
–dport 指定主机端口(本机开放或拒绝端口)
–sport 指定主机端口(如:禁止连接对方某端口)
-i 指定网卡名,表示报文流入的接口
-j 指定所需要的操作
ACCEPT 允许
REJECT 拒绝,拒绝提供服务
DROP 拒绝,丢弃数据包不回应
-t 指定表名
-v 查看详细信息

配置完成后需要重启iptables服务

#注册iptables服务
systemctl enable iptables.service
#开启服务
systemctl start iptables.service
#查看状态
systemctl status iptables.service
#重启防火墙
/etc/init.d/iptables restart
systemctl restart iptables.service

iptables防火墙NAT网络地址转换
通过网络地址址转换可以有效减少直接部署公网IP地址的服务器数量,增强网络环境的安全性
Linux防火墙安装与配置
源地址转换,例如:上图无外网IP的服务器(Server B ) 需要发起连接访问互联网的场景,假设Server A 有外网网卡eth0(220.217.143.73)和eth1(10.128.70.112)
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 fileter -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT -to 220.217.143.73

通过上述三步操作,server B将会通过serverA 访问互联网,此时在互联网上看到的源地址是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 33.6 -j DNAT -to-source 10.128.70.112

利用DenyHosts防止暴力**
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重复的攻击时就会记录IP到/etc/hosts.deny文件下,从而达到自动屏蔽IP的功能。