day5-iptables
netfilter包过滤机制
iptables基本管理
fiter过滤和转发
iptables状态匹配
防火墙的类别
根据载体区分
硬件防火墙
软件防火墙
应用层
网络层——linux 包过滤 防火墙®
根据保护对象区分
主机防火墙
网络防火墙
netfilter
位于linux内核中的包过滤功能体系
称为linux防火墙的"内核态"
iptables
位于/sbin/iptables,管理规则的工具
称为linux防火墙的"用户态"
两种称呼都可指linux防火墙,用后者居多
iptables的表、链结构
iptables的表:
filter:防火墙
nat:网络地址转换
mangle:流量标记、着色——数据包优先级
raw:状态跟踪
规则链解析——chain
链的用途:存放一条条防火墙规则(rule)
链的分类依据:处理数据包的不同电动机
默认包括5种规则链
INPUT:处理入站数据包 //数据包的目的地是防火墙本身
OUTPUT:处理出站数据包 //数据包的源地址是防火墙本身
FORWARD:处理转发的数据包 //穿过防火墙的数据包
POSTROUTING:路由选择之后处理 //路由前
PREROUTING:路由选择之前处理 //路由后
规则表解析——table
表的用途:存放不同的规则链
表的分类依据:防火墙规则的作用相似
raw表:确定是否对数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包的源/目标地址或端口
filter表:确定是否放行该数据包
规则表之间的顺序
raw>>mangle>>nat>>filter
规则链之间的顺序
入站:INPUT>>PREROUTING
出站:OUTPUT>>POSTROUTING
转发:POSTROUTING>>FORWARD>>POSTROUTING
规则链内的匹配顺序
顺序比对,匹配即停止(LOG除外)
若无任何匹配,则按该链的默认策略处理
操作规则表
操作规则链
防火墙规则的增删改查
/sbin/iptables
格式
-t 表名 选项 链名 条件 -j 目标操作
iptables –t filter –L INPUT 查看filter表的INPUT链
iptables –L 查看filter表所有链的规则
iptabels –F 清空filter表所有链的规则
iptables –A INPUT –p tcp –dport 22 –j ACCEPT 设置防火墙允许ssh访问
iptables –P INPUT DROP 将INPUT链的默认规则设置为DROP
iptables基本用法
注意事项/总体规律
可以不指定表,默认为filter表
可以不指定链,默认为对应表的所有链
除非设置默认策略,否则必须指定匹配条件
选项/链名/目标操作用大写字母,其余都是小写
当默认规则设置为DROP/REJECT时,请先允许SSH允许规则
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志,然后传给下一条规则(匹配即停止,规律的唯一例外)
1、iptables基本管理
查看当前生效的防火墙规则列表
列出raw表的规则
nat表默认包括PREROUTING、POSTROUTING、OUTPUT这三个规则链
# iptables -t nat –L
列出raw表的规则
raw表默认包括PREROUTING、OUTPUT这两个规则链
# iptables -t raw –L
列出mangle表的规则
mangle表默认包括所有的五种规则链
# iptables -t mangle –L
追加、插入新的防火墙规则,修改现有的防火墙规则
若查看规则时,可以使用-n选项以数字开工显示地址、端口等信息
使用--line-numbers来显示规则的行号
-I,在开头或指定的位置插入一条新的防火墙规则
删除、清空描写的防火墙规则
删除指定的规则
删除指定具体内容的规则
清空filter表的规则
清空nat表的规则
2、filter过滤和转发控制
A主机
C主机也需要设置网关
#route add default gw 192.168.200.254
B转发主机
开启linux网关的路由转发功能(临时修改)
永久修改 vim /etc/sysctl.conf
net.ipv4.ip_forward=1
修改完后,更新一下配置
sysctl -p
当A、C主机设置好网关,B主机开启转发,就可进行通信了
防火墙filter表的出站、入站访问控制
测试允许ping别人,禁止别人ping网关
方法1:丢弃进来的ping请求包、允许进来的各种ping应答包
方法2:允许出去的ping请求包、丢弃出去的各种ping应答包
这是因为:防火墙DROP了从eth1接口进来发往192.168.100.0/24网段的数据包,这其中包括外网发来的HTTP请求包,也包括HTTP应答包,从而导致双方的访问受阻。
利用状态机制,放行从内网访问外网的数据包、放行内网收到的应答包及关联数据包,并且将FORWARD转发链的默认规则设为DROP:
比如A是内网,B是外网,A可以访问B,但B不可访问A
内外》外网web访问,取消状态跟踪
添加限制MAC地址防火墙规则
通过一条防火墙规则开放多个TCP服务,提高规则编写效率
指定IP地十范围设置封锁或放行规则
配置SNAT
C主机开启路由转发功能
删除B主机的网关 route del default gw
当设置完成以后,访问A主机时,记录的是网关地址192.168.200.254访问
使用SNAT策略,验证MASQUERAD伪装的有效性
访问A主机时,记录的扔然是网关地址192.168.200.254访问
配置DNAT
访问C主机eth1网卡地址时,记录的是本机地址访问
通过 DNAT策略发布内网的SSH服务器
访问C主机ETH1网口:端口为2222,连接A 主机
测试成功
通过DNAT策略发布内网的FTP服务器
加载FTP模块
防火墙脚本设置
编写典弄的LINUX网关防火墙脚本
vim /root/bin/iptables-gw.sh
#!/bin/bash
## 2015.05.20 TsengYia.
#### 1. 定义方便移植的环境变量 ####
INET_IF="eth1"
INET_IP="174.16.16.1"
LAN_NET="192.168.4.0/24"
LAN_WWW_IP="192.168.4.5"
IPT="/sbin/iptables"
#### 2. 内核参数、相关模块调整 ####
/sbin/modprobe nf_nat_ftp
/sbin/sysctl -w net.ipv4.ip_forward=1
/sbin/sysctl -w net.ipv4.ip_default_ttl=128
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_all=1
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_broadcasts
/sbin/sysctl -w net.ipv4.tcp_syncookies=1
/sbin/sysctl -w net.ipv4.tcp_syn_retries=3
/sbin/sysctl -w net.ipv4.tcp_synack_retries=3
/sbin/sysctl -w net.ipv4.tcp_fin_timeout=60
/sbin/sysctl -w net.ipv4.tcp_max_syn_backlog=3200
#### 3. 清空旧规则,并设置各链的默认规则 ####
#/etc/init.d/iptables stop
$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
#### 4. 自定义规则 .. ####
#### 4.1 nat表的详细策略
$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 --t
o-destination $LAN_WWW_IP
#### 4.2 filter表的详细策略
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp -m multiport --dport 20:22,25,80
,110,143,443,993,995 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --dport 80 -j ACCEPT
$IPT -A FORWARD -s $LAN_WWW_IP -p tcp --sport 80 -j ACCEPT
chmod +x /root/iptables-gw.sh
将脚本设置开机启动
vim /etc/rc.local
头加入#!/bin/sh
在最后一行加入
bash /root/bin/iptables-gw.sh
编写网络型、主机型防护规则
主机型脚本
控制的数据包侧重于本机与其他主机之间的访问,因此iptables防火墙规则以 filter 表的 INPUT 链为主,OUTPUT 链其次
vim /root/bin/iptables-host.sh
#!/bin/bash
## 2015.05.20 TsengYia.
#### 1. 定义方便移植的环境变量 ####
INET_IF="eth0"
INET_IP="192.168.4.5"
IPT="/sbin/iptables"
#### 2. 内核参数、相关模块调整 ####
/sbin/sysctl -w net.ipv4.ip_forward=0
/sbin/sysctl -w net.ipv4.ip_default_ttl=128
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_all=1
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_broadcasts
/sbin/sysctl -w net.ipv4.tcp_syncookies=1
/sbin/sysctl -w net.ipv4.tcp_syn_retries=3
/sbin/sysctl -w net.ipv4.tcp_synack_retries=3
/sbin/sysctl -w net.ipv4.tcp_fin_timeout=60
/sbin/sysctl -w net.ipv4.tcp_max_syn_backlog=3200
#### 3. 清空旧规则,并设置各链的默认规则 ####
#/etc/init.d/iptables stop
$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
#### 4. 自定义规则 .. ####
$IPT -A INPUT -p tcp -m multiport --dport 22,25,80,110,143,443,993,995,2150:2750 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
然后开机运行
网络型脚本
控制的数据包侧重于内网、外网之间的访问,因此iptables防火墙规则以 filter 表的 FORWRD 链为主,需要地址转换时还会用到nat表。
vim /root/iptables-gw.sh
使用IP地址黑/白名单
定义白名单
vim /root/bin/iptables.blist
192.168.10.100
定义黑名单
vim /root/bin/iptables.hlist
192.168.20.200
脚本
vim /root/bin/iptables-hblist.sh
#### 5. White & Black List .. ####
WHITE_LIST="/opt/ipfw.wlist"
for i in $(grep -v "^#" $WHITE_LIST) //遍历设置白名单规则
do
$IPT -I INPUT -s $i -j ACCEPT
$IPT -I OUTPUT -d $i -j ACCEPT
$IPT -I FORWARD -s $i -j ACCEPT
$IPT -I FORWARD -d $i -j ACCEPT
done
BLACK_LIST="/opt/ipfw.blist"
for i in $(grep -v "^#" $BLACK_LIST) //遍历设置黑名单规则
do
$IPT -I INPUT -s $i -j DROP
$IPT -I OUTPUT -d $i -j DROP
$IPT -I FORWARD -s $i -j DROP
$IPT -I FORWARD -d $i -j DROP
done