14IPTables防火墙应用
一、IPTables防火墙介绍
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架"中,这个“安全框架"才是真正的防火墙,这个框架的名字叫netfiter. netfilter才是防火墙真正的安全框架(framework), netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。netfilter/iptables(下文中简 称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火 墙解决方案,完成封包过滤、封包重定向和网络地址转换NAT)等功能。
iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables会查 找其对应的匹配规则。如果找不到,iptables将对其采取默认操作。
iptables的结构是由表(tables)组成,而tables是由链组成,链又是由具体的规则组成。因此我们在编写iptables规则时,要先指定表, 再指定链。tables的作用是区分不同功能的规则,并且存储这些规则。
1、五张表:fiter, nat, mangle,raw,security:表只要将不同的规则存储再不同的表中
(1) filter表: 默认表,负责过滤数据包,使用频率最高
(2)nat表: 用于网络地址转换(IP、端口)和流量转发,使用频率较低
(3) mangle表: 主要应用在修改数据包、流量整形、给数据包打标识
(4)raw表: 这个表很少被用到,主要用于配置连接跟踪相关内容,使用频率较少
(5) security表: 这个表用于安全Linux的防火墙规则,是iptables最近的新增表,使用频率较少
2、五条链:流量的方向
(1) input: 匹配目标IP是本机的数据包(入站)
(2) output: 出口数据包(出站)
(3) forward: 匹配流经本机的数据包(转发)
(4) prerouting: 修改目的地址,用来做DNAT。如:把内网中的80端口映射到互联网端口
(5) postrouting: 修改源地址,用来做SNAT。如:局域网共享一个公网IP接入Internet,
3、规则: 基于防火墙策略设置的各类防护规则,防火墙规则的执行顺序认为从前到后依次执行、遇到匹配的规则就不在继续向下检查, 如果遇到不匹配的规则则会继续向下进行。
二、安装与配置IPTables
systemctl stop firewlld , firewall默认拒绝
yum install iptables iptables-services
启动xampp
[root@mycentos ~]# /opt/lampp/lampp start
Starting XAMPP for Linux 5.6.40-1...
XAMPP: Starting Apache...ok.
XAMPP: Starting MySQL...ok.
XAMPP: Starting ProFTPD...ok.
[root@mycentos ~]# systemctl start firewalld
打开firewalld,默认关闭所有端口,所以无法访问
关闭后可以访问
但是iptables也会拒绝连接,因为表里面有规则
[root@mycentos ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
三、基本的命令使用
ipables -nL:将端口号以数字形式显示默认表filter中的规则
iptables -I INPUT -i DROP:所有入站流量全部丢弃,包括SSH请求
iptables -I OUTPUT -j DROP:所有出站流量全部丢弃,包括SSH响应
上述两条命令一旦执行:所有流量无法进来,所有流量无法出去,断网状态
#对于ICMP的限制
iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p icmp -j REJECT
iptables -I OUTPUT -p icmp -j DROP
iptables -I INPUT -p tcp --dport 22 -j ACCEPT:打开目标端口22,接收流经该端口的流量
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
#允许本地访问外部IP地址和端口号,通过设定白名单的方式可以防止本机去访问别的服务器
#通过这种场景的设置,可以最大可能避免反弹shell和挖矿程序去试图通过本地访问目标服务器下载恶意程序或执行恶意指令
iptables -I INPUT -i ens33 -p tcp -s 192.168.112.153 --sport 8088 -j ACCEPT
iptables -I OUTPUT -o ens33 -p tcp -d 192.168.112.153 --dport 8088 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#防止DDOS攻击,设定一些数据的限制条件
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -t nat -A PREOUTING -p tcp --dport 7777 -j REDIRECT --to-port 80
#可以同时设定多个端口被允许
iptables -I INPUT -p tcp -m multiport --dport 80,22,443,3306 -j ACCEPT
#端口转发
#第一种:本机端口转发,比如80端口对外封闭,开放一个45692供外部访问,外部只知道45692,不知道80,可以避免协议猜测
#第二种:远程端口转发,把本机接收到的请求转发到远程电脑和对应端口上(远程可以是本地局域网,也可以是公网服务器)
#本机端口转发
iptables -t nat A PREROUTIN -p tcp --dport 7777 -j REDIRECT --to-port 80
#远程端口转发:
#需要确保端口转发功能是否启用
vi /etc/sysctl.conf
#加入下面这一行
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.conf
# PREROUTING上访问8888时,转发给目标服务器和目标端口202.108.22.5:80
# PREROUING是先于FILTER执行的,所以不需要转发时允许8888端口ACCEPT
iptables -t nat -A PREROUTING -d 192.168.234.188 -p tcp --dport 8888 -j DNAT --to-destination 202.108.22.5:80
iptables -t nat -A POSTROUTING -d 202.108.22.5 -p tcp --dport 80 -j SNAT --to 192.168.234.188
四、命令参数表
参数 | 说明 |
-A | 添加一条规则,即添加在规则的最后 |
INPUT | 链名、常用、大写 |
PREROUTING | 链名、大写 |
OUTPUT | 链名、大写 |
-I | 指定链中插入规则,添加到规则最前 |
-s | 指定源地址,可以是IP地址,也可以是网段"192.168.109.10/24";“-s为空”,表示所有 |
-d | 目标地址 |
-p | 指定协议 |
–dport | 指定主机端口(本机开放或拒绝端口) |
–sport | 指定主机端口(如:禁止连接对方某端口) |
-i | 指定网卡名,表示报文流入的接口 |
-o | 指定网卡名,表示报文流出的接口 |
-j | 指定所需要的操作 |
ACCEPT | 允许 |
REJECT | 拒绝,拒绝提供服务 |
DROP | 拒绝,丢弃数据包不回应 |
–src-range | 源地址范围,(如:拒绝某IP端访问) |
–dsc-range | 目标地址的范围 |
–mac-range | 源主机的mac地址 |
-t | 指定表名,默认是filter |
-v | 查看详细信息 |
-nvL --line-numbers | 查看filter表中规则的顺序 |
-nvL -t mangle | 查看mangle表中的防火墙规则 |
-F | 清空filter表 |
-l | 指定链中插入规则 |
-R | 替换规则 |
-m | 指定模块 |
第一次实际配置
iptables -nL
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -L INPUT --line-numbers
#和外界断网!!好安全
iptables -A INPUT -i DROP
iptables -A OUTPUT -o DROP
#开放80端口使得别人能访问
iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#开放能访问指定白名单ip地址方式
iptables -I INPUT -i ens33 -p tcp -s 110.242.68.4 --sport 80 -j ACCEPT
iptables -I OUTPUT -o ens33 -p tcp -d 110.242.68.4 --dport 80 -j ACCEPT
#8888端口访问百度
iptables -t nat -A PREROUTING -d 192.168.234.188 -p tcp --dport 8888 -j DNAT --to-destination 202.108.22.5:80
iptables -t nat -A POSTROUTING -d 202.108.22.5 -p tcp --dport 80 -j SNAT --to 192.168.234.188
iptables -I INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
DROP:直接丢失数据包,不会向源端做任何回复
REJECT:拒绝接收数据包,并向源端口发送拒绝响应
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp --icmp-type echo-request -j REJECT
iptables -I OUTPUT 1 -p --icmp-type echo-reply -j DROP
ipables -L INPUT --line-numbers
ipables -D INPUT 1
iptables -F 清空所有规则
service iptables save #永久保存
cat /etc/sysconfig/iptables #就是写入这个文件中
iptables -A INPUT -P tcp -s 45.96.174.68 -j ACCEPT
iptables -I INPUT -s ***.***.***.*** -j DROP
iptables -D INPUT -s ***.***.***.*** -j DROP
第二次实际配置
iptables -F清空所有规则
[root@mycentos ~]# iptables -F
[root@mycentos ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables -I INPUT -i DROP
[root@mycentos ~]# iptables -I INPUT -i DROP
[root@mycentos ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@mycentos ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:http
2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
3 DROP all -- anywhere anywhere
4 all -- anywhere anywhere
[root@mycentos ~]# iptables -D INPUT 4
[root@mycentos ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:http
2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
3 DROP all -- anywhere anywhere
[root@mycentos ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:http
2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
3 DROP all -- anywhere anywhere
[root@mycentos ~]# iptables -D INPUT 3
[root@mycentos ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:http
2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
[root@mycentos ~]# curl http://www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg uty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>