一、什么是iptables?
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统
如果 Linux 系统连接到因特网或LAN、服务器或连接 LAN 和因特网的代理服务器 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置
防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中 在数据包过滤表中,规则被分组放在我们所谓的链(chain)中 而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则 虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成
netfilter 组件也称为内核空间(kernelspace),是内核的一部分 由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集 iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易 除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它
与firewalld防火墙相比,iptables防火墙与我们平常所说的三张表和五条链的关系更大
二、本次实验环境
server虚拟机做iptables服务搭建
两块网卡 :eth0 172.25.254.176 eth1 192.168.0.176
desktop虚拟机做测试端
单网卡: eth0 192.168.0.20
真机做测试端
br0 172.25.254.76
三、iptables相关设置
1、参数
-t | 指定表 |
---|---|
-p | 协议 |
-n | 表示不做解析 |
-A | 向规则链中添加条目 |
-D | 从规则链中删除条目 |
-C | 检查策略 |
-I | 向规则链中插入条目 |
-R | 替换规则链中的条目 |
-L | 显示规则链中已有的条目 |
-F | 刷新,清除规则链中已有的条目 |
-N | 创建新的用户自定义规则链 |
-X | 删除链 |
-E | 替换名称 |
-S | 查看规则中的命令 |
-h | 显示帮助信息 |
-p | 指定要匹配的数据包类型 |
-s | 指定要匹配的数据包源地址 |
-i | 指定数据包要进入本机的网络接口 |
-o | 指定数据包要离开本机所使用的网络接口 |
-j | 指定行为 ACCEPUT/REJECT/DROP |
-P | 修改默认规则,不能用reject |
2、iptables安装
yum install iptables_server #下载iptables服务
systemctl stop firewalld #关闭防火墙
systemctl disable firewalld #开启默认关闭
systemctl mask firewalld #锁住防火墙
systemctl start iptables #打开iptables
3、查看三表五链的内容
iptables -nL #默认查看filter
iptables -t filter -nL #指定查看filter表
iptables -t nab -nL #指定查看nat表
iptables -nL -t mangle
4、保存查看过的表中的数据
永久
【1】
service iptables save #保存
查看cat /etc/sysconfig/iptables
【2】
iptables-save #保存
iptables-save > /etc/sysconfig/iptables #永久保存
刷新掉再保存就清空保存的内容
iptables -F #刷新内容
service iptables save #保存数据信息
4、iptables各参数的使用
【1】
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #指定filter表添加输入,遵循tcp协议,目的地端口为22,接收连接
iptables -nL
【2】
iptables -D 1
iptables -t filter -A INPUT -s 172.25.254.76 -p tcp --dport 22 -j REJECT #指定主机拒绝可输入(ssh连接)
iptables -nL
【3】
iptables -t filter -I INPUT 1 -p tcp --dport 22 -j ACCEPT #指定插入到第一位,每一个策略都会读,从上往下
iptables -nL
【4】
iptables -S INPUT #查看INPUT中的所有使用过的命令
【5】
iptables -N redhat #默认添加到filter组中
iptables -nL
【6】
iptables -E redhat star #修改链名
iptables -nL
【7】
iptables -X star #删除westos链
iptables -nL
【8】
intables -P INPUT DROP #修改filter表中INPUT链默认DROP
intables -nL
5、调整查询速度
设置原来连接过的连接时不需要依次读取,新的依次查找
netstat -antlupe #查看所有开启的端口
-i | 接口 |
---|---|
-p | 协议 |
-m | 后边接状态 |
–state | 状态 |
ESTABLISHED | 第一次连接上未断开情况下,继续查询 |
RELATED | 连接过的查询 |
intables -A INPUT -m state ESTABLISHED,RELATED -j ACCEPT #第一次连接上未断开或以前连接过的接受连接,不用向下调度
intables -A INPUT -m state --state NEW -i lo -j ACCEPT #通过本机回环接口的所有新连接数据都允许
intables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT #第一次使用22端口连接的主机允许服务
intables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT #第一次使用80端口连接的主机允许
iptables -A INPUTE -j REJECT
6、iptables地址伪装功能和地址转换功能
从eth0这出去的信息经过路由之后(地址伪装)传输给别人
我接收的来自eth0信息是在发生在路由之前(未经过内核,进行地址转换)
注意1:这里的进来出去均是对于路由器说的
DNAT 接收 地址伪装
SNAT 发送 地址转换
iptables -t nat -A POATROUTING -o eth0 -J SNAT --to-
source 172.25.254.176 #从eth0出去的
数据,将其源地址转换为172.25.254.176
iptables -t nat PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 192.168.0.219:22 #从eth0网卡的22端口进来的数据,将其目的地转换为192.168.0.119
输入过程中若不小心输入错误解决方法:
iptables -nL -t nat #查看是否已链接
若链接到POSTROUTING上则:
iptables -D 1 POSTROUTING -t nat
实验:
【1】
> /etc/sysconfig/iptables #清空iptables所有缓存
iptables -nL #查看默认表filter策略信息是否已经清空
iptables -nL -t nat #查看表nat策略信息
【2】
sysctl -a | grep ip_forward #查看内核路由功能是否开启
vim /etc/sysctl.conf #编辑路由文件
net.ipv4.ip_forward = 1 #开启内核路由功能
sysctl -p #重新加载内核信息
【3】
双网卡主机上
iptables -t nat -A POSTROUTING -o eth0 -J SNAT --to-source 172.25.254.176
此时在192.168.0.20主机上测试
ping 172.25.254.76(此网段所有主机均可ping通)
server端:
iptables -t nat PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 192.168.0.20:22
此时在172.25.254.76主机上
ssh root@172.25.254.176
ip addr show