简介
iptables 是一个通过控制 Linux 内核的 netfilter 模块来管理网络数据包的流动与转送的应用软件,其功能包括不仅仅包括防火墙的控制出入流量,还有端口转发等等。
引用:[http://www.zsythink.net/archives/1199]
https://wangchujiang.com/linux-command/c/iptables.html
iptables -A INPUT -m string –algo kmp –hex-string ‘|deadc0dedeadc0de|’ -j DROPshell 命令
命令选项输入顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> –sport 源端口 <-d 目标IP/目标子网> –dport 目标端口 -j 动作
192.168.1.112
iptables -A INPUT -s 192.168.1.112 -p tcp –dport 22 -j DROP
1 | 清空当前的所有规则和计数 |
使用场景实例
- 场景一
开放 tcp 10-22/80 端口 开放 icmp 其他未被允许的端口禁止访问
存在的问题: 本机无法访问本机; 本机无法访问其他主机
- 场景二
ftp: 默认被动模式(服务器产生随机端口告诉客户端, 客户端主动连接这个端口拉取数据) vsftpd: 使 ftp 支持主动模式(客户端产生随机端口通知服务器, 服务器主动连接这个端口发送数据)
- 场景三
允许外网访问: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
内部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp
- 场景四
nat 转发
- 场景五
防CC攻击
1 | iptables -L -F -A -D # list flush append delete |
match
mark: mark = “0xff”
tcp: dport = “80”
state: state = “RELATED,ESTABLISHED”
原理
4个表:
filter:input, forward, output
nat:prerouting, input, output, postrouting
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output
优先级(由高而低):raw –> mangle –> nat –> filter
5个链:
规则链名包括(也被称为五个钩子函数(hook functions)):
INPUT链 :处理输入数据包。
OUTPUT链 :处理输出数据包。
PORWARD链 :处理转发数据包。
PREROUTING链 :用于目标地址转换(DNAT)。
POSTOUTING链 :用于源地址转换(SNAT)。
iptables的表与链
- Filter表。负责过滤功能,防火墙。
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。 - NAT表。网络地址转换功能(network address translation)
NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包。 - Mangle表。拆解报文,修改,并重新分装。
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING - Raw表。关闭nat表上启动的连接追踪机制
Raw表用于处理异常,它具有2个内建链:
PREROUTING chain
OUTPUT chain
IPTABLES 规则(Rules)
匹配条件+动作 = 规则
- 匹配条件
源地址(Source ip), 目标地址(destination ip)
扩展条件:源端口,目标端口 - 处理动作(target)
牢记以下三点式理解iptables规则的关键:
Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。
目标值(Target Values)
下面是你可以在target里指定的特殊值:
ACCEPT – 允许防火墙接收数据包
DROP – 防火墙丢弃包,不给任何回应信息
LOG:记录到日志中,数据包传递给下一规则
SNAT: 源地址转换,解决内网用户用同一公网地址上网问题
DNAT:目标地址转换
MASQUERADE:是snat的特殊形式,适用于动态、临时会变的ip
REDIRECT :重定向、映射、透明代理。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息
QUEUE – 防火墙将数据包移交到用户空间
RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
命令
语法
iptables(选项)(参数)
选项
1 | -t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。 |
基本参数
参数 | 作用 |
---|---|
-P | 设置默认策略:iptables -P INPUT (DROP |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | num 在规则链的头部加入新规则 |
-D | num 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号”!”表示除这个IP外。 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
–dport | num 匹配目标端口号 |
–sport | num 匹配来源端口号 |
iptables -h
1 | iptables -h |
Commands:
Either long or short options are allowed.
Commands | 简写 | 含义 | 中文 |
---|---|---|---|
–append | -A chain | Append to chain | 在规则链的末尾加入新规则 |
–check | -C chain | Check for the existence of a rule | 检查规则是否存在 |
–delete | -D chain | Delete matching rule from chain | 删除某一条规则 |
–delete | -D chain rulenum | Delete rule rulenum (1 = first) from chain | 删除某一条规则 |
–insert | -I chain [rulenum] | Insert in chain as rulenum (default 1=first) | 在规则链的头部加入新规则 |
–replace | -R chain rulenum | Replace rule rulenum (1 = first) in chain | |
–list | -L [chain [rulenum]] | List the rules in a chain or all chains | 查看规则链 |
–list-rules | -S [chain [rulenum]] | Print the rules in a chain or all chains | |
–flush | -F [chain] | Delete all rules in chain or all chains | 清空规则链 |
–zero | -Z [chain [rulenum]] | Zero counters in chain or all chains | |
–new | -N chain | Create a new user-defined chain | |
–delete-chain | -X [chain] | Delete a user-defined chain | |
–policy | -P chain target | Change policy on chain to target | |
–rename-chain | -E old-chain new-chain | Change chain name, (moving any references) | |
## Options: | |||
Options | 简写 | 含义 | 中文描述 |
- | - | - | - |
[!] –protocol | -p proto | protocol: by number or name, eg. ‘tcp’ | 匹配协议,如tcp,udp,icmp |
[!] –source | -s address[/mask][…] | source specification | 匹配来源地址IP/MASK,加叹号”!”表示除这个IP外 |
[!] –destination | -d address[/mask][…] | destination specification | 匹配目标地址 |
[!] –in-interface | -i input name[+] | network interface name ([+] for wildcard) | 网卡名称 匹配从这块网卡流入的数据 |
[!] –out-interface | -o output name[+] | network interface name (+] | 网卡名称 匹配从这块网卡流出的数据 |
[!] –fragment | -f | match second or further fragments only | |
[!] –version | -V | print package version. | |
–ipv4 | -4 | Nothing (line is ignored by ip6tables-restore) | |
–ipv6 | -6 | Error (line is ignored by iptables-restore) | |
–jump | -j target | target for rule (may load target extension) | |
–goto | -g chain | jump to chain with no return | |
–match | -m match | extended match (may load extension) | 扩展匹配(可以加载扩展) |
–numeric | -n | numeric output of addresses and ports | 地址和端口的数字输出 |
–table | -t table | table to manipulate (default: ‘filter’) | 操作的表,默认为‘filter’ |
–verbose | -v | verbose mode | |
–wait | -w [seconds] | maximum wait to acquire xtables lock | |
–wait-interval | -W [usecs] | wait time to try to acquire | |
–line-numbers | print line numbers when listing | ||
–exact | -x | expand numbers (display exact values) | |
–modprobe=<command> | try to insert modules using this | ||
–set-counters PKTS BYTES | set the counter during insert/append |