Iptables 是 Linux 内核集成的 IP 信息包过滤系统. 如果 Linux 系统连接到因特网或 LAN, 服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置.
IPTABLES 的简单介绍
防火墙在做信息包过滤决定时, 有一套遵循和组成的规则, 这些规则存储在专用的信息包过滤表中, 而这些表集成在 Linux 内核中. 在信息包过滤表中, 规则被分组放在我们所谓的链 (chain) 中. 而 netfilter/iptables IP 信息包过滤系统是一款功能强大的工具, 可用于添加, 编辑和移除规则.
虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体, 但它实际上由两个组件 netfilter 和 iptables 组成.
netfilter 组件也称为内核空间(kernelspace), 是内核的一部分, 由一些信息包过滤表组成, 这些表包含内核用来控制信息包过滤处理的规则集.
iptables 组件是一种工具, 也称为用户空间(userspace), 是用来管理 netfilter 的, 它使得配置防火墙变得简单.
IPTABLES 的规则:
Iptables 的规则链分为三种: 输入, 转发和输出.
输入 -- 这条链用来过滤目的地址是本机的连接. 例如, 如果一个用户试图使用 SSH 登陆到你的 PC 服务器, iptables 会首先匹配其 IP 地址和端口到 iptables 的输入链规则.
转发 -- 这条链用来过滤目的地址和源地址都不是本机的连接. 例如, 路由器收到的绝大数数据均需要转发给其它主机. 如果你的系统没有开启类似于路由器的功能, 如 NATing, 你就不需要使用这条链.
输出 -- 这条链用来过滤源地址是本机的连接. 例如, 当你尝试 ping www.baidu.com 时, iptables 会检查输出链中与 ping 和 baidu.com 相关的规则, 然后决定允许还是拒绝你的连接请求.
规则实战:
清空所有规则:
iptables -F
添加 22 端口可以正常连接:
- iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
- iptables -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
设置默认规则:
一般设置默认规则有两种思想: 一种是都接受, 然后重点拒绝; 另一种是都拒绝, 然后重点放行.
- iptables -P INPUT DROP
- iptables -P OUTPUT ACCEPT
- iptables -P FORWARD DROP
开放具体的端口:
- iptables -A INPUT -p tcp -m tcp --dport 3304 -j ACCEPT
- iptables -A OUTPUT -p tcp -m tcp --sport 3304 -j ACCEPT(如果 OUTPUT 默认是 DROP)
- iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
- iptables -A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT (如果 OUTPUT 默认是 DROP, 下面的一样)
支持 ping:
- iptables -A INPUT -p icmp -j ACCEPT
- iptables -A OUTPUT -p icmp -j ACCEPT
禁止 ping
- iptables -A INPUT -p icmp -j REJECT
- iptables -A OUTPUT -p icmp -j REJECT
具体到 IP 地址:
只接受 192.168.1.55 的包:
- iptables -A INPUT -s 192.168.1.55 -p icmp -j ACCEPT (默认是 DROP)
- iptables -A OUTPUT -s 192.168.1.23 -p icmp -j ACCEPT
IPTABLES 规则的相关操作:
iptables -F : 清空规则
iptables -X : 删除用户自定义的规则
iptables -L : 查看规则
iptables -L -n : 以数字的形式显示规则
iptables -L --line-numbers : 查看规则的编号(适用于删除规则)
iptables -D chain num : 删除编号是 NUM 的规则
扩展规则:
多端口:
- iptables -I INPUT -s 192.168.1.0/24 -d 192.168.1.23 -p tcp -m multiport --dport 22,80,3306 -j ACCEPT
- iptables -I OUTPUT -d 192.168.1.0/24 -s 192.168.1.23 -p tcp -m multiport --sport 22,80,3306 -j ACCEPT
iprange 扩展:
- iptables -I OUTPUT -s 192.168.1.23 -p tcp -m multiport --sport 21,22,80 -m iprange --dst-range 192.168.1.10-192.168.1.20 -j ACCEPT
- iptables -I INPUT -d 192.168.1.23 -p tcp -m multiport --dport 21,22,80 -m iprange --src-range 192.168.1.10-192.168.1.20 -j ACCEPT
string 扩展: 检查报文中出现的字符串.
- --algo {
- bm|kmp
- }
- --string patterm
- iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT
time 扩展: 根据报文对时间范围进行匹配.
- --datestart --datestop
- --timestart --timestop
- --monthdays --weekdays
- iptables -I INPUT -d 192.168.1.23 -p tcp --dport 80 -m time --timestart 23:00 --timestop 6:00 -j REJECT
connlimit 扩展: 根据客户端 IP 做并发连接数量匹配
--connlimit-upto n : 连接数量小于 n
--connlimit-above n : 连接数量大于 n
--connlimit-saddr : 源地址转换
--connlimit-daddr : 目标地址转换
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
limit 扩展: 基于收发报文速率做检查
- --limit rate/[second|minute|hour|day]
- --limit-burst number
- iptables -A INPUT -d 192.168.1.23 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 10/minute -j ACCEPT
防止 DOS 攻击:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limite-burst 100 -j ACCEPT
state 扩展: 根据连接跟踪机制检查连接的状态.
查看连接追踪功能所能容纳的最大连接个数:/proc/sys.NET/nf_conntrack_max
查看追踪到的连接:/proc.NET/nf_conntrack
不同协议或者连接类型的时长:/proc/sys.NET/netfilter/..
NEW: 新发出的请求, 连接追踪模板中不存在相关的信息条目, 因此识别为第一次发出来的请求
ESTABLISHED:NEW 状态之后, 连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
RELATED: 相关的连接, 如: FTP 协议命令连接与数理连接之间的关系
INVALIED: 无法识别的连接
- iptables -I INPUT -d 192.168.1.23 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -I OUTPUT -d 192.168.1.23 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
- iptables -I INPUT 2 -d 192.168.1.23 -p tcp -m multiport --dport 22,80 -m state --state NEW -j ACCEPT
问题: 如何开放被动模式的 FTP 服务?
1) 装载 FTP 追踪时专用的模块
modprobe nf_conntrack_ftp
2) 放行请求报文
命令连接: NEW , ESTABLISHED
数据连接: RELATED , ESTABLISHED
- iptables -A INPUT -d local_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A INPUT -d loacl_IP -p tcp -m state --state RELATED,ESTABISHED -j ACCEPT
3) 放行响应报文: ESTABLISHED
iptables -A OUTPUT -s local_IP -p tcp -m state --state ESTABLISHED -j ACCEPT
4)保存及重载规则:
iptables-save> file 保存规则至指定规则
iptables-restore <file 指定文件中重载规则
转发规则:
开启 iptables forward 转发功能
echo 1>/proc/sys.NET/ipv4/ip_forward
nat: SNAT: 只修改请求报文的源地址
DNAT: 只修改请求报文的目标地址 内 --》外 外 --》内
nat 表: PREROUTING(DNAT)-->OUTPUT-->POSTROUTING(SNAT)
将本机的 8080 端口转发至其他主机, 主机 IP:192.168.1.12, 目标主机 IP 和端口: 192.168.1.13:8088, 规则如下:
- iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.13:8088
- iptables -t nat -A POSTROUTNG -p tcp --dport 8088 -j SNAT --to-source 192.168.1.12
来源: https://www.cnblogs.com/dianel/p/10315197.html