IPtables的基本使用及相关参数介绍
![image]()
1、IPtables的使用
1、安装iptables
yum install iptables* -y
2、启动iptables
systemctl start iptables
3、关闭firewalld
systemctl disable --now firewalld
补充:查看当前服务运行的状态(例:防火墙,网络管理等)
systemctl status firewalld
iptables语法格式:
iptables -t 表名 选项 链名称 条件 动作
参数介绍:
1.基本参数:
-t: 指定操作的表(后跟表名)
-L / --list: 列出当前防火墙的相关规则
-v: 列出数据包和数据包的大小
-n: 不反解地址 # 例:0.0.0.0表示任意ip地址,可反解为anywhere
# 查看当前防火墙的相关规则
iptables -L -V -n
2.选项:选项后跟链名
-A / --append 追加一条规则到链中(尾部)
-I / --insert 插入一条规则到链中,插入至顶部
-F / --flush 清空链中的规则
-Z / --zero 清空计数器(包数量、包大小)
-D / --delete 删除链中的规则
-R / --replace 修改
-S / --list-rules 列出所有的规则
-N / --new-chain 创建一个自定义链
-X / --delete-chain 删除一个自定义链
-P / --policy 指定链的默认策略
![image]()
2、iptables基本的条件匹配
条件后跟相应的协议
参数:-p
TCP(HTTP)
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协 议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要 经过三次“对话”才能建立起来,其中的过程非常复杂, 只简单的描述下这三次对 话的简单过程:
1)主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是 第一次对话;
2)主机B向主机A发送同意连接和要求同步 (同步就是两台主机一个在发 送,一个在接收,协调工作)的数据包 :“可以,你什么时候发?”,这是第二次 对话;
3)主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着 吧!”, 这是第三次对话。
UDP
UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传 送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发 送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传 输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中 读一个消息段
ICMP(PING)
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常, 其 实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据 包, 如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
ping命令是用来探测主机到主机之间是否可通信,如果不能ping到某台主 机,表明不能和这台主机建立连接。ping命令是使用 IP 和网络控制信息协议 (ICMP),因而没有涉及到任何传输协议(UDP/TCP) 和应用程序。它发送icmp回送 请求消息给目的主机
ALL(所有)
![image]()
3、iptables的相关动作
接收动作的参数:
-i :进来的网卡 (一般是网卡名,eth0/eth1)
-o : 出去的网卡 (一般是网卡名,eth0/eth1)
-m : 指定的模块 (可以借用模块从而实现我们的需求,大大减少工作量)
-p :指定协议 (接收匹配的相关条件协议)
-j : 转发动作
# 相关转发动作
ACCEPT 数据包放行,进行完该动作以后,将不再比对其他规则, 直接跳到下一个规则
REJECT 阻拦数据包,并将数据包传给对方并通知对方
DROP 丢弃包不予处理(可以理解为拒绝访问),进行完该处理 动作后,将不再比对其他规则,直接终端过滤程序
REDIRECT 将包重新导向到另外一个端口,进行完该处理动作后,将 会继续比对其他规则
![image]()
4、源地址、源端口、目标地址、目标端口
# 在进行网络传输的时候,涉及到两个对象,发送请求的一方,和接收请求的一方。
源地址:发送请求的地址/一方(一般遇到允许xxx访问,一般是对源地址进行限制)
参数:-s [源地址] # 和匹配条件相关协议连用
# 端口:可以认为是设备与外界通讯交流的出口
源端口:发送请求的一方的端口号
参数:--sport [源端口号] # 和源地址连用
目标地址:接收请求的地址/一方(一般遇到访问xxx或者使用xxx访问时,一般是对目标 地址进行限制)
参数:-d [目标地址] # 和匹配条件相关协议连用
目标端口:接收请求的一方的端口号
参数:--dport [目标端口号] # 和目标地址连用
案例1:其他服务器访问当前服务器只允许使用22端口可以访问,其他端口全部无法访问。
[root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
参数解释:
-t 参数: 后跟表名
filter: filter表
-A 选项: 后跟链名
INPUT: 链名
-p 选项: 后跟匹配的协议
TCP: tcp协议
--dport: 后目标端口号
22: 目标端口号
-j: 后跟相关转发动作
ACCEPT: 数据包放行动作
案例2:其他服务器访问当前服务器只允许22,80,443端口可以访问,其他端口全部无法访问。
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,83,43 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
部分参数介绍:
-m: 调用模块,后跟模块名
multiport模块: 接收一串端口,不同的端口号之间用逗号隔开,连续 的端口号用冒号gekai
案例3:其他服务器访问当前服务器要求使用192.168.15.81能够通过22端口链接,但是其他的不行
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
案例4:只允许192.168.15.71能够通过22端口访问192.168.15.81,其他的不行
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
案例5:要求192.168.15.71对外部不可见(其他服务器不能对192.168.15.71进行访问)
[root@prometheus ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP
案例6:要求使用eth0网卡的所有请求全部拒绝
[root@prometheus ~]# iptables -t filter -A INPUT -p TCP -i eth0 -j DROP
案例7:使用172.16.1.71登录进来的窗口,不允许访问百度。
[root@prometheus ~]# iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP
案例8:要求访问nginx服务器的8080端口转发至80端口
[root@m01 ~]# iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
补充:删除链里的规则
[root@m01 ~]# iptables -t nat -D PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
案例9:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
补充:查看本机端口占用的命令:
netstat -nutlp
![image]()
5、模块
在iptables网路传输里也存在有模块的概念
作用:扩展iptables的功能
模块:具有一系列功能的集合体
如何导入模块:-m [模块名]
1、multiport模块:连续匹配多个端口号
--sport / --dport :指定多个端口,不同端口之间用逗号隔开,连续端口使用冒号分割
2、iprange模块:指定一段连续的ip地址范围
--src-range from [-to] :源地址范围
--dst-range from [-to] :目标地址范围
3、string模块: 匹配指定字符串
--string pattern # 指定要匹配的字符串
--algo {bm|kmp} # 匹配的查询算法
4、time模块: 根据时间匹配报文
--timestart hh:mm[:ss] # 开始时间
--timestop hh:mm[ss:] # 结束时间
--monthdays day[,day...] # 指定一个月的某一天
--weekdays day[,day...] # 指定周还是周天
5、禁ping,默认本机无法ping别人、别人无法ping自己
--icmp-type {type[/code]|typename}
echo-request (8)请求
echo-reply (0)回应
6、connlimit模块:限制连接数,并发链接数
--connlimit-upto n # 如果现有链接数小于或等于n则匹配
--connlimit-above n # 如果现有链接数大于n则匹配
7、针对报文速率进行限制。 秒、分钟、小时、天
--limit rate [/second/minute|/hour|day] # 报文数量
即我们平时在基于网络传输文件时的传输速度:例:100kb/s
--limit-burst number # 报文数量(默认:5)
![image]()
6、应用模块相关案例
案例1:其他服务器访问本地服务器只能通过22,80,443以及30000-50000之间所有的端口,其他端口拒绝
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dport 22,80,443,30000:50000 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
案例2:要求访问数据包中包含HelloWorld的数据不允许通过。
[root@m01 html]# iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP
案例3:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
[root@m01 html]# iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -d 192.168.15.81 --dport 22 -j ACCEPT
[root@m01 html]# iptables -t filter -A INPUT -p TCP -j DROP
案例4:要求除每天的12到13点之间,不允许访问192.168.15.81(限制时间时的时间指的是UTC时间,即和北京时间相差8个时差,也就是4点到5点)
[root@m01 html]# iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -d 192.168.15.81 -j ACCEPT
[root@m01 html]# iptables -t filter -A INPUT -p TCP -j DROP
案例5:要求别人不能ping本机,但是本机可以ping别人
[root@m01 ~]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type "echo-request" -j DROP
案例6:要求连接192.168.15.81的最多有两个
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m connlimit --connlimit-above 2 -d 192.168.15.81 --dport 22 -j DROP
案例7:要求限制速率在500k/s左右
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m limit --limit 333/s -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
![image]()