目录
1.五张表:filter ,nat,mangle,raw,security
2.五条链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
IPTables - 基础用法
一、IPTables防火墙介绍
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架”中,这个“安全框架"才是真正的防火增,这人推框架的名字叫netfiter。netfiter才是防火增真正的安全架(tramework).netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架,netfilter/iptables (下文中管你为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替品贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换 (NAT)等功能
iptables 是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables 会查找其对应的匹配规则。如果找不到,iptables 将对其采取默认操作。
iptables的结构是由表(tables)组成,而tables是由链组成,链又是由县体的规则组成。因此我们在编写iptables规则时,要先指定表再指定链。tables的作用是区分不同功能的规则,并目存储这些规则
1.五张表:filter ,nat,mangle,raw,security
(1)filter表:默认表,负责过滤数据包
(2)nat表:用于网络地址转换(IP,端口)
(3)mangle表:主要应用于修改数据包,流量整形,给数据包打标识
(4)raw表:这个表很少被用到,主要用于配置连接跟踪相关内容,使用频率较少
(5)security表:这个表用于安全Linux的防火墙规则,是IPTables最近新增的表,使用频率较低
2.五条链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
(1)INPUT:匹配目标IP是本机的数据包
(2)OUTPUT:匹配出口数据包
(3)FORWARD:匹配流经本机的数据包
(4)PREROUTING:修改目的地址,用来做 DNAT 。如:把内网中的80端口映射到互联网端口
(5)POSTROUTING:修改源地址,用来做 SNAT 。如:局域网共享一个公网IP接入Internet。
3.规则
基于防火墙策略设置的各类防护规则,防火墙规则的执行顺序认为从前到后依次执行,遇到匹配的规则就不再继续向下检查,如果遇到不匹配的规则就会继续向下进行。
IPTables默认没有设置规则的情况下,是允许所有流量还是拒绝呢???
在默认情况下,iptables规则是允许所有流量的。也就是说,如果没有显式地定义任何规则,那么iptables将不会阻止或过滤任何流量。
然而,这并不意味着它是完全无保护的。默认情况下,iptables有一些内置的规则,称为"INPUT"、"FORWARD"和"OUTPUT"链,它们对某些流量进行了基本的限制。例如,INPUT链规则会阻止从外部网络到本地网络的未请求的流量,但不会阻止本地网络之间的流量。
因此,尽管在默认情况下iptables不阻止任何流量,但仍然建议为特定的应用程序或服务定义明确的规则,以确保只有预期的流量能够通过。
但为什么我的CentOS上并没有给刚安装好的IPTables配置任何规则,但他依旧阻止了来自外部的流量???
这可能是因为CentOS在安装时默认配置了iptables规则以保护系统的安全。虽然你没有显式地配置任何规则,但CentOS可能已经设置了一些默认规则来限制外部访问。
这些默认规则可能包括阻止未请求的流量、只允许本地流量等。这些规则的目的是防止潜在的攻击或未经授权的访问。
如果你发现你的CentOS系统阻止了外部访问流量,但你并没有配置任何规则,那么你可以通过运行以下命令来查看iptables的默认规则:
iptables -L
这将列出当前配置的iptables规则。在输出中,你应该能看到INPUT、FORWARD和OUTPUT链的默认规则。
如果你确定这些默认规则是导致问题的原因,并且你希望允许外部流量,你可以使用以下命令暂时禁用iptables:
service iptables stop
请注意,这只是一个临时解决方案,并且可能会降低系统的安全性。在禁用iptables后,请确保你理解了如何配置和启用适当的防火墙规则来保护你的系统。
如果你希望修改默认规则或添加自定义规则,你可以使用以下命令来编辑iptables配置文件:
vi /etc/sysconfig/iptables
在文件中,你可以添加、修改或删除规则以满足你的需求。完成后,保存文件并重新加载iptables规则:
service iptables restart
这样,你就可以根据自己的需求配置和调整iptables规则了。
而我就是在文件 /etc/sysconfig/iptables
这个中添加了一个允许80 端口访问的规则,这样才可以使得我在开启iptables的同时可以使用http访问,如果我不想通过添加规则仅仅使用默认来使得iptables允许外部流量访问,又该怎么做呢,应该就是上面使用 service iptables stop
二、安装与配置IPTables
systemctl mask firewalld systemctl stop firewalld yum install -y iptables yum install -y iptables-services
三、基本命令的使用
-A 表示append追加的意思 —I 表示insert在最上面插入的意思 -j 表示接上对应的动作,是同意还是丢弃 -D 表示删除对应的规则 iptables -L OUTPUT --line-numbers 查看出站规则的行号 iptables -nL :将端口号以数字的形式显示默认表filter中的规则 iptables -I INPUT -j DROP :将所有入栈流量全部丢弃,包括ssh请求 iptables -I OUTPUT -j DROP : 将所有出栈流量全部丢弃,包括ssh响应 上述两条命令一旦执行,所有流量进不来也出不去,处于断网状态 iptables -A INPUT -j DROP : iptables -A OUTPUT -j DROP : iptables -I INPUT -p tcp --dport 22 -j ACCEPT :打开目标端口22,接受流经该端口的流量 iptables -I INPUT -p tcp --dport 80 -j ACCEPT :打开目标端口80,接受流经该端口的流量
要想阻止其他所有流量,只放通ssh即22号端口的流量,可以使用以下
iptables -I INPUT -j DROP
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
这四条命令配合使用,先阻止所有入站流量,然后在阻止所有入站流量的规则基础上前方插入一个允许22号端口流量入站的规则或者我们不适用 -I
而使用 -A
,那么就是 iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
这样就是先放通22号端口流量,再追加拒绝所有
别忘了,只允许进来,但不允许出去,22号端口依旧连通失败,所以我们还需要和上面一样的配置一下出站的情况,即:
iptables -I OUTPUT -j DROP
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
或
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -j DROP
iptables -nL
列出表中链的信息(将端口号以数字的形式显示默认表filter中的规则)
iptables -t
用来指定表名
当然,通过以上的方式还可以做到防止反弹shell的目的:开通INPUT中的dport为80,OUTPUT中的sport为80,此时就已经可以做到别人可以访问我这个服务器,但OUTPUT中我并不配置dport为80,也就是说对于我本身服务器来说,我是无法访问出去的,只能别人访问我,我无法访问别人,前提是我在INPUT和OUTPUT中的最下面都配置了DROP all
DORP:直接丢弃数据包,不会向源端做任何回复 REJECT:拒绝接收数据包,并向源端口发送拒绝响应 iptables -f 刷新 service iptables save 保存规则 cat /etc/sysconfig/iptables
IPTables进阶用法
在上节课我们余留了一个问题:别人可以访问我,我不可以访问别人,但要是我这台服务器想要从另一台服务器中获取数据该怎么办。今天我们就来完成这个实验。
首先,通过画图构建思维
既然是要我访问别人,那么我首先OUTPUT链中需要一个dport为80的规则,然后INPUT链中需要一个sport为80 的端口,且动作都是ACCEPT
我们思考:我的服务器要想访问别人,那么首先要OUTPUT一个出去的请求,此时 dport 是80,然后别的服务器要返回给我响应,此时对于我来说,这个数据包的 sport 就是80。我们还可以换一个思考方式,我的服务器自身的端口是随机分配的,所以规则不可能是通过配置我自身服务器的端口来实现的
如果遇到 curl http://101.37.65.91/
然后CentOS没有任何反应,可能会有以下几种原因
1:太多数据包太快。数据包到打印缓冲区运行已满,并且内核“丢弃”curl发送的数据包,然后tcpdump才有机会将它们打印给您.解决方案是增加缓冲区空间,例如使用–buffer-size = 102400(这会将大约100MB的ram专用于缓冲区,我不确定默认大小是多少,但我认为它在1-4MB)
2:你有多个网络“接口”,而你正在聆听错误的接口。我不知道如何询问curl它使用哪个界面,但你可以通过curl –interface eth0 URL – 以及在Linux& Mac& BSD,您可以通过执行sudo ifconfig获取可用接口列表(我认为windows等效于某个控制面板,但是idk)
3:tcpdump的默认用户无法读取用户curl正在运行的数据包因为某些原因…默认情况下tcpdump会在捕获时掉入自己的用户名为tcpdump,你可以尝试从卷曲的同一用户捕获通过使用-Z curluser运行,或强制tcpdump通过执行-Z root以root身份捕获
#允许本地访问外部IP地址和端口号,通过设定白名单的方式可以防止本机去访问别的服务器 #通过这种场景的设置,可以最大可能得避免反弹shell和挖矿程序去试图通过本地访问目标服务器下载恶意程序或执行恶意命令 iptables -o ens32 -I OUTPUT -p tcp -d 192.168.112.153 --dport 80 -j ACCEPT iptables -o ens32 -I OUTPUT -p tcp -d 192.168.112.153 --dport 80 -j ACCEPT #防止DDOS攻击,设定一些数据的限制条件 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minite --limit-burst 100 -j ACCEPT #可以同时设定多个端口允许 iptables -I INPUT -p tcp -m multiport --dport 80,22,443,3306 -j ACCEPT #端口转发: #第一种:本地端口转发,比如80端口对外封闭,开放一个7777端口供外部访问,外部只知道7777端口,不知道80端口,可以避免协议猜测 iptables -t nat -A PREROUTING -p tcp --dport 7777 --to-port 80 #第二种:远程端口转发,把本机接收到的请求转发给远程电脑和对应端口上(远程可以是本地局域网,也可以是网络服务器) #此时需要确保转发功能是启用的 vi /etc/sysctl.conf 然后添加net.ipv4.ip_forward=1 sysctl -p /etc/sysctl.conf #PREROUTING上访问8888端口时,转发给目标服务器和目标端口 #PREROUTING是先于FILTER执行的,所以不需要转发时允许8888端口(也就是说PREROUTING的优先级高于FILTER,对PREROUTING的命令配置是不需要经过FILTER规则通过的) iptables -t nat -A PREROUTING -d 192.168.112.188 -p tcp --dport 7777 -j DNAT --to-destination 101.37.65.91:80 #上面配置的意思是,当有人访问192.168.112.188:7777端口时,就会通过DNAT的模式跳转到101.37.65.91:80(即;将数据报远程出去) iptables -t nat -A POSTROUTING -d 101.37.65.91 -p -tcp --dport 80 -j SNAT --to 192.168.112.188 #要想可以达到真正跳转的目的,不仅要有请求,还要有回去的响应。我上面将用户的请求转发到101.37.65.91:80,这里就是用户在101.37.65.91:80里面做的请求再路由到192.168.112.118我的这台服务器上 (即:将远程的数据包转发回来) iptables -t nat -A PREROUTING -p tcp --dport 7777 --to-port 80 iptables -t nat -A PREROUTING -d 192.168.230.147 -p tcp --dport 7777 -j DNAT --to-destination 101.37.65.91:80 iptables -t nat -POSTROUTING -d 101.37.65.91 -p tcp --dport 80 -j SNAT --to 192.168.230.147
这个端口转发的功能可以达到钓鱼网站的做法,我将你访问的
四、命令参数表
-p | 指定协议 |
--dport | 指定主机端口 (本机开放或拒绝端口) |
--sport | 指定主机端口 (如: 禁止连接对方某端口) |
-i | 指定网卡名,表示报文流入的接口 |
-o | 指定网卡名,表示报文流出的接口 |
-j | 指定所需要的操作 |
ACCEPT | 允许 |
REJECT | 拒绝,拒绝提供服务 |
DROP | 拒绝,丢弃数据包不回应 |
--src-range | 源地址范围, (如: 拒绝某IP段访问) |
--dsc-range | 目惨出颠步版辈豹撑镑地址的范围 |
--mac-source | 源主机的mac地址 |
-t | 指定表名,默认是filter |
-v | 查看详细信息 |
-nvl --line-numbers | 查看fliter表中规则的顺序 |
-nvl -t mangle | 查看mangle表中的防火墙规则 |
-F | 清空filter表 |
-I | 指定链中插入规则 |
-R | 替换规则 |
-m | 指定模块 |