
服务器安全防护之iptables
服务器安全防护之iptables
一、服务器安全防护概述
无论是大型企业还是小型企业,服务器对于它们的作用都是不言而喻的,因为服务器是保障企业业务正常运行必不可少的设备之一,所以我们必须做好服务器安全防护。那么服务器安全防护措施有什么?
如果是自己的机房存放的服务器,我们要做好物理防护。
1.1 服务器物理防护有几点
1、保持机房干燥,避免有水源漏水致使服务器受到损害风险。
2、机房布线合理,避免有起火风险。
3、机房设置消防报警装置,一旦温湿度达到临界值就报警。
4、设置监控和进入系统,防止无关人员进入机房以及可以观察机房服务器运行情况。
1.2 服务器系统防护有以下几点
1、定期备份服务器内容到可靠的云端。
2、安装服务器软件或者安装企业级服务器安全防护。
3、安装云防火墙服务和web应用防火墙,禁止不需要的端口服务和以及对攻击的流量过滤。
4、安装SSL证书,SSL可以安装免费的,但是付费的更加安全可以根据用户自身业务进行选择。
5、高防IP,如果有被DDoS攻击的话,建议需要换高防IP,但是相对成本会提升,没有的话,隐蔽真实IP,禁ping即可。
6、设置好文件权限,安装网页防篡改服务,保证线上业务不被非法篡改而不自知。
7、服务器监测服务,做好服务器检测一旦发生入侵或者攻击事件可以直接进行告警。
8、进行等保测评,一般做好等保工作,也代表着我们的服务器安全达到了一定的防护级别
1.3 常见的攻击的手段:
1)、拒绝服务攻击:DOS攻击,解决办法,DDOS防护进行流量清洗
2)、已知漏洞:通过已经知道的漏洞,进行攻击--永恒之蓝
3)、口令破解:暴力破解 fail2ban,社会工程学
4)、欺骗用户:情感欺骗,电信诈骗
1.4 常见的防御设备
1)基础类防火墙:iptables
2)IDS类型:入侵检测系统
3)IPS类型:入侵防御系统
4)主动安全类:WAF(web application firewalld)
二、防火墙
2.1 什么是防火墙?
简单来说:防火墙就是工作在主机的边缘处或者是网络边缘处,对经过的流量进行检测,并且能够根据定义好的规则,对数据报文进行检测的设备
2.2 防火墙的分类
2.2.1 通过构造分类
硬件:深信服,网御,华为,H3C
软件:windows防火墙,iptables,firewalld,nftables, ufw
2.2.2 工作机制
包过滤防火墙:SIP,DIP,SPORT,DPORT
应用层防火墙:URL,HOSTNAME
2.2.3模块方式(iptables)
应用态:iptables
内核态: netfilter
2.2.4 云防火墙(公有云)
安全组(4层)
web应用防火墙(7层)
2.3、不同centos版本的内核态和应用态
三、iptables
3.1、什么是iptables?
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
- iptables -IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成
- 主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口等信息的处理上
netfilter/iptables关系
- netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。
- 表中所有规则配置后,立即生效,不需要重启服务
3.2、四表五链
3.2.1 iptables之四表
1)filter:负责过滤数据包,包括的规则链有,input,output和forward;
2)nat:则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
3)mangle:表则主要应用在修改数据包内容上,用来做流量整形的,给数据包打个标识,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
4)raw:确认是否对该数据包进行跟踪
3.2.2 iptables之五链
1)INPUT:匹配目标IP是本机的数据包
2)OUTPUT :出口数据包 , 一般不在此链上做配置
3)FORWARD:匹配流经本机的数据包
4)PREROUTING:用来修改目的地址,用来做DNAT 。如:把内网中的80端口映射到路由器外网端口上
5)POSTROUTING:用来修改源地址用来做SNAT。 如:内网通过路由器NAT转换功能实现内网PC机通过一个公网IP地址上网
规则链
input 链:当收到访问防火墙本机地址的数据包时,将应用此链中的规则;
output 链:当防火墙本机向外发送数据包时,将应用此链中的规则;
forward 链:当收到需要通过防火中转发给其他地址的数据包时,将应用此链中的规则;
prerouting 链:在对数据包做路由选择之前,将应用此链中的规则;
postrouting 链:在对数据包做路由选择之后,将应用此链中的规则;
input 链 和 output 链主要用在主机型防火墙,是针对服务器
表链总结:
规则表的作用:容纳各种规则链
规则链的作用:容纳各种防火墙规则
总结:表里有链,链里有规则
3.2.3 防火墙的顺序
1)Iptables过滤封包流程
总结:
整体数据包分两类:
1、发给防火墙本身的数据包
2、需要经过防火墙的软件包
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。
本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
2)数据包的匹配顺序
3)工作流小结
总结: 整体数据包分两类: 1、发给防火墙本身的数据包 ;2、需要经过防火墙的数据包
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的,如果匹配到了规则(拒绝或者允许)则停止匹配,如果没有匹配到任何的规则,则匹配默认的规则
四、iptables的使用
4.1 安装和启动iptables-services服务
[root@localhost ~]# yum -y install iptables-services
[root@localhost ~]# systemctl start iptables
[root@localhost ~]# systemctl status iptables
[root@localhost ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init
##加载模块
[root@localhost ~]# modprobe ip_tables
[root@localhost ~]# modprobe iptable_filter
[root@localhost ~]# modprobe iptable_nat
[root@localhost ~]# modprobe ip_conntrack
[root@localhost ~]# modprobe ip_conntrack_ftp
[root@localhost ~]# modprobe ip_nat_ftp
[root@localhost ~]# modprobe ipt_state
##查看加载的模块
[root@localhost ~]# lsmod |grep 'ip'
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4
ipt_REJECT 12541 0
nf_reject_ipv4 13373 1 ipt_REJECT
nf_conntrack_ipv4 19149 1
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 143360 7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter 12810 1
ip_tables 27126 2 iptable_filter,iptable_nat
4.2、命令语法
iptables [-t 表名] 选项 [链名] [条件匹配] [-j 控制类型]
注意:
1.不指定表名时,默认是指filter表
2.不指定链名时,默认是指的表内的所有链
3.除非设置链的默认策略,否则必须指定匹配条件
4.选项,链名,控制类型必须使用大写,其他均为小写的。
常见选项
-A 追加一条规则(放到最后)
-I 插入一条规则,默认是在开头,可以指定位置
-R 替换或者修改规则
-D 删除规则
-F 清空规则(清空之前一定要查看默认规则)
-P 设置默认规则
-Z 清空数据包
-L 列出规则
控制类型
ACCEPT:允许通过
DROP:直接丢失,不给出任何回应
REJECT:拒绝通过,必要时给出回应
LOG:记录日志信息,然后传给下一条记录继续匹配
SNAT:修改数据包源地址
DNAT:修改数据包的目的地址
REDIRECT:重定向
4.3、iptables语法示例
4.3.1 -L 列出规则
iptables -nvL 查看数据包
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
n:显示IP地址和端口号码,不显示域名和服务名称
--line-number
语法:
iptables -L
iptables -nvL
iptables -nvL --line-number 指定行号
示例:
当iptables启动后,默认会在iptables中生成一些规则,这些规则保存在/etc/sysconfig/iptables下。
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
4.3.2 -A 追加一条规则(放到最后)
iptables -t filter -A INPUT -j ACCEPT #允许所有人访问服务器,谨慎使用
iptables -t filter -A INPUT -j DROP #拒绝所有人访问服务器,谨慎使用
iptables -t filter -A INPUT -j REJECT #拒绝所有人访问服务器,谨慎使用
在filter表的INPUT链中追加一条规则(作为最后一条规则),匹配所有访问本机IP数据包,匹配到的丢弃
4.3.3 -I 插入一条规则,默认是在开头,可以指定位置
iptables -I INPUT -j ACCEPT
在filter表的INPUT中插入一条规则(插入成第一条)
iptables -I INPUT 4 -j ACCEPT
在filter表的iINPUT中插入一条规则(指定在第四条位置插入)
3.2.4 -R 替换或者修改规则
修改filter表中INPUT链的第四条规则
iptables -t filter -R INPUT 4 .......
3.2.5 -D删除规则
iptables -D INPUT 1
按照内容匹配
iptables -D INPUT -s 192.168.0.1 -j DROP
3.2.6 -F 清空规则
iptables -F INPUT 清空filter表INPUT链上的规则
iptables -F 清空filter表上的所有链规则
iptables -t nat -F 清空nat表上的所有规则链
注意:-F仅仅是清空链中的规则,并不影响设置的默认规则.如果之前设置的默认规则是DROP,然后你清空规则,那么这台机器就会失联了
3.2.7 -P 设置默认规则
iptables -P INPUT DROP 设置默认规则为DROP,注意不要随便添加。
iptables -P INPUT ACCEPT 设置默认规则为ACCRPT
3.2.8 -Z 清空数据包
iptables -Z INPUT
语法总结
4.4 匹配类型
4.4.1 通用匹配
可直接使用,不依赖于其他的条件或者扩展
包含网络协议、IP地址、网络接口等条件
常见的通用匹配条件
1)协议匹配:-p 协议名
2)地址匹配:-s 源地址、-d 目标地址
3)接口匹配:-i 入站网卡、-o 出站网卡
示例:
[root@localhost ~]# iptables -A FORWARD -s 10.10.1.1 -j REJECT
[root@localhost ~]# iptables -I INPUT -p icmp -j DROP
[root@localhost ~]# iptables -A INPUT -s 10.10.36.0/24 -j DROP
[root@localhost ~]# iptables -I INPUT -s 10.10.36.100 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -i ens33 -s 192.168.1.0/24 -j DROP
[root@localhost ~]# iptables -I INPUT -i ens33 -p icmp --icmp-type echo-request -j DROP
[root@localhost ~]# iptables -I INPUT -i ens33 -s 192.168.1.102 -p icmp --icmp-type echo-request -j DROP
[root@localhost ~]# iptables -I INPUT -i ens33 ! -s 192.168.1.101 -p icmp --icmp-type echo-request -j DROP
[root@localhost ~]# iptables -I OUTPUT -o ens33 -d 192.168.1.101 -p icmp --icmp-type echo-request -j DROP
[root@localhost ~]# iptables -I INPUT -p icmp -s 192.168.1.0/24 --icmp-type echo-request -j DROP
4.4.2 隐式匹配
要求加-p以协议匹配作为条件
包含端口、TCP标记、ICMP类型等条件
常见的匹配条件
端口匹配:
--sport 源端口
--dport 目标端口
ICMP类型匹配:
--icmp-type ICMP类型
(1)TCP标记匹配:- -tcp-flags TCP标记
三次握手的数据包发送设置如下:
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j ACCEPT
iptables -I OUTPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j ACCEPT
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j ACCEPT
tcp三次握手时的第一次握手放行 SYN 为 1 数据报文,拒绝其他包;第二次握手放行 SYN,ACK 为 1 数据报文,拒绝其他包。
(2)ICMP类型匹配:- -icmp-type ICMP类型
#可以是字符串、数字代码、、目标不可达
“Echo-Request”(代码为 8)表示 请求
“Echo-Reply”(代码为 0)表示 回显
“Destination-Unreachable”(代码为 3)表示 目标不可达
关于其它可用的 ICMP 协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
iptables -A INPUT -p icmp -j DROP # 入站和出站均ping不通
iptables -t filter -I INPUT -p icmp -j REJECT # 禁止所有的icmp报文进入本机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止其它主机ping 本机
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #允许本机 ping 其它主机
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #当本机 ping 不通其它主机时提示目标不可达
iptables -I INPUT -i ens33 -s 192.168.1.102 -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -i ens33 ! -s 192.168.1.101 -p icmp --icmp-type echo-request -j DROP
iptables -I OUTPUT -o ens33 -d 192.168.1.101 -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp -s 192.168.1.0/24 --icmp-type echo-request -j DROP
禁止Ping的另一种方式:
1、允许ping设置
临时
echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
永久
echo net.ipv4.icmp_echo_ignore_all=0 >> /etc/sysctl.conf
sysctl -p # 执行这条命令使更改后的 /etc/sysctl.conf 配置文件生效
2、禁止ping设置
临时
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
永久
echo net.ipv4.icmp_echo_ignore_all=1 >> /etc/sysctl.conf
sysctl -p # 执行这条命令使更改后的 /etc/sysctl.conf 配置文件生效
4.4.3 显示匹配
要求以“-m” 扩展模块的形式明确指出类型
包含多端口、MAC地址、IP范围、数据包状态等条件
常用的显示匹配条件
多端口匹配:-m multiport --sport 源端口列表
多端口匹配:-m multiport --dport 目标端口列表
IP地址范围: -m iprange --src-range ip地址范围
MAC地址匹配:-m mac -mac-source MAC地址
状态匹配:-m state --state 连接状态
示例:
1)多端口匹配:
-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表
例:
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
MAC地址匹配
2)MAC地址匹配: -m mac --mac-source MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发
3)IP范围匹配
IP范围匹配:-m iprange --src-range IP范围
#禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
4)状态匹配
状态匹配:-m state --state 连接状态
常见的连接状态:
NEW 与任何连接无关的,还没开始连接
ESTABLISHED 响应请求或者已建立连接的,连接态
RELATED 与已有连接有相关性的(如FTP 主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用
INVALID 不能被识别属于哪个连接或没有任何状态
#禁止转发与正常TCP连接无关的非--syn请求数据包( 如伪造的网络攻击数据包)
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
iptables -I INPUT -P tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
STATE(状态) | EXPLANATION(注释) |
---|---|
NEW | NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。 |
ESTABLISHED | ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答 |
RELATED | RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 |
INVALID | INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。 |
这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打 开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。
4.5 匹配指定字符串( string )
指定要匹配的字符串
--string pattern
匹配查询算法(必选)
--algo {bm | kmp}
示例:要求访问数据包中包含HelloWorld的数据不允许通过
[root@localhost ~]#iptables -t filter -I INPUT 1 -p tcp -m string --string "HelloWorld" --algo kmp -j DROP
4.6 根据时间段匹配报文( time )
开始时间
--timestart hh:mm[ : ss]
结束时间
--timestop hh:mm[ : ss]
指定一个月的某一天
--monthdays day[ , day...]
指定周 还是 周天
--weekdays day[ , day...]
示例:要求每天的12到13之间,不允许访问
[root@localhost ~]# iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP
# 注意:我们处在东八区,而该模块默认使用了东 0 区,我们早了 8 小时,减去 8,必须使用UTC时间
4.7 限制链接数,并发链接数(connlimit)(链接虚拟机的窗口的数量)
如果现有连接数小于或等于 n 则 匹配
--connlimit-upto n
如果现有连接数大于n 则匹配
--connlimit-above n
示例:要求主机连接最多有2个
[root@localhost ~]#iptables -I INPUT 1 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
4.8 针对报文速率进行限制。秒、分钟、小时、天。( limit )
connlimit模块是对连接数量进行限制的,limit模块是对”报文到达速率”进行限制的,用大白话说就是,如果我想要限制单位时间内流入的包的数量,就能用limit模块。我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。比如,限制每秒中最多流入3个包,或者限制每分钟最多流入30个包,都可以。
报文数量--limit rate[/second | /minute | /hour | /day]
报文数量(默认:5)
--limit-burst number
示例:要求限制每分钟最多流入10个数据包,也就是每6秒一个。
[root@localhost ~]# iptables -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT ##先放行22号端口
[root@localhost ~]# iptables -P INPUT DROP
limit-burst选项是干什么用的呢?”–limit-burst”可以指定”空闲时可放行的包的数量”,在不使用”–limit-burst”选项明确指定放行包的数量时,默认值为5,所以,才会出现上图中的情况,前5个ping包并没有受到任何速率限制,之后的包才受到了规则的限制。
4.9 防火墙策略保存
[root@localhost ~]# iptables-save >/etc/sysconfig/iptables ##保存规则
[root@localhost ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Mon Dec 12 16:45:58 2022
*nat
:PREROUTING ACCEPT [149:13150]
:INPUT ACCEPT [38:4354]
:OUTPUT ACCEPT [47:3892]
:POSTROUTING ACCEPT [43:3556]
COMMIT
# Completed on Mon Dec 12 16:45:58 2022
# Generated by iptables-save v1.4.21 on Mon Dec 12 16:45:58 2022
*filter
:INPUT ACCEPT [120:9656]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [76:8576]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
COMMIT
# Completed on Mon Dec 12 16:45:58 2022
4.10 防火墙策略恢复
[root@localhost ~]# iptables-restore </etc/sysconfig/iptables
注意:systemctl restart iptables也是调用了/etc/sysconfig/iptables里的规则
五、实战案例
5.1、SNAT:源IP地址转换
应用场景:公司内部网络通过同一个IP地址访问互联网
未开启SNAT的场景
开启了SNAT的场景
实验部署
1、IP地址的规划
IP地址 | 主机名 | 角色 |
---|---|---|
10.10.10.11(仅主机) | node01 | private |
10.10.10.10(仅仅主机),192.168.1.100 | node02 | private+public |
2、部署过程
Node01网络设置
(注意:添加DNS--223.5.5.5)
Node02网络设置
确保node02可以正常上网
2、node02开启路由转发
3、添加SNAT策略
[root@node02 ~]# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source 192.168.1.100
4、查看策略
[root@node02 ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 14 packets, 1277 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 2 packets, 316 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 6 packets, 402 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 17 packets, 1131 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * ens37 10.10.10.0/24 0.0.0.0/0 to:192.168.1.100
5、node01测试
如果我们的公网地址不固定,我们可以使用MASQUERADE(地址伪装)
[root@node02 ~]# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j MASQUERADE
[root@node02 ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.10.1.0/24 anywhere
[root@node02 ~]#
客户端测试,是否能上网
5.2、DNAT:目标地址转换
IP地址 | 角色 |
---|---|
10.10.10.11 | 内部web服务器 |
10.10.10.10,192.168.1.100 | NAT转发机器 |
192.168.1.102 | 互联网客户端 |
实验步骤:
1、内部服务器需要配置http服务
2、注意将web服务器的网关指向NAT网关的入网的接口
3、配置NAT网关机器,开启路由转发
[root@nat ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@nat ~]#
4、NAT机器配置策略
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.11
[root@nat ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere nat tcp dpt:http to:10.10.10.11
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
5、保存策略
[root@node02 ~]# iptables-save >/etc/sysconfig/iptables
6、客户端测试访问
[root@client ~]# curl 192.168.1.100
web01
可以看到是正常的访问的!
5.3 、DNAT扩展
思考:既然可以实现DNAT的功能,那是否可以实现负载均衡的功能呢,我们尝试在NAT机器上添加一条策略:
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.12
[root@nat ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere nat tcp dpt:http to:10.10.10.11
DNAT tcp -- anywhere nat tcp dpt:http to:10.10.10.12
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@nat ~]#
那这样我们就有2条策略,分别是到10.10.10.11和10.10.10.12的,接下来我们测试一下是否可以利用iptables实现负载均衡功能
[root@client ~]# curl 192.168.1.100
helloworld
[root@client ~]# curl 192.168.1.100
helloworld
[root@client ~]# curl 192.168.1.100
helloworld
[root@client ~]# curl 192.168.1.100
helloworld
可以看到并未实现负载均衡,而是将请求都转发到了10.10.10.11这台机器,这里我们需要使用到一个参数statistic扩展,它可以实现负载均衡的效果。
关于statistic的语法释义如下
官方文档:https://ipset.netfilter.org/iptables-extensions.man.html
statistic
This module matches packets based on some statistic condition. It supports two distinct modes settable with the --mode option.
Supported options:
该模块根据一些统计条件匹配报文。 它支持两个不同的模式,可通过--mode选项设置。
--mode mode
Set the matching mode of the matching rule, supported modes are random and nth.
设置匹配规则的匹配模式,支持的匹配模式为random和nth。
[!] --probability p
Set the probability for a packet to be randomly matched. It only works with the random mode. p must be within 0.0 and 1.0. The supported granularity is in 1/2147483648th increments.
设置报文被随机匹配的概率。 它只适用于随机模式。 P必须在0.0和1.0之间。 支持的粒度增量为1/2147483648。
[!] --every n
Match one packet every nth packet. It works only with the nth mode (see also the --packet option).
每n个包匹配一个包。 它只适用于nth个模式(同时请参阅--packet选项)。
--packet p
Set the initial counter value (0 <= p <= n-1, default 0) for the nth mode.
设置初始计数器。计数器=p的时候,命中规则。0 <= p <= n-1,p=n-1之后,下一次会被重置为0。如果不设置则默认是0。只适用于nth模式
修改DNAT规则如下:
5.3.1 负载均衡模式配置:
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 10.10.10.11
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -m statistic --mode nth --every 1 --packet 0 -j DNAT --to-destination 10.10.10.12
轮询算法中有两个参数:
--every n: 指每n个包执行该规则
--packet p: 指从第p个包开始
原理解释:
第一个规则每2个包轮到第一个规则,第二个规则就是要每1个包轮到他一次,
客户端测试:
[root@client ~]# curl 192.168.1.100
web01
[root@client ~]# curl 192.168.1.100
web2
[root@client ~]# curl 192.168.1.100
web01
5.3.2 随机模式配置
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 10.10.10.11
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 10.10.10.12
客户端测试:
经过测试,发现总是有一部分的请求会出现连接拒绝的情况,这是什么情况呢?原来这问题出现在我们设置的策略上
第一条策略设置的命中的概率是0.5也就是50%,剩下的概率理论上应该是50%,但是第二条策略设置的0.5,这里是指的相对的概率,也就是剩下50%的0.5,也就25%的概念,所以实际上还有25%的概率没有被任何的服务器处理,所以出现了访问错误的情况,所以我们要再加一条策略,如下:
[root@nat ~]# iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 10.10.10.13
[root@nat ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere nat tcp dpt:http statistic mode random probability 0.50000000000 to:10.10.10.11
DNAT tcp -- anywhere nat tcp dpt:http statistic mode random probability 0.50000000000 to:10.10.10.12
DNAT all -- anywhere nat to:10.10.10.13
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
当前面的2台服务器都没有被命中的时候,就命中最后一台服务器。
最后测试结果:
可以看到这三台服务器的数据包的个数比较趋近2:1:1,如果我请求的次数更多,那这个比利会更加接近。
- 感谢你赐予我前进的力量