防火墙
防火墙:一道保护性的安全屏障,用于保护、隔离
防火墙的类别
• 根据载体区分:硬件防火墙
软件防火墙:应用层防火墙
网络层防火墙——Linux 包过滤 防火墙
• 根据保护对象区分:主机防火墙
网络防火墙
Linux包过滤防火墙
• netfilter:位于Linux内核中的包过滤功能体系
称为Linux防火墙的“内核态”
• iptables:位于/sbin/iptables,管理规则的工具
称为Linux防火墙的“用户态”
—— 两种称呼都可指Linux防火墙,用后者居多
iptables管理结构
iptables的表、链结构(4张表、5条链)
规则链解析-Chain
• 链的用途:存放一条条防火墙规则(Rule)
• 链的分类依据:处理数据包的不同时机
• 默认包括5种规则链
– INPUT:处理进入防火墙本机的数据包
– OUTPUT:处理从防火墙本机出去的数据包
– FORWARD:处理转发的数据包(即经过防火墙主机的IP包)
– POSTROUTING:路由选择之后处理
– PREROUTING:路由选择之前处理
规则表解析-Table
• 表的用途:存放不同的规则链
• 表的分类依据:防火墙规则的作用相似
• 包括4个规则表
– raw表:确定是否对数据包进行状态跟踪
– mangle表:为数据包设置标记
– nat表:修改数据包的源/目标地址或端口
– filter表:确定是否放行该数据包
防火墙的功能:对ip包做状态跟踪 raw表
给IP包打标签 mangle表
地址转换 nat表
包过滤 filter表
规则匹配过程
防火墙上的数据包流向
包过滤匹配流程
• 规则表之间的顺序
–raw --->mangle --->nat --->filter
• 规则链之间的顺序
– 入站: PREROUTING --->INPUT
– 出站: OUTPUT --->POSTROUTING
– 转发: PREROUTING --->FORWARD --->POSTROUTING
• 规则链内的匹配顺序
– 顺序比对,匹配即停止(LOG除外)
– 若无任何匹配,则按该链的默认策略处理
iptables基本管理
iptables基本用法
• 管理程序位置:/sbin/iptables
• 指令组成:iptables [-t 表名] 选项 [链名] [匹配条件] [-j 目标操作]
• 注意事项/整体规律
– 可以不指定表,默认为filter表
– 可以不指定链,默认为对应表的所有链
– 除非设置默认策略,否则必须指定匹配条件
– 选项/链名/目标操作用大写字母,其余都小写
常用的管理选项
类别 |
选项 |
用途 |
添加规则 |
-A |
在链的末尾追加一条规则 |
-I |
在链的开头(或指定序号)插入一条规则 |
|
查看规则
|
-L |
列出所有的规则条目 |
-n |
以数字形式显示地址、端口等信息 |
|
--line-numbers |
查看规则时,显示规则的序号 |
|
删除规则
|
-D |
删除链内指定序号(或内容)的一条规则 |
-F |
清空所有的规则 |
|
默认策略 |
-P |
为指定的链设置默认规则 |
基本的匹配条件
• 通用匹配:可直接使用,不依赖于其他条件或扩展
包括网络协议、IP地址、网络接口等条件
• 隐含匹配:要求以特定的协议匹配作为前提
包括端口、TCP标记、ICMP类型等条件
类别 |
选项 |
用法 |
通用匹配
|
协议匹配 |
-p 协议名 如:tcp、udp、icmp |
地址匹配 |
-s 源地址、-d 目标地址 |
|
接口匹配 |
-i 收数据的网卡 -o 发数据的网卡 |
|
隐含匹配
|
端口匹配 |
--sport 源端口 --dport 目标端口 |
ICMP类型匹配 |
--icmp-type ICMP类型 |
|
TCP标记匹配 |
--tcp-flags 检查哪些位 哪些位被设置 |
|
需要取反条件时,用叹号 ! |
基本的目标操作
• ACCEPT:允许通过/放行
• DROP:直接丢弃,不给出任何回应
• REJECT:拒绝通过,必要时会给出提示
• LOG:记录日志,然后传给下一条规则 //“匹配即停止”规律的唯一例外
[root@iptables50 ~]# cat /etc/sysconfig/iptables //查看现有的防火墙规则
规则管理示例
添加新的规则—— -A追加、-I插入
[root@iptables50 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
[root@iptables50 ~]# iptables -A INPUT -p tcp -dport 80 -j DROP
[root@iptables50 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@iptables50 ~]# iptables -I INPUT -p udp -j ACCEPT
[root@iptables50 ~]# iptables -I INPUT 2 -p icmp -j ACCEPT //添加新规则在序号为2的规则上面
查看规则列表—— -L查看
[root@iptables50 ~]# iptables -t 表名 -L //以字符显示
[root@iptables50 ~]# iptables -nL INPUT //以数字显示
[root@iptables50 ~]# iptables -L INPUT --line-numbers //带序号显示
删除、清空规则—— -D删除、-F清空
[root@iptables50 ~]# iptables -D INPUT 3 //删除序号为3 的规则
[root@iptables50 ~]# iptables -nL INPUT
//依次清空4个表的规则,需要保存才生效
[root@iptables50 ~]# iptables -F //不写表名时,默认为filter表
[root@iptables50 ~]# iptables -t nat -F
[root@iptables50 ~]# iptables -t mangle -F
[root@iptables50 ~]# iptables -t raw -F
filter表控制
防护类型及条件
主机/网络型防护
• 根据保护对象(本机、其他主机)区分
开启内核的IP转发
• 作为网关、路由的必要条件:sysctl -w net.ipv4.ip_forward=1
或者 echo 1 > /proc/sys/net/ipv4/ip_forward
示例:
[root@iptables50 ~]# yum -y install httpd
[root@iptables50 ~]# service httpd start
[root@iptables50 ~]# netstat -pantul |grep :80
[root@iptables50 ~]# echo aaa > /var/www/html/a.html //可以访问
[root@pc207 桌面]# elinks --dump http://192.168.4.50/a.thml
[root@iptables50 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
[root@iptables50 ~]# iptables -t filter -nL INPUT
[root@iptables50 ~]# service iptables save //保存防火墙规则
[root@pc207 桌面]# elinks --dump http://192.168.4.50/a.thml //不可访问
[root@iptables50 ~]# iptables -t filter -A INPUT -s 192.168.4.254 -p tcp --dport 22 -j ACCEPT //允许254访问本机
[root@iptables50 ~]# iptables -t filter -A INPUT -s 192.168.4.20 -p tcp --dport 22 -j REJECT //拒绝20访问本机
过滤规则示例
封禁IP地址/网段:主机防护,针对入站访问的源地址
网络防护,针对转发访问的源地址
[root@iptables50 ~]# iptables -A INPUT -s 192.168.4.120 -j DROP
[root@iptables50 ~]# iptables -A INPUT -s 10.0.10.0/24 -j DROP
[root@iptables50 ~]# iptables -A FORWARD -s 192.168.0.0/16 -i eth1 -j DROP
[root@iptables50 ~]# iptables -A FORWARD -s 172.16.0.0/16 -i eth1 -j DROP
保护特定网络服务:限制对指定服务端口的访问
[root@iptables50 ~]# iptables -A INPUT -s 192.168.168.0/24 -p tcp --dport 22 -j ACCEPT
[root@iptables50 ~]# iptables -A INPUT -s 220.181.78.0/24 -p tcp --dport 22 -j ACCEPT
[root@iptables50 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
[root@iptables50 ~]# iptables -A INPUT ! -s 192.168.168.0/24 -p tcp --dport 20:21 -j DROP //连续的端口范围以冒号分隔
禁ping相关策略处理:允许本机 ping 其他主机,但是,禁止其他主机 ping 本机
[root@iptables50 ~]# iptables -t filter -I INPUT 2 -p icmp --help //查看此命令要跟哪些选项 //echo-replay回应包
[root@iptables50 ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
[root@iptables50 ~]# iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT
[root@iptables50 ~]# iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
[root@iptables50 ~]# iptables -A OUTPUT -p icmp ! --icmp-type echo-request -j DROP
TCP标记细分控制:禁止入站的SYN请求包(第一次握手),检查4个标记位,其中SYN位被设置
放行入站访问的其他数据包
[root@iptables50 ~]# iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j DROP
[root@iptables50 ~]# iptables -A INPUT -i eth1 -p tcp ! --syn -j ACCEPT
设置默认规则:所有链的初始默认规则均为ACCEPT
通过 -P 选项可重置默认规则
生成环境中,一般将默认规则设为DROP,然后再放行需要的IP地址
[root@iptables50 ~]# iptables -t filter -P INPUT DROP
[root@iptables50 ~]# iptables -t filter -nL | head -1
//根据(policy XXX)可知INPUT链的默认策略为XXX
示例:
# iptables -t filter -P INPUT DROP
# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
# iptables -t filter -A INPUT -s 192.168.4.254 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A INPUT -s 192.168.4.20 -p tcp --dport 22 -j REJECT
扩展匹配
扩展条件的方法:前提条件:有对应的防火墙模块支持
基本用法:-m 扩展模块 --扩展条件 条件值
示例: -m mac --mac-source 00:0C:29:74:BE:21
常见的扩展条件类型
类别 |
选项 |
用法 |
扩展匹配
|
状态匹配 |
-m state --state 状态值 |
MAC地址匹配 |
-m mac --mac-source MAC地址 |
|
多端口匹配
|
-m multiport --sports 源端口列表 |
|
-m multiport --dports 目标端口列表 |
||
IP范围匹配
|
-m iprange --src-range IP1-IP2 |
|
-m iprange --dst-range IP1-IP2 |
状态匹配
状态跟踪机制
• 网络连接的五种状态:NEW,请求建立连接的包、完全陌生的包
ESTABLISHED,将要或已经建立连接的包
RELATED,与已知某个连接相关联的包
INVALID,无对应连接,以及连接无效的包
UNTRACKED,未跟踪状态的包
• 丢弃陌生的TCP响应包:比如,防止反射/反弹式攻击
[root@iptables50 ~]# iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
[root@iptables50 ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
• 识别FTP数据连接:针对FTP被动模式,数据端口未知
[root@gw1 ~]# iptables -A FORWARD -d 192.168.4.205 -p tcp --dport 20:21 -j ACCEPT
[root@gw1 ~]# iptables -A FORWARD -s 192.168.4.205 -p tcp --sport 20:21 -j ACCEPT
[root@gw1 ~]# iptables -A FORWARD -d 192.168.4.205 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@gw1 ~]# iptables -A FORWARD -s 192.168.4.205 -m state --state ESTABLISHED,RELATED -j ACCEPT
• 保护内部网络的通信:允许从内网访问外网的服务
禁止从外网访问内网
[root@gw1 ~]# iptables -A FORWARD -s 192.168.4.0/24 -o eth0 -j ACCEPT
[root@gw1 ~]# iptables -A FORWARD -d 192.168.4.0/24 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@gw1 ~]# iptables -A FORWARD -d 192.168.4.0/24 -i eth0 -m state --state NEW -j DROP
示例:
[root@iptables253 ~]# service iptables start
[root@iptables253 ~]# iptables -nL
[root@iptables253 ~]# iptables -F
[root@iptables253 ~]# service iptables save
[root@client22 ~]# service iptables stop
[root@web44 ~]# service iptables stop
[root@web55 ~]# service iptables stop
[root@web44 ~]# cat /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web44 ~]# cat /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web44 ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web44 ~]# cat /proc/sys/net/ipv4/conf/all/arp_announce
[root@web44 ~]# yum -y install httpd; service httpd start
[root@client22 ~]# ping 44、55不通
[root@web44 ~]# route add default gw 192.168.4.253
[root@web44 ~]# route -n
[root@web55 ~]# route add default gw 192.168.4.253
[root@web55 ~]# route -n
[root@client22 ~]# route add default gw 192.168.2.253
[root@client22 ~]# route -n
[root@iptables253 ~]# sysctl -p //没有开启转发功能
[root@iptables253 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@iptables253 ~]# sysctl -p
[root@iptables253 ~]# service network restart
[root@client22 ~]# service httpd start
[root@client22 ~]# echo web22 > /var/www/html/a.html
[root@web44 ~]# elinks --dump http://192.168.2.22/a.thml
[root@web44 ~]# echo web44 > /var/www/html/a.html
[root@client22 ~]# elinks --dump http://192.168.4.44/a.html
[root@iptables253 ~]# iptables -t filter -P FORWARD DROP
[root@iptables253 ~]# iptables -t filter -A FORWARD -p tcp --dport 80 -j ACCEPT
[root@iptables253 ~]# iptables -t filter -A FORWARD -p tcp --sport 80 -j ACCEPT
[root@iptables253 ~]# iptables -t filter -nL --line-numbers
[root@web44 ~]# elinks --dump http://192.168.2.22/a.thml
[root@client22 ~]# elinks --dump http://192.168.4.44/a.html
现在内外网互通
要实现4.55的禁止访问外网
[root@iptables253 ~]# iptables -t filter -I FORWARD -s 192.168.4.55 -p tcp --dport 80 -j REJECT
[root@web55 ~]# elinks --dump http://192.168.2.22/a.html
现在对4.0网段实现禁止访问外网,但外网能访问内网
[root@iptables253 ~]# iptables -t filter -D FORWARD 1
[root@iptables253 ~]# iptables -t filter -I FORWARD -s 192.168.4.0/24 -p tcp --dport 80 -j REJECT
[root@iptables253 ~]# iptables -t filter -nL --line-numbers
设置2.22上能远程4.4
[root@iptables253 ~]# iptables -t filter -A FORWARD -p tcp --dport 22 -j ACCEPT
[root@iptables253 ~]# iptables -t filter -A FORWARD -p tcp --sport 22 -j ACCEPT
其他扩展匹配
根据MAC地址封锁主机:适用于交换网络,针对源MAC地址——不管其IP地址变成多少
[root@iptables50 ~]# iptables -A INPUT -m mac --mac-source 00:0C:29:74:BE:21 -j DROP
简化服务开启规则:一条规则开放多个端口——比如 Web、FTP、Mail、SSH 等等
[root@iptables50 ~]# iptables -A INPUT -p tcp -m multiport --dports 20:22,25,80,110,143,16501:16800 -j ACCEPT
根据IP范围封锁主机:SSH登录的IP范围控制
– 允许从 192.168.4.10-192.168.4.20 登录
– 禁止从 192.168.4.0/24 网段其他的主机登录
[root@iptables50 ~]# iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT
[root@iptables50 ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
Filter表
做主机型防火墙的配置 INPUT
做网络型防火墙的配置 FORWARD
NAT转换原理
私有地址的局限性
• 从局域网访问互联网的时候,比如看网页、收邮件、......
– 源地址为私有地址,服务器如何正确给出回应?
• 从互联网访问局域网的时候,比如远程管理内网的网站、文件服务器
– 目标地址为私有地址,请求包如何才能正确抵达?
SNAT(Source Network Address Translation)源地址转换
– 修改数据包的源地址,仅用于 nat 表的 POSTROUTING 链
• 不修改源地址的情况
• 修改源地址的情况
DNAT(Destination Network Address Translation)目标地址转换
– 修改数据包目标地址(IP、端口),仅用于 nat 表的 PREROUTING、OUTPUT 链
• 修改目标地址的情况
SNAT策略应用
案例环境:局域网共享公网IP上网
• 前期准备:局域网PC机正确设置IP地址/子网掩码、默认网关
– Linux网关服务器开启IP路由转发
– 本实验中,不要为Web服务器设置默认网关
配置SNAT共享上网
• 配置的关键策略:选择路由之后,针对来自局域网、即将从外网接口发出去的包,将源IP地址修改为网关的公网IP地址
[root@gw1 ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth1 -j SNAT --to-source 174.16.16.1
局域网网段地址:192.168.4.0/24
外网接口:eth1
外网接口的IP地址:174.16.16.1
• 验证SNAT访问结果
– 客户机上:PC机 192.168.4.5 能够访问外网的Web服务器 174.16.16.120
– 服务器上:查看Web主机 174.16.16.120 的访问日志,来访者应是Linux网关的外网IP地址 174.16.16.1
[root@www ~]# tail /var/log/httpd/access_log
.. ..
174.16.16.1 - - [12/Aug/2013:17:57:10 +0800] "GET / HTTP/1.1" 200
27 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
地址伪装策略
• 共享动态公网IP地址实现上网
– 主要针对外网接口的IP地址不固定的情况
– 将SNAT改为MASQUERADE即可
– 对于ADSL宽带拨号连接,网络接口可写为 ppp+
[root@gw1 ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth1 -j SNAT --to-source 174.16.16.1 ==>-j MASQUERADE
DNAT策略应用
案例环境:发布位于内网的服务器
• 前期准备:内网Web主机能够访问Internet,比如SNAT
Linux网关服务器开启IP路由转发
将Web域名解析为网关的外网IP地址
发布Web服务器
• 配置的关键策略:在路由选择之前,针对从外网接口收到的、访问本机公网地址TCP 80端口的数据包,将其目标地址修改为位于内网的Web主机的IP地址
[root@gw1 ~]# iptables -t nat -A PREROUTING -i eth1 -d 174.16.16.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.4.5
外网接口的IP地址:174.16.16.1
内网Web主机的IP地址:192.168.4.5
• 验证DNAT访问结果
– 客户机上:通过访问 http://174.16.16.1/,能看到由主机192.168.4.5 提供的网页
– 服务器上:查看Web主机 192.168.4.5 的访问日志,记录了测试PC机的IP地址
[root@www ~]# tail /var/log/httpd/access_log
.. ..
174.16.16.120 - - [13/Aug/2013:11:55:57 +0800] "GET / HTTP/1.1"
200 24 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
发布SSH服务器
• 执行 ssh -p 2345 174.16.16.1 时
– 实际SSH登录 192.168.4.5
[root@gw1 ~]# iptables -t nat -A PREROUTING -i eth1 -d 174.16.16.1 -p tcp --dport 2345 -j DNAT --to-destination 192.168.4.5:22
发布FTP服务器
• 注意事项:加载模块 nf_nat_ftp 、nf_conntrack_ftp
[root@gw1 ~]# modprobe -a nf_nat_ftp nf_conntrack_ftp
.. ..
[root@gw1 ~]# iptables -t nat -A PREROUTING -i eth1 -d 174.16.16.1 -p tcp --dport 20:21 -j DNAT --to-destination 192.168.4.5
NAT表可实现源地址转换、目标地址转换、端口转换
共享上网POSTROUTING 源地址转换
[root@iptables253 ~]# iptables -t filter -P FORWARD ACCEPT
[root@client22 ~]# route del default gw 192.168.2.253
[root@iptables253 ~]# iptables -t nat -A POSTROUTING -o eth1 -s 192.168.4.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.2.253 //4.44可以访问2.22,反之不行 o:出口 s:源地址
[root@iptables253 ~]# service iptables save
[root@client22 ~]# tail -1 /etc/httpd/logs/access_log
192.168.2.253 - - [11/Nov/2017:08:18:51 +0800] "GET /a.html HTTP/1.1" 200 6 "-" "ELinks/0.12pre5 (textmode; Linux; -)"
发布私网的服务器 PREROUTING 源地址转换
[root@web44 ~]# service iptables stop
[root@iptables253 ~]# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.4.44:80
[root@iptables253 ~]# iptables -t nat -nL
[root@client22 ~]# elinks --dump http://192.168.2.253/test2.html
[root@web44 ~]# tail -1 /etc/httpd/logs/access_log
192.168.2.22 - - [11/Nov/2017:09:14:30 +0800] "GET /test2.html HTTP/1.1" 200 4 "-" "ELinks/0.12pre5 (textmode; Linux; -)" //将2.22的访问轮换成4.44内容
[root@iptables253 ~]# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 12345 -j DNAT --to-destination 192.168.4.55:22 //将目标地址的远程端口22转换成123456
[root@room1pc27 桌面]# ssh -X -p 12345 [email protected] //密码是web55的,253只是做转换
[root@web55 ~]#
防火墙脚本
批量规则整理
规则整理的必要性
• 面临的问题:写了这么多规则,一重启就没了?
封锁数百个恶意IP地址,怎么写规则啊?
部署一台新防火墙时,能沿用之前的规则吗?导出/导入规则
• 使用 iptables-save 导出
[root@gw1 ~]# iptables-save
[root@gw1 ~]# iptables-save > /root/myfw.rule
• 使用 iptables-restore 导入
[root@gw1 ~]# service iptables stop
[root@gw1 ~]# iptables-restore < /root/myfw.rule
[root@gw1 ~]# service iptables status
使用iptables服务:开机后自动加载已保存的规则:/etc/sysconfig/iptables
[root@gw1 ~]# iptables-save > /etc/sysconfig/iptables
[root@gw1 ~]# service iptables stop
[root@gw1 ~]# service iptables start
[root@gw1 ~]# chkconfig iptables on
批量设置防火墙规则
• 方法1:编写规则 à 导出规则 à iptables服务
• 方法2:编写脚本文件 à 开机时调用 /etc/rc.local
使用防火墙脚本
防火墙规则的脚本化
• 定义基本变量
• 必要时,内核模块和运行参数调整
• 防火墙策略设计:各链的默认规则
按表、链组织的具体规则
运行环境处理:
• 变量及模块整理:方便脚本的维护/重用/移植
必要的功能模块预备
#!/bin/bash
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"
/sbin/modprobe -a nf_nat_ftp nf_conntrack_ftp
“主机型”防火墙脚本——以 filter 表的 INPUT 链为主:OUTPUT 链次之
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
.. ..
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
“网络型”防火墙脚本——以 filter 表的 FORWRD 链为主:网关上会用到 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 --to-destination $LAN_WWW_IP
.. ..
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state \
--state ESTABLISHED,RELATED -j ACCEPT
.. ..
总结和答疑
表链结构及流程
默认的表、链构成
• 四个表:raw、mangle、nat、filter
• 五种规则链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING数据流向及匹配
• 规则链之间的顺序
– 入站: PREROUTING --->INPUT
– 出站: OUTPUT ---> POSTROUTING
– 转发: PREROUTING --->FORWARD --->POSTROUTING
DNAT发布策略
问题现象
• DNAT发布了FTP服务,但是功能不完整
– 通过访问网关的21端口能登录到内网的FTP服务器
– 却不能执行ls及下载操作,报错:
.. .. connect: 网络不可达
[root@svr5 ~]# ftp 174.16.16.1
.. ..
ftp> ls //获取目录列表失败
227 Entering Passive Mode (192,168,4,5,204,144).
ftp: connect: 网络不可达
.. ..
故障分析及排除
• 原因分析
– 完整的FTP通信是复合连接,需要将数据连接与控制连接关联起来
– 当通过防火墙的NAT策略时,需要模块 nf_nat_ftp 、nf_conntrack_ftp 的支持
• 解决办法
[root@gw1 ~]# modprobe -a nf_nat_ftp nf_conntrack_ftp
.. ..
防火墙规则整理
问题现象
• 执行 iptables -F 无法彻底清空规则
– 测试发现,所有的入站访问都不可用了
– 而且还能查到有SNAT相关规则
故障分析及排除
• 原因分析
– 若不指定表,iptables -F 默认只清空 filter表
– 而且,各链的默认规则(可能已设为DROP)不会处理
• 解决办法
– 改用 service iptables stop 停止防火墙
– 或者,分别清空 filter、nat、raw等多张表,并且将每条链的默认规则设置为 ACCEPT