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 或更高版本,否则需要下载该工具并安装使用它。
netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
过程说明:
基本语法:iptables [-t TABLE] COMMAND CHAIN [RULE] [-j TARGET]
iptables | table | command | chain | Paramter & Xmatch | target |
---|---|---|---|---|---|
iptables | -t filter nat | -A -D -L -F -P -I -R -n | INPUT FORWARD OUTPUT PREROUTING POSTROUTING | -p tcp -s -d --sport --dport --dports -m tcp state multiport | -j ACCEPT DROP REJECT DNAT SNAT |
解释:iptables 的某个表(table),对应的是那一条链(chain),对这条链上的什么内容(Parameter Xmatch)进行什么样的操作(target).
command:
-A:表示的是追加一个什么规则。
-D:表示的是删除一个规则。
-L:表示列出所有的规则。
-F:表示清空对应的规则。‘
-P:设置默认规则。
-I:插入第一行,最为第一个规则。
-R:替换。
-n:把对应的域名转换成ip地址。
保存iptables规则
sudo iptables-save
保存ipv6 的iptables规则
sudo ip6tables-save
查看iptables规则
sudo iptables -L
查看iptables规则,以数字形式
sudo iptables -L -n
查看iptables规则的序号,用于删除规则参考
sudo iptables -L -n --line-numbers
清除所有iptables预设表filter里的所有规则
sudo iptabels -F
清除预设表filter中使用者自定链中的规则
sudo iptables -X
清除单条iptables规则
sudo iptables -D INPUT(链) 3(规则对应的序号)
修改单条iptables规则,使用 -R,修改INPUT链序号为3的规则为允许,第4条规则为拒绝,丢弃
- sudo iptables -R INPUT 1 -j ACCEPT
- sudo iptables -R INPUT 2 -j DROP
允许已经建立的连接发送和接收数据,以免设置链为DROP时远程ssh断开
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
保证VPS可以运行的时候,可以为loopback网卡添加运行规则,插到第一行
sudo iptables -I INPUT 1 -i lo -j ACCEPT
允许某段IP访问本机的所有类型的所有端口
- sudo iptables -I INPUT -s 192.168.1.0/24 -p all -j ACCEPT
- sudo iptables -I INPUT -s 192.168.0.0/16 -p all -j ACCEPT
允许本机127.0.0.1访问自身所有端口
sudo iptables -I INPUT -s 127.0.0.1 -p all -j ACCEPT
允许某段IP访问本机的TCP 3306端口
sudo iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
允许某段IP访问本机的某段TCP端口
sudo iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 3306:65525 -j ACCEPT
向所有IP开放ssh的远程连接,这里是已经更改了的19515端口,默认为22端口
sudo iptables -A INPUT -p tcp --dport 19515 -j ACCEPT
默认INPUT OUTPUT FORWORD 链都是全部接受,需要改为拒绝
确保ssh远程连接端口已经添加进 IPUNT 允许规则中,否则执行以下命令将可能会断开远程
- sudo iptables -A INPUT -p tcp --dport 19515 -j ACCEPT #这里ssh端口为19515
- sudo iptables -P INPUT DROP
可选项,需保证SSH端口已经添加各链的允许规则,否则会断开SSH连接并无法远程连接
- sudo iptables -P OUTPUT DROP
- sudo iptables -P FORWORD DROP
iptables规则配置后,无法访问外网,无法接收返回的数据,进行以下配置,并保证OUTPUT状态为ACCEPT,会使iptables允许由服务器本身请求的数据通过
- sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- sudo iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables 的持久化,由于重启ubuntu会导致iptables规则消失,需要持久化
1.安装iptables-persistent工具帮助我们持久化
- sudo apt-get update
- sudo apt-get install iptables-persistent -y
执行命令持久化
- sudo netfilter-persistent save
- sudo netfilter-persistent reload
2.将iptables规则存入文件,随网卡状态进行加载,保存
将iptables保存的规则保存入当前用户的文件
sudo iptables-save > /home/user/iptables.rules
在/etc/network/interfaces 网卡配置文件里加入相应内容
vim /etc/network/interfaces
添加内容
- pre-up iptables-restore < /home/user/iptables.rules
- post-down iptables-save > /home/user/iptables.rules
用到的参数解释:
pre-up: 网卡启用前的动作
up: 启用时候的动作
post-up: 启用后的动作
pre-down: 关闭前的动作
down: 关闭时动作
post-down: 关闭后动作
iptables的关闭,使用清除规则来实现
- sudo iptables-save > /home/user/iptables.rules
- sudo iptables -X 清除默认filter表里的自定义规则
- sudo iptables -t nat -F 清除nat表里的规则
- sudo iptables -t nat -X
- sudo iptables -t mangle -F 清除nat表里的规则
- sudo iptables -t mangle -X
- sudo iptables -P INPUT ACCEPT 将INPUT链默认更改为全部接受
- sudo iptables -P OUTPUT ACCEPT
- sudo iptables -P FORWORD ACCEPT