一、IPTables防火墙介绍
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter。
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables会查找其对应的匹配规则。如果找不到,iptables将对其采取默认操作。
iptables的结构是由表(tables)组成,而tables是由链组成,链又是由具体的规则组成。因此我们在编写iptables规则时,要先指定表,再指定链。tables的作用是区分不同功能的规则,并且存储这些规则。
1、五张表:filter, nat, mangle;表主要用于将不同的规则存储在不同的表中
(1)filter表:默认表,负责过滤数据包
(2)nat表:用于网络地址转换(IP、端口)
(3)mangle表:主要应用在修改数据包、流量整形、给数据包打标识
(4)raw表:这个表很少被用到,主要用于配置连接跟踪相关内容,使用频率较少
(5)security表:这个表用于安全Linux的防火墙规则,使用频率较少
2、五条链:流量的方向
(1)input:匹配目标IP是本机的数据包;入站
(2)output:出口数据包;出站
(3)forward:匹配流经本机的数据包;转发
(4)prerouting:修改目的地址,用来做DNAT。如:把内网中的80端口映射到互联网端口
(5)postrouting:修改源地址,用来做SNAT。如:局域网共享一个公网IP接入Internet。
3、规则:基于防火墙策略设置的各类防护规则,防火墙规则的执行顺序认为从前到后依次执行、遇到匹配的规则就不再继续向下检查、如果遇到不匹配的规则则会继续向下进行。
二、安装和配置iptables
[root@localhost yt]# sysemctl status firewalld
[root@localhost yt]# systemctl status iptalbes
[root@localhost yt]# yum install iptables-services
默认规则下,firewalld会拒绝所有流量
[root@localhost yt]# systemctl start firewalld
停止之后xampp可以正常访问
[root@localhost yt]# systemctl stop firewalld

出现下面问题需要安装iptables

xampp还是被阻止了?
[root@localhost yt]# systemctl start iptalbes
[root@localhost yt]# systemctl status iptables

三、基本的命令使用
[root@localhost yt]# iptables -L

将端口号以数字的形式显示默认表filter中的规则
[root@localhost yt]# iptables -nL

[root@localhost yt]# iptables -t filter -nL

[root@localhost yt]# iptables -t nat -nL

所有入站流量全部丢弃,包括SSH请求。所有流量无法进来。
-A:表示append
-I:表示input,插入
[root@localhost yt]# iptables -A INPUT -j DROP

打开目标端口22,接受流经该端口的流量
[root@localhost yt]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT


所有出站流量全部丢弃,包括SSH响应。所有流量无法出去。
[root@localhost yt]# iptables -I OUTPUT -j DROP
[root@localhost yt]# iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT


访问不了外网
[root@localhost yt]# curl https://www.baidu.com
curl: (6) Could not resolve host: www.baidu.com; Unknown error
[root@localhost yt]# iptables -I INPUT -p TCP --dport 80 -j ACCEPT

两个方向的80端口放开之后,XAMPP就能正常访问
[root@localhost yt]# iptables -I OUTPUT -p TCP --sport 80 -j ACCEPT

外网访问内网使用ping是禁止的

需要配置两条
[root@localhost yt]# iptables -I INPUT -p icmp -j ACCEPT
[root@localhost yt]# iptables -I OUTPUT -p icmp -j ACCEPT

查看出站规则的行号
[root@localhost yt]# iptables -L OUTPUT --line-numbers

把出站规则的第4条规则删除
[root@localhost yt]# iptables -D OUTPUT 4

DROP:直接丢失数据包,不会向源端做任何回复
REJECT:拒绝接收数据包,并向源端发送拒绝响应
重启iptables后所有的配置会失效。
需要将配置进行保存
[root@localhost yt]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
清空所有写的规则
iptables -F
[root@localhost yt]# cat /etc/sysconfig/iptables

四、进阶命令配置
给服务器配置对端的服务器ip地址,访问80端口,即将该IP地址白名单到服务器中。
允许本地访问外部IP地址和端口号,通过设定白名单的方式可以防止本机去访问别的服务器
通过这种场景的设置,可以最大可能避免反弹she11和挖矿程序去试图通过本地访问目标服务器下载恶意程序或执行恶意指令。
[root@localhost yt]# iptables -I OUTPUT -o ens33 -p tcp -d 183.2.172.177 --dport 80 -j ACCEPT
[root@localhost yt]# iptables -I INPUT -i ens33 -p tcp -s 183.2.172.177 --sport 80 -j ACCEPT

防止DDOS攻击,设定一些数据的限制条件
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
可以同时设定多个端口被允许
iptables -I INPUT -p tcp -m multiport --dport 80,22,443,3306 -j ACCEPT

端口转发
第一种:本机端口转发,比如80端口对外封闭,开放一个45692供外部访问,外部只知道45692,不知道80,可以避免协议猜测
第二种:远程端口转发,把本机接收到的请求转发到远程电脑和对应端口上(远程可以是本地局域网,也可以是公网服务器)
配置本机端口转发:
iptables -t nat -A PREROUTING -p tcp --dport 9999 -j REDIRECT --to-port 80
配置本机端口转发前:

配置本机端口转发后:

远程端口转发
需要确保端口转发功能是启用的,默认是关闭的
[root@localhost yt]# vi /etc/sysctl.conf
在最后加入以下命令
net.ipv4.ip_forward = 1
启用配置
[root@localhost yt]# sysctl -p /etc/sysctl.conf


配置远程端口转发
场景:通过本机的服务器IP地址访问到其他网站
PREROUTING上访问7777时,转发给目标服务器和目标端口
PREROUTING是先于FILTER执行的,所以不需要转发时允许7777端口ACCEPT
[root@localhost yt]# iptables -t nat -A PREROUTING -d 192.168.102.131 -p tcp --dport 7777 -j DNAT --to-destination 183.2.172.177:80
[root@localhost yt]# iptables -t nat -A POSTROUTING -d 183.2.172.177 -p tcp --dport 80 -j SNAT --to 192.168.102.131
# 查看所有nat表规则
iptables -t nat -L -n --line-numbers
# 查看更详细的信息(包括数据包和字节计数)
iptables -t nat -L -n -v
# 查看PREROUTING链规则
iptables -t nat -L PREROUTING -n --line-numbers
# 查看POSTROUTING链规则
iptables -t nat -L POSTROUTING -n --line-numbers
# 查看OUTPUT链规则
iptables -t nat -L OUTPUT -n --line-numbers
# 删除PREROUTING链的第3条规则
iptables -t nat -D PREROUTING 3
# 删除POSTROUTING链的第1条规则
iptables -t nat -D POSTROUTING 1
# 删除OUTPUT链的第2条规则
iptables -t nat -D OUTPUT 2