赞
踩
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
和netfilter的适配性好
#查看有没有安装
iptables --version
5种规则链
4个规则表
规则表之间的顺序
规则链之间的顺序
规则链内的匹配顺序
内核中数据包的传输过程
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
#前期准备工作
systemctl stop firewalld.service
systemctl disable --now firewalld.service
##开机不自启 并且立即关闭
systemctl enable --now firewalld.service
##开机自启 并且 立即开启
#安装iptables
yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
iptables -t filter -A INPUT -s 192.168.210.1 -j DROP
命令 指定表 指定链 -s -j DROP已读不回
选项 | 用法 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给出任何回 应信息 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息 |
#拒绝来自 192.168.210.102的源地址 直接丢弃
iptables -t filter -A INPUT -s 192.168.210.102 -j DROP
#拒绝来自 192.168.210.101 的源地址,不回复,210段都无法访问了
iptables -A INPUT -s 192.168.210.0/24 -j REJECT
管理选项 | 用法示例 |
---|---|
-A | 在指定链末尾追加一条 |
-I(大写的i) | 在指定链中插入一条新的,未指定序号默认作为第一条 |
-P | 指定默认规则 |
-D | 删除 |
-R | 修改、替换某一条规则 |
-L | 查看 |
-n | 所有字段以数字形式显示 |
-v | 查看时显示更详细信息,常跟-L一起使用 |
–line-number | 规则带编号 |
-F | 清除链中所有规则 |
-N | 新加自定义链 |
-X | 清空自定义链的规则,不影响其他链 |
-Z | 清空链的计数器(匹配到的数据包的大小和总和) |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
在iptables的默认filter表中的INPUT链中添加一条规则,拒绝来自192.168.210.102中的全部流量
iptables -A INPUT -s 192.168.210.102 -j REJECT
-I 需要指明序号 - INPUT 1 在 INPUT 链的规则第一条前添加我就变成第一条了
iptables -I INPUT 2 -s 192.168.210.0/24 -j ACCEPT
指定匹配条件的选项 | 功能 |
---|---|
-p | 指定要匹配的协议类型,例如TCP、UDP、ICMP等 |
-s | 指定源IP地址或地址范围 |
-d | 指定目标IP地址或地址范围 |
-i <网络接口> | 指定输入网络接口 |
-o<网络接口> | 指定输出网络接口 |
-m | 指定扩展模块,用于进一步定义匹配条件 |
–icmp-type | 指定ICMP类型 |
–sport | 指定源端口号或端口范围 |
–dport | 指定目标端口号或端口范围 |
#无论查看、添加、删除,只有filter表可以省略
#查看
iptables [-t filter] -vnL #查看详细规则列表,不写规则表 默认filter表
-v 显示详细
-n 数字形式显示
-L 查看规则列表
#添加规则
iptables [-t filter] -A INPUT -s 192.168.210.102 -j DROP/REJECT/ACCEPT
#drop 和 reject的区别? drop丢弃后不会返回任何信息,相当于已读不回;reject会有提示信息
#一般只对INPUT和PREROUTING规则链进行处理,不处理OUTPUT POSTROUTING FORWARD
# -s 为指定源地址
# -j 为跳转 后面DROP/REJEC/ACCEPT为处理动作
iptables -vnL --line-numbers
#查看规则编号
iptables -D INPUT 2
#删除第二条规则
iptables -F
#不包括默认
iptables -P INPUT DROP
#修改INPUT链的默默人规则为拒绝 清空规则后又无法登录了
#手动白名单 最后加上拒绝所有
iptables -A INPUT -s 192.168.210.2 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT
iptables -A INPUT -s 192.168.210.102 -j DROP
#拒绝这个源地址访问
iptables -R INPUT 1 -s 192.168.210.102 -j ACCEPT
#修改成允许访问
白名单:在名单才可以,默认拒绝所有
黑名单:在名单里面的才不可以,默认允许所有
规则列表默认是黑名单ACCEPT允许,改成白名单
#修改默认规则为 白名单后自己也无法访问 iptables -P INPUT DROP 访问127.0.0.1 也不行 ping 127.0.0.1 ping 192.168.210.101 #快照后在虚拟机操作 iptables -P INPUT ACCEPT iptables -vnL iptables -A INPUT -s 0.0.0.0/0 -j REJECT iptables -vnL #看似黑名单,实则白名单,在最后一条加了默认拒绝所有,实现了白名单功能,还能使用iptables -F, iptables -I INPUT 1 -s 192.168.210.101 -j ACCEPT #把自己加进去,加在第一行前,允许自己访问,现在清空所有并不会造成我自己无法登录 #在xshell里操作 iptables -A INPUT -s 192.168.210.101 -j REJECT #把自己加进去 iptables -A INPUT -s 0.0.0.0/0 -j DROP #再默认拒绝所有
iptables -vnL
#查看规则列表
iptables -I INPUT 2 -i lo -j ACCEPT
#添加回环网卡,添加在第2条规则前
ping 127.0.0.1
#其他本机上的网址也都能ping通
基本匹配条件:无需加载模块,由iptables/netfilter自行提供
通用匹配选项
选项 | 用法 |
---|---|
-p | 指定要匹配的协议类型,例如TCP、UDP、ICMP等,参看: /etc/protocols |
-s | 指定源IP地址或地址范围 |
-d | 指定目标IP地址或地址范围 |
-i | 指定输入网络接口,入站网卡,只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链 |
-o | 指定输出网络接口,出站网卡 ,只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链 |
除了icmp协议,其他都允许
iptables -A FORWARD ! -p icmp -j ACCEPT
感叹号!表示取反
只让特定的机器不可以ping我
iptables -I INPUT 2 -s 192.168.210.102 -p icmp -j REJECT
扩展模块的查看帮助
man iptables-extensions
tcp协议的扩展选项
选项 | 用法 |
---|---|
–sport | 源端口 |
–dport | 目的端口 |
–icmp-type | 指定ICMP类型 |
--sport和--dport 必须配合-p <协议类型>使用
只能用于匹配连续的端口
可以匹配单个端口,也可以匹配端口范围,以源端口匹配为例:
格式 | 含义 |
---|---|
–sport 1000 | 匹配源端口是1000的数据包 |
–sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
–sport 1000: | 匹配源端口是1000及以上的数据包 |
–sport :3000 | 匹配源端口是3000及以下的数据包 |
先安装一个httpd,然后开启httpd
控制102服务器访问101服务器的tcp的80端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.210.102 -j REJECT
然后用102服务器curl 192.168.210.101
如果端口连续 端口:端口
iptables -A INPUT -p tcp --dport 80:1000 -s 192.168.210.102 --j REJECT
--tcp-flags TCP标志
TCP标志 | 功能 |
---|---|
SYN(同步) | 用于建立连接。 |
ACK(确认) | 用于确认收到的数据。 |
FIN(结束) | 用于关闭连接。 |
RST(复位) | 用于重置连接。 |
URG(紧急) | 用于指示数据中有紧急数据部分。 |
PSH(推送) | 用于强制接收方立即处理数据。 |
#iptables允许通过来自ens33接口的,具有FIN、RST、ACK和SYN标志的TCP包
#只有SYN标志的TCP包,拒绝建立连接
iptables -I INPUT -i ens33 -p tcp \--tcp-flags FIN,RST,ACK SYN -j ACCEPT
类型匹配:--icmp-type ICMP类型
type/code
echo-reply icmp应答
echo-request icmp请求
--icmp -type 0/3/8
#可以是字符串、数字代码
Echo-Request(代码为8)表示请求
Echo-Reply(代码为0)表示回复
Dest ination-Unreachable(代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
代码 | 含义 |
---|---|
8 | “Echo- Request” 表示请求 |
0 | “Echo- Reply” 表示回复 |
3 | "Dest ination-Unreachable"表示目标不可达 |
101能ping通102,102不能ping101,101ping102的时候需要发一个编号为8的包,然后102回复101一个编码为0的包,只需要把102发给101的8包禁掉就可以了
iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.210.102 -j DROP
#丢弃icmp的包,别人ping不通本机,本机也ping不通别人
iptables -A INPUT -p icmp -j DROP
#禁止其他主机ping本机
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#当本机ping不通其它主机时提示目标不可达,此时其它主机需要配置关于icmp协议的控制类型为REJECT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载模块
[-m matchname [per-match-options]]
可用于匹配非连续的端口,以离散的方式匹配,最多支持15个端口
--source-ports,--sports port[,portl,port:port]...
#指定多个源端口 号隔开
--destination-ports,--dports
port[,portl,port:port]...
# 指定多个目标端口 逗号隔开
--ports port[,portl,port:port]...
#多个源或目标端
iptables -A INPUT -s 192.168.210.102 -p tcp -m \
multiport --dports 22,80,3306 -j REJECT
#拒绝来自源IP地址为192.168.210.102的TCP流量,并且目标端口号为22、80和3306
然后在102服务器curl 192.168.210.101,发现拒绝连接
指明连续的(但一般不是整个网络)ip地址范围
基本格式
-m iprange --src-range from[-to] 源IP地址范围
-m iprange --dst-range from[-to] 目标IP地址范围
iptables -A INPUT -m iprange --src-range 192.168.210.102-192.168.210.104 -j REJECT
# 拒绝来自源IP地址范围为192.168.210.102到192.168.210.104的所有流量,并且应用于INPUT链(也就是进入服务器的流量),三个地址无法访问主机
iptables -A FORWARD -p udp -m iprange --src-range 192.168.210.102-192.168.210.103 -j DROP
#禁止转发源地址位于192.168.210.102-192.168.210.103的udp数据包
string模块用于在数据包的内容中搜索指定的字符串,并根据匹配结果执行相应的操作
基本格式
-m string --string 字符串 --algo bm/kmp
#bm kmp为字符串检测算法
--from offset 开始查询的地方
--to offset 结束查询的地方
iptables -A INPUT -p tcp --dport 80 -m string --string "example" --algo bm -j DROP
#对于目标端口为80的TCP流量,在数据包的内容中搜索字符串"example"
#如果匹配成功,则使用DROP动作丢弃该数据包
time模块用于根据时间条件匹配数据包,可以限制特定时间段内进出防火墙的数据包。
基本格式
-m time --匹配选项 匹配条件
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
时间
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]d
--monthdays day[,day...]每个月的几号
--weekdays day[,day...]星期几,1- 7 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,centos 7版本以上系统默认为 UTC
注意:centos6 不支持kerneltz ,--]ocaltz指定本地时区(默认)
匹配选项 | 含义 |
---|---|
- -timestart | 指定开始时间 |
- -timestop | 指定结束时间 |
- -datestart | 指定开始日期 |
- -datestop | 指定结束日期 |
- -days | Mon-Fri |
[root@localhost~]#date
#中国标准时间
2022年08月 14日 星期日 22:26:07 CST
[root@locaThost ~]#date -u
#utc时间
62022年 08月 14日 星期日 14:26:09 UTC
iptables -A INPUT -m time --timestart 08:00 --timestop 17:00 \
--datestart 2023-08-01 --datestop 2023-08-31 --days Mon-Fri -j ACCEPT
#在2023年8月1日至2023年8月31日期间的每个工作日的08:00至17:00之间,接受(ACCEPT)输入的数据
#如果不在指定的日期和时间范围内或不是工作日,则不匹配该规则
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connTimit-above N #连接的数量大于N时匹配
模拟攻击
[root@localhost3 7-2]# gcc flood_connect.c -o f1ood
#编译安装 黑客文件
[root@localhost3 7-2]# ./f1ood 192.168.210.101
#运行黑客脚本
[root@localhost 7-1]#ss -natp
[root@localhost 7-1]#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
如果一个用户访问我的80端口,连接数量大于2的时候就拒绝连接
limit 限制流量
--limit-burst number #前多少个包不限制
--1imit #[/second|/minute|/hour|/day]
例子:两条都要加
[root@locahost 7-2]#iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
icmp包前5个不限制,一分钟允许通过10个包
ping 192.168.210.101
[root@localhost ~]#iptables -A INPUT -p icmp -j REJECT
状态类型:
格式
老用户可以继续访问,拒绝新用户
--state state
iptables -F
#清空
[root@localhost 7-1]#ipatables -A INPUT -m state --state NEW -j REJECT
[root@localhost 7-1]#ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@localhost 7-2]#ping 192.168.210.101
#已在ping 的可以继续ping,停了也不可以通了,xshell也不可以再连
#新用户不可以访问,旧用户可以访问
lsmod |grep conn
#内核模块可以看到,调用state状态时可以看到
cat /proc/sys/net/netfilter/nf_conntrack_max
#记录的用户数为 65536
echo 1 > /proc/sys/net/netfilter/nf_conntrack_max
#修改最大记录数
tail /var/log/messages
#查看日志
#我可以访问A,A不能访问我 单向通讯
iptables -F
iptables -A INPUT -s 192.168.210.102 -m state --state NEW -j REJECT 第一个包是#请求包只要禁止请求包即可
iptables -F iptables -A INPUT -s 192.168.210.102 -j REJECT iptables -A INPUT -s 192.168.80.0/24 -j REJECT #加2条规则 iptables -vnL iptables-save #把规则显示出来 iptables-save > /data/iptables.rule #重定向保存到data下 iptables -F iptables -vnL #清空后规则没有了 iptables-restore < /data/iptables.rule #恢复 iptables -vnL vim /etc/rc.d/rc.local #写进文件里开机自动加载 iptables-restore < /data/iptables.rule chmod +x rc.local #给这个文件执行权限 iptables -F reboot
#方法2
yum install iptables-services.x86_64 -y
#备份工具
rpm -ql iptables-services
/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables
#保存到这个文件中
systemctl start iptables-services
#启动服务
systemctl enable iptables-services
#开机自启
SNAT原理与应用:
SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)
SNAT原理:源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢
SNAT转换前提条件:
1.局域网各主机已正确设置IP地址、子网掩码、默认网关地址
2.Linux网关开启IP路由转发
linxu系统本身是没有转发功能 只有路由发送数据
snat:作用是让内网机器可以上外网
内网机器地址一般是私网地址 192.168.0.0 - 192.168.255.255
172.16.0.0 172.31.255.255
10.0.0.0 10.255.255.255
这三网段是永远不会出现在公网上的,所以内网必然无法上网
snat 将私网转化成公网地址
DNAT原理与应用:
DNAT应用环境:在Internet中发布位于局域网内的服务器
DNAT原理:目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映谢。
DNAT转换前提条件:
1.局域网的服务器能够访问Internet
2.网关的外网地址有正确的DNS解析记录 3. Linux网关开启IP路由转发
实验环境 centos7-1(内网服务器) IP地址 192.168.210.101 网关指向7-2 ens33 centos7-2(网关服务器) ens33IP地址(nat):192.168.210.102 ens36IP地址(仅主机):12.0.0.1 centos7-3(外网服务器) ens33IP地址(仅主机):12.0.0.10 7-2 7-2添加网卡,仅主机模式 ip a cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens36 vim ifcfg-ens36 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens36 DEVICE=ens36 ONBOOT=yes IPADDR=12.0.0.1 NETMASK=255.255.255.0 systemctl restart network ping 12.0.0.1 #永久打开路由转发功能: vim /etc/sysctl.conf net.ipv4.ip_forward = 1 #将此行写入配置文件 sysctl -p #读取修改后的配置 7-1 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #把网关改成192.168.210.102 systemctl restart network route -n #查看网关 ping 12.0.0.1 ping 192.168.210.102 7-3 7-3网卡改成仅主机 #在虚拟机操作 ifconfig ens33 12.0.0.10/24 ping 12.0.0.10 ping 12.0.0.1 7-2 iptables -F -t nat iptables -F cd iptables -t nat -A POSTROUTING -s 192.168.210.0/24 -o ens36 -j SNAT --to 12.0.0.1 #将源地址为192.168.210.0段的私网地址全部 转化为网关地址 7-1 ping 12.0.0.10 cd /etc/yum.repos.d/ mkdir bak mv *.repo bak mount /dev/sr0 /mnt vim local.repo [local] name=local baseurl=file:///mnt gpgcheck=0 yum clean all yum makecache yum install -y httpd systemctl start httpd cd /var/www/html vim index.html wyx is a good girl 7-2 crul 192.168.210.101 iptables -t nat -A PREROUTING -i ens36 -s 12.0.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.210.101 7-3 curl 12.0.0.1
#补充知识
#字符界面 但是需要用到图形化时
yum install x11-forwarding -y #
systemctl start firewalld
export DISPLAY=192.168.2.1:0.0
#真机地址
yum install firewall-config -y
system-config-firewall
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。