防火墙
防火墙
iptables防火墙(一)
防火墙概述
1、概念与作用
网络中的防火墙,是一种将内部网络和外部网络分开的方法,是一种隔离技术。防火墙
在内网与外网通信时进行访问控制,依据所设置的规则对数据包作出判断,最大限度地阻止
网络中的黑客破坏企业网络,从而加强企业网络安全。2、防火墙的分类
(1)硬件防火墙:如思科的 ASA 防火墙,H3C 的 Sepath 防火墙等。
(2)软件防火墙:如 iptables 等
按架设的位置,可以分为主机防火墙、网关防火墙3、iptables 防火墙
Linux 操作系统中默认内置一个软件防火墙,即 iptables 防火墙
(1)netfilter
位于 Linux 内核中的包过滤功能体系,称为 Linux 防火墙的“内核态”
(2)iptables
位于/sbin/iptables,用来管理防火墙规则的工具,称为 Linux 防火墙的“用户态”4、包过滤的工作层次
主要是网络层,针对 IP 数据包,体现在对包内的 IP 地址、端口等信息的处理上。
iptables规则链
1、规则链
规则的作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机2、默认包括 5 种规则链
INPUT:处理 入站数据包
OUTPUT:处理 出站数据包
FORWARD:处理 转发数据包
POSTROUTING:在进行 路由选择后处理数据包
PREROUTING:在进行 路由选择前处理数据包
iptables规则表
1、规则表
表的作用:容纳各种规则链
表的划分依据:防火墙规则的动作相似2、默认包括 4 个规则表
raw 表:确定是否对该数据包进行状态 跟踪
mangle 表:为数据包设置 标记
nat 表: 修改数据包中的源、目标 IP 地址或端口
filter 表:确定是否被放行该数据包(过滤)
3、链表结构关系图
iptables匹配流程
1、规则表之间的顺序:
raw→mangle→nat→filter2、规则链之间的顺序:
入站:PREROUTING→INPUT
出站:OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING3、规则链内的匹配顺序
·按顺序依次检查,匹配即停止(LOG 策略例外)
·若找不到相匹配规则,按该链的默认策略处理
iptables命令
1、语法构成
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]注意事项:
不指定表名时,默认指 filter 表
iptables -t nat -L --->看nat表
iptables -F --->只是清空链规则
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写2、数据包的常见控制类型
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配
常用选项
(1)增加新的规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
-p icmp --->-p指定协议,icmp是ping的协议
(2)查看规则列表
-L:列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号。--line 与之同效
(3)删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
(4)修改、替换规则
-R:修改替换规则
(5)设置默认规则
-P:为指定的链设置默认规则
需要注意的是,若要设置 filter 表中 INPUT 链或者 OUTPUT 链的默认规则为 DROP 时,
要先设置 tcp 协议 22 端口(ssh 远程连接)为 ACCEPT,否则通过远程操控的主机将断开连
接,若在真实生产环境中,需要到服务器所在机房重新设置才可以,造成不必要的麻烦。
规则的匹配类型
1、通用匹配
可直接使用,不依赖与其他条件或扩展
包括网络协议、IP 地址、网络接口等条件2、隐含匹配
要求以特定的协议匹配作为前提
包含端口、TCP 标记、ICMP 类型等条件3、显式匹配
要求以“-m 扩展模块”的形式明确指出类型
包括多端口、MAC 地址、IP 范围、数据包状态等条件
常用管理选项汇总表
通用匹配
常见的通用匹配条件:
1、协议匹配:-p 协议名
2、地址匹配:-s 源地址、-d 目的地址
3、接口匹配:-i 入站网卡、-o 出站网卡
规则链都DROP的情况下SHELL连接不掉线
把所有规则链都DROP的情况下SHELL连接不掉线
SHELL走的是INPUT和OUTPUT规则链
iptables -I INPUT -s 192.168.200.1 -d 192.168.200.69 -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -s 192.168.200.69 -d 192.168.200.1 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -L -nv
拿一台服务器充当网关,让iptables1和iptables3主机能跨网段ping通
iptables1主机网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.200.69
NETMASK=255.255.255.0
GATEWAY=192.168.200.100
网关服务器配置文件及IP地址
需要2块网卡在不同网段
第一块网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.200.100
NETMASK=255.255.255.0
第一块网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.100.100
NETMASK=255.255.255.0
IP地址
iptables3主机网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.100.166
NETMASK=255.255.255.0
GATEWAY=192.168.100.100
测试阶段
iptables1主机ping网关服务器
这里为何能跨网段ping通192.168.100.100是因为网关服务器不需要转发只在本地就有这个IP
跨网段ping通iptables3
开启网关服务器ipv4地址网卡配置之间的转换
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 --->默认是0关闭状态
sysctl -p --->即时生效
关闭除了FORWARD规则链测试
因为Xshell是从input端口进来的所以这里在虚拟机上测试,而ping只是通过网关服务器转发(FORWARD)给主机3
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -L -nv
iptables防火墙(二)
隐含匹配
常见的隐含匹配条件:
1、端口匹配:--sport 源端口、--dport 目的端口
2、TCP 标记匹配:--tcp-flags 检查范围 被设置的标记
3、ICMP 类型匹配:--icmp-type ICMP 类型
常见的 icmp 类型
8 Echo request——回显请求(Ping 请求)
0 Echo Reply——回显应答(Ping 应答)
3 错误回显
获取帮助:iptables -p icmp -h
显式匹配
常用的显示匹配条件:
1、多端口匹配:-m multiport --sports 源端口列表、-m multiport --dports 目的端口列表
2、IP 范围匹配:-m iprange --src-range IP 范围
3、MAC 地址匹配:-m mac --mac-source MAC 地址
4、状态匹配:-m state --state 连接状态
常见的连接状态:
NEW:新连接,与任何连接无关
ESTABLISHED:响应请求或已建立连接的
RELATED:与已连接有相关性的,如 FTP 数据连接
常见匹配条件汇总表
iptables防火墙应用
SNAT策略
SNAT测试阶段
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.100.100
DNAT策略
DNAT测试阶段
首先安装一个Nginx在iptables1上,Nginx配置文件如下(安装过程忽略)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name sl.yunjisuan.com;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
cd /usr/local/nginx/html/
echo "`hostname -I` sl.yunjisuan.com" > index.html
echo "`hostname -I` sl.yunjisuan.com" >> /etc/hosts
/usr/local/nginx/sbin/nginx
curl sl.yunjisuan.com:8080 --->默认访问是80,配置文件修改的是8080所以需要指定端口
网关服务器网卡配置文件及IP地址
网关服务器DNAT规则
iptables -t nat -A PREROUTING -i eth1 -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.69:8080
iptables3上配置
echo "192.168.100.100 sl.yunjisuan.com" >> /etc/hosts --->映射网关服务器
最终测试阶段
iptables 防火墙规则的备份与还原
设置完防火墙规则后,可备份规则到文件中,以便日后进行还原,或以备份规则为依据
编写防火墙脚本1、导出(备份)规则
iptables-save 工具
2、导入(还原)规则
iptables-restore 工具
重定向出的文件也可以是任意自定义的文件,若将规则保存到/etc/sysconfig/iptables 中,
iptables 启动时自动还原规则。
企业防火墙脚本编程与规范
1、“网关型”防火墙脚本
好的防火墙脚本要包括以下部分:
·定义基本变量,便于脚本的维护、重用
·加载必要的内核模块,将频繁用到的模块载入到内核
·调整/proc 参数,Linux 内核控制及调优
·具体的防火墙规则,按表、链分别设置规则,包括默认策略(1)定义基本变量
便于脚本的维护、重用
#!/bin/bash
INET_IF=”eth0”
INET_IP=”192.168.1.108”
LAN_IF=”eth1”
LAN_IP=”192.168.100.1”
LAN_NET=”192.168.100.0/24”
LAN_WWW_IP=”192.168.100.100”
IPT=”/sbin/iptables”
MOD=”/sbin/modprobe”
CTL=”/sbin/sysctl”
(2)加载必要的内核模块
将频繁用到的模块载入内核
$MOD ip_tables
$MOD ip_conntrack
$MOD ipt_REJECT
$MOD ipt_LOG
$MOD ipt_iprange
$MOD xt_tcpudp
$MOD xt_state
$MOD xt_multiport
$MOD xt_mac
$MOD ip_nat_ftp 支持 FTP 访问的地址转换
$MOD ip_conntrack_ftp 支持 FTP 访问的连接状态跟踪
(3)调整/proc 参数
Linux 内核控制及调优
$CTL -w net.ipv4.ip_forward=1 开启路由转发功能
$CTL -w net.ipv4.default_ttl=128 默认生存周期
$CTL -w net.ipv4.icmp_echo_ignore_all=1 根本不要响应 echo 包。请不要设置为缺省,它可
能在你正被利用成为 DoS 攻击的跳板时可能有用
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1 ping 子网的子网地址,所有的机器都应该
予以回应。这可能成为非常好用的拒绝服务攻击工具。设置为 1 来忽略这些子网广播消息
以下配置为优化 TCP 响应能力
$CTL -w net.ipv4.tcp_syncookies=1 tcp syncookie,默认关闭
$CTL -w net.ipv4.tcp_syn_retries=3 外向 syn 握手重试次数,默认 4
$CTL -w net.ipv4.tcp_synack_retries=3 syn-ack 握手状态重试次数,默认 5,遭受 syn-flood 攻
击时改为 1 或 2
$CTL -w net.ipv4.tcp_fin_timeout=60 默认 60,tcp fin 状态超时时间
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 syn队列,默认1024,> 1280可能工作不稳定,
需要修改内核源码参数
(4)具体的防火墙规则
按表、链分别设置规则,包括默认策略
清空原有规则:
$IPT -t filter -X 删除 filter 表内的用户自定义的链
$IPT -t nat -X
$IPT -t filter -F
$IPT -t nat -F
设置默认策略:
$IPT -P INPUT DROP
$IPT -p FORWARD DROP
$IPT -P OUTPUT ACCEPT
其他具体规则:
$IPT -I INPUT -p tcp --dport 22 -j ACCEPT
$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination
$LAN_WWW_IP
示例
2、“主机型”防火墙脚本
将 OUTPUT 链的默认策略设为允许,不添加其他规则
将 INPUT 链的默认策略设为拒绝,只放行对 Web 服务的访问,以及响应本机访问请求
的数据包#!/bin/bash
(1)定义基本变量
IPT=”/sbin/iptables”
(2)调整/proc 参数
(3)设置具体的防火墙规则
1>删除自定义的链、清空已有规则
$IPT -t filter -X
$IPT -t filter -F
2>定义默认策略
$IPT -P INPUT DROP
$IPT -p FORWARD DROP
$IPT -P OUTPUT ACCEPT
3>设置 filter 表中的各种规则
$IPT -A INPUT -m multiport -p tcp --dport 22,80 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
示例