这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令 ferm,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
ferm - Linux 的防火墙规则解析器
概要
蕨类 选项 输入文件
商品描述
蕨类 是一个前端 iptables的. 它从结构化的配置文件中读取规则
和电话 iptables的(8) 将它们插入到正在运行的内核中。
蕨类的目标是使防火墙规则易于编写和阅读。 它试图减少
编写规则的繁琐任务,从而使防火墙管理员能够花费
更多的时间用于制定好的规则而不是正确执行规则。
为达到这个, 蕨类 使用简单但功能强大的配置语言,它允许
变量、函数、数组、块。 它还允许您包含其他文件,允许
您可以创建常用结构和函数的库。
蕨类,发音为“firm”,代表“为了轻松制定规则”。
注意
这个手册页做 不会 打算教你防火墙是如何工作的以及如何写好
规则。 关于这个主题已经有足够的文档。
引言
让我们从一个简单的例子开始:
链输入{
proto tcp 接受;
}
这将向预定义的输入链添加规则,匹配并接受所有 tcp
数据包。 好的,让我们让它更复杂:
链(输入输出){
proto (udp tcp) 接受;
}
这将插入 4 个规则,即链输入中的 2 个,链输出中的 2 个,匹配和
接受 udp 和 tcp 数据包。 通常你会输入:
iptables -A 输入 -p tcp -j 接受
iptables -A 输出 -p tcp -j 接受
iptables -A 输入 -p udp -j 接受
iptables -A 输出 -p udp -j 接受
请注意我们需要做的打字少多少? :-)
基本上,这就是它的全部内容,尽管您可以使它变得更加复杂。
要看的东西:
链输入{
政策接受;
daddr 10.0.0.0/8 proto tcp dport ! ftp jump mychain运动:1023 TOS 4 settos 8 mark 2;
daddr 10.0.0.0/8 proto tcp dport ftp REJECT;
}
我的观点是,*你*需要制定好的规则,让它们对你可读并且
其他人,而不是把它弄得一团糟。
如果将生成的防火墙规则放在此处以供参考,将对读者有所帮助。
此外,您可以包含具有更好可读性的嵌套版本。
尝试使用评论来显示您在做什么:
# 此行为内部网络启用透明的 http 代理:
proto tcp 如果 eth0 daddr ! 192.168.0.0/255.255.255.0
dport http 重定向到端口 3128;
以后你会感激的!
链输入{
政策接受;
接口(eth0 ppp0){
# 拒绝 notorius 黑客访问,如果不匹配则返回此处
# 发现恢复正常防火墙
跳坏人;
协议 tcp 跳转 fw_tcp;
协议udp跳转fw_udp;
}
}
嵌套越多,它看起来越好。 确保您指定的顺序是正确的,您
不想这样做:
链向前{
原型! UDP 丢弃;
proto tcp dport ftp 接受;
}
因为第二条规则永远不会匹配。 最好的方法是首先指定是
允许,然后拒绝其他一切。 查看示例以获取更多好的快照。
大多数人做这样的事情:
原型 tcp {
端口(
SSH HTTP FTP
) 接受;
dport 1024:65535 ! 同步接受;
降低;
}
架构 OF A 防火墙 文件
适当的防火墙文件的结构看起来像简化的 C 代码。 只有一点
语法字符用于 ferm- 配置文件。 除了这些特别的
字符,ferm 使用“键”和“值”,将它们视为选项和参数,或作为
变量和值,随便。
使用这些词,您可以定义防火墙的特征。 每个防火墙
包括两件事:首先,查看网络流量是否符合某些条件,以及
第二,如何处理流量。
您可以指定对您正在使用的内核接口程序有效的条件,
大概 iptables的(8). 例如,在 iptables 中,当您尝试匹配 tcp 数据包时,
你会说:
iptables -- 协议 tcp
在 ferm 中,这将变成:
协议tcp;
只是在 ferm 中输入它不会做任何事情,您需要告诉 ferm(实际上,您需要
展示 iptables的(8) 和内核)如何处理符合此条件的任何流量:
iptables --protocol tcp -j 接受
或者,翻译成 蕨类:
协议 tcp 接受;
这个 ; 字符位于每条 ferm 规则的末尾。 Ferm 忽略换行符,这意味着
上面的例子与以下相同:
协议tcp
接受;
以下是特殊字符列表:
; 这个角色最终确定了一个规则。
用分号分隔,您可以在一行中编写多个规则,尽管这
降低可读性:
协议 tcp 接受; 协议UDP DROP;
{} 嵌套符号定义了一个“块”规则。
大括号包含任意数量的嵌套规则。 之前的所有比赛
块被继承到这些。
右花括号结束了规则集。 你不应该写一个';' 后
那,因为那将是一个空洞的规则。
计费示例:
链输入 proto icmp {
icmp-type echo-request ACCEPT;
降低;
}
此块显示块内的两个规则,它们都将与任何内容合并
在它前面,所以你会得到两个规则:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A输入-p icmp -j DROP
可以有多个嵌套级别:
链输入{
原 icmp {
icmp-type echo-request ACCEPT;
降低;
}
爸爸 172.16.0.0/12 拒绝;
}
请注意,'REJECT' 规则不受 'proto icmp' 的影响,尽管没有
';' 在结束大括号之后。 翻译成iptables:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A输入-p icmp -j DROP
iptables -A 输入 -d 172.16.0.0/12 -j 拒绝
$ 变量扩展。 用变量的值替换 '$FOO'。 见章节
变数 了解详情。
& 函数调用。 见章节 职能 了解详情。
() 数组符号。 使用括号,您可以定义值的“列表”
应该申请它左边的钥匙。
计费示例:
协议(tcp udp icmp)
这将导致三个规则:
... -p TCP ...
... -p udp ...
... -p icmp ...
只能“列出”值,因此您不能执行以下操作:
proto tcp(接受日志);
但你可以这样做:
链(输入输出转发)proto(icmp udp tcp)DROP;
(这将导致九个规则!)
值由空格分隔。 数组符号是左和右-
关联的,与仅左关联的嵌套块相反。
" # " 注释符号。 此符号后到行尾的任何内容都是
忽略了。
“`命令`”
在 shell 中执行命令,并插入进程输出。 见章节
反引号 了解详情。
'细绳'
引用一个可能包含空格、美元符号等的字符串。
LOG log-prefix '嘿,这是我的日志前缀!';
“细绳”
引用一个字符串(见上文),但带有美元符号的变量引用是
评价:
DNAT 到 "$myhost:$myport";
关键词
在上一节中,我们已经介绍了一些基本关键字,例如“链”,
“协议”和“接受”。 让我们探索它们的本质。
关键字分为三种:
· ! 关键字定义将在何处创建规则。 示例:“表”、“链”。
· 匹配 关键字对所有通过的数据包进行测试。 目前的规则是没有
如果一场(或多场)比赛未通过,则生效。 例如:“proto”、“daddr”。
大多数匹配项后跟一个参数:“proto tcp”、“daddr 172.16.0.0/12”。
· 目标 关键字说明如何处理数据包。 示例:“接受”、“拒绝”、
“跳”。
一些目标定义了更多的关键字来指定细节:“REJECT reject-with icmp-
网络无法访问”。
每个规则由一个 ! 和 目标, 加上任意数量的 火柴:
表过滤器#位置
proto tcp dport (http https) # 匹配
接受; # 目标
严格来说,还有第四种: 蕨类 关键字(控制 ferm 的内部
行为),但它们将在后面解释。
参数
许多关键字都带有参数。 这些可以指定为文字、变量引用或
列表(数组):
原始udp
悲伤 $TRUSTED_HOSTS;
原始 tcp dport (http https ssh);
LOG 日志前缀“时髦的战争驱动警报:”;
其中一些可以否定(列表不能否定):
原型!esp;
proto udp dport !域;
不带参数的关键字被前缀“!”否定:
协议协议!syn;
阅读 iptables的(8) 看哪里 ! 可以使用。
基础课程 关键词
地址 关键词
域 [IP|IP6]
设置域。 “ip”是默认值,表示“IPv4”(iptables)。 “ip6”用于 IPv6
支持,使用“ip6tables”。
表 [过滤器|nat|mangle]
指定此规则将插入到哪个 netfilter 表:“过滤器”(默认),
“nat”或“mangle”。
链 [链名]
指定此规则将成为的 netfilter 链(在当前表中)
插入到。 常见的预定义链名称有“INPUT”、“OUTPUT”、“FORWARD”、
“PREROUTING”、“POSTROUTING”,取决于表。 查看网络过滤器
有关详细信息的文档。
如果您在此处指定不存在的链,则 ferm 会将规则添加到自定义链中
用那个名字。
政策 [接受|放弃|..]
指定当前链的默认策略(仅限内置)。 可以是其中之一
内置目标 (ACCEPT, DROP, REJECT, ...)。 不匹配任何规则的数据包
链中的内容将按照政策的规定进行处理。
为避免歧义,始终指定所有预定义链的策略
明确地。
@子链 [“链名”] { ... }
像普通的块操作符一样工作(即没有 @子链 关键字),除了
这 蕨类 将花括号内的规则移动到新的自定义链中。 名字
因为这条链是由 ferm 自动选择的。
在许多情况下,这比仅仅一个块要快,因为内核可能会跳过一个
前提条件为假时的巨大规则块。 想象一下下面的例子:
表过滤器链 INPUT {
萨德尔(1.2.3.4 2.3.4.5 3.4.5.6 4.5.6.7 5.6.7.8){
proto tcp dport (http https ssh) 接受;
proto udp dport 域接受;
}
}
这将生成 20 条规则。 当一个没有通过的数据包到达时 萨德尔
匹配,它仍然会检查所有 20 条规则。 和 @子链,这个检查完成
一次,导致更快的网络过滤和更少的 CPU 负载:
表过滤器链 INPUT {
萨德尔 (1.2.3.4 2.3.4.5 3.4.5.6 4.5.6.7 5.6.7.8) @subchain {
proto tcp dport (http https ssh) 接受;
proto udp dport 域接受;
}
}
或者,您可以定义子链的名称:
saddr (1.2.3.4 2.3.4.5 3.4.5.6) @subchain "foobar" {
proto tcp dport (http https ssh) 接受;
proto udp dport 域接受;
}
名称可以是带引号的字符串文字,也可以是扩展的 ferm 表达式
例如@cat("interface_", $iface) 或@substr($var,0,20)。
您可以通过显式声明自定义链来实现相同的效果,但您可能会觉得
使用 @子链 需要更少的打字。
基础版 iptables的 匹配 关键词
接口 [接口名称]
定义接口名称,你的外网卡,比如eth0,或者拨号一样
ppp1 或任何您想匹配以传递数据包的设备。 它是等价的
到“-i”开关 iptables的(8)。
外表 [接口名称]
与接口相同,仅用于匹配数据包的出接口,如
iptables的(8)。
协议 [协议名称|协议编号]
目前内核支持的有tcp、udp和icmp,或者它们各自的
号码。
萨德|爸爸 [地址规范]
匹配源自指定地址 (saddr) 或目标的数据包
地址(daddr)。
例子:
萨德尔 192.168/8 接受; #(与下一个相同:)
萨德尔 192.168.0.0/255.255.255.0 接受;
daddr my.domain.com 接受;
碎片
指定只匹配分片的 IP 数据包。 当数据包
大于系统可以处理的最大数据包大小(称为最大
传输单元或 MTU)它们将被切成比特并作为
单个数据包。 看 使用ifconfig(8) 如果您想为您的系统找到 MTU(
默认值通常为 1500 字节)。
DOS 攻击中经常使用碎片,因为无法找到
找出片段数据包的来源。
运动|dport [端口规格]
匹配指定 TCP 或 UDP 端口上的数据包。 “运动”匹配源
端口,dport 匹配目的端口。
只有在指定“protocol tcp”或“protocol udp”后才能使用此匹配项,
因为实际上只有这两个协议才有端口。
以及一些有效端口/范围的示例:
dport 80 接受;
dport http 接受;
dport ssh:http 接受;
dport 0:1023 接受; # 相当于:1023
dport 1023:65535 接受;
SYN 指定要匹配tcp包中的SYN标志,用于
建立新的 tcp 连接。 您可以使用此识别传入连接,并且
决定是否允许。 没有这个标志的数据包是
可能来自一个已经建立的连接,所以它被认为是合理的
让这些通过是安全的。
模块 [模块名称]
加载一个 iptables 模块。 大多数模块提供更多匹配关键字。 我们会到
那以后。
基础版 目标 关键词
跳 [自定义链名称]
跳转到自定义链。 如果自定义链中没有匹配的规则,则 netfilter 返回
到上一条链中的下一条规则。
真戈托 [自定义链名称]
转到自定义链。 不像 跳 选项, 返回 不会继续处理
在这条链中,而是在通过调用我们的链中 跳.
关键字 真戈托 在过渡期间被选中,因为 转到
(已弃用)曾经是一个别名 跳.
接受 接受匹配的数据包。
下降 丢弃匹配的数据包,恕不另行通知。
拒绝 拒绝匹配的数据包,即向发送方发送一个 ICMP 数据包,即端口
默认无法访问。 您可以指定另一种 ICMP 类型。
拒绝; # 默认为 icmp-port-unreachable
REJECT 拒绝与 icmp-net-unreachable;
输入“iptables -j REJECT -h”了解详情。
返回 完成当前链并返回调用链(如果“跳转
[自定义链名称]”被使用)。
NOP 根本没有任何动作。
附加 关键词
Netfilter 是模块化的。 模块可以提供额外的目标和匹配关键字。 列表
netfilter 模块的数量在不断增长,ferm 试图跟上支持它们的步伐
全部。 本章介绍当前支持的模块。
iptables的 匹配 模块
帐户 定义的网络/网络掩码中所有主机的帐户流量。 这是其中之一
匹配行为类似于目标的模块,即您通常必须使用 NOP
目标。
mod account aname mynetwork aaddr 192.168.1.0/24 ashort NOP;
地址类型
检查地址类型; 源地址或目的地址。
mod addrtype src-type 广播;
mod addrtype dst 类型本地;
输入“iptables -m addrtype -h”了解详情。
ah 检查 AH 数据包中的 SPI 标头。
mod啊ahspi 0x101;
啊啊啊啊啊! 0x200:0x2ff;
IPv6 的附加参数:
mod ah ahlen 32 接受;
mod ah ahlen !32 接受;
mod ahres 接受;
评论 向规则添加最多 256 个字符的注释,但不会产生任何影响。 注意
与 ferm 注释 ('#') 不同,这个注释会出现在 "iptables -L" 中。
mod comment comment “这是我的评论。” 接受;
流程条件
如果 /proc/net/ipt_condition/NAME 中的值是 1(路径是
/proc/net/ip6t_condition/NAME 用于 ip6 域)。
mod条件条件(abc def)接受;
mod条件条件!foo接受;
字节数
按连接(或两个流之一)匹配多少字节或数据包
构成连接)到目前为止已传输,或按平均字节数
包。
mod connbytes connbytes 65536: connbytes-dir 两个 connbytes-mode 字节 ACCEPT;
mod connbytes connbytes !1024:2048 connbytes-dir 回复 connbytes-mode 数据包接受;
有效值 connbytes 目录: 原版的, 一个回复, 都; 对于 connbytes 模式:
包, 字节, 平均包.
连接限制
允许您限制每个服务器的并行 TCP 连接数
客户端 IP 地址(或地址块)。
mod connlimit connlimit-above 4 REJECT;
mod connlimit connlimit-above !4 接受;
mod connlimit connlimit-above 4 connlimit-mask 24 REJECT;
康马克
检查与连接关联的标记字段,由 CONNMARK 目标设置。
mod connmark 标记 64;
mod connmark 标记 6/7;
连接跟踪
检查连接跟踪信息。
mod conntrack ctstate(已建立相关);
mod conntrack ctproto tcp;
mod conntrack ctorigsrc 192.168.0.2;
mod conntrack ctorigdst 1.2.3.0/24;
mod conntrack ctorigsrcport 67;
mod conntrack ctorigdstport 22;
mod conntrack ctreplsrc 2.3.4.5;
mod conntrack ctrepldst ! 3.4.5.6;
mod conntrack ctstatus 保证;
mod conntrack ctexpire 60;
mod conntrack ctexpire 180:240;
输入“iptables -m conntrack -h”了解详情。
数据中心 检查 DCCP(数据报拥塞控制协议)特定属性。 这个
使用“协议 dccp”时会自动加载模块。
proto dccp 运动 1234 dport 2345 接受;
proto dccp dccp 类型(同步确认)接受;
原型 dccp dccp 类型!请求删除;
proto dccp dccp-option 2 接受;
数码管 匹配 TOS 字段中的 6 位 DSCP 字段。
修改 dscp dscp 11;
mod dscp dscp 级 AF41;
ECN 匹配 IPv4 TCP 标头的 ECN 位。
模式 ecn ecn-tcp-cwr;
模式 ecn ecn-tcp-ece;
模式 ecn ecn-ip-ect 2;
输入“iptables -m ecn -h”了解详情。
ESP 检查 ESP 数据包中的 SPI 标头。
模式 esp espspi 0x101;
模式 esp espspi ! 0x200:0x2ff;
eu64 “该模块匹配无状态自动配置 IPv64 地址的 EUI-6 部分。
它将从以太网帧中的源 MAC 地址派生的 EUI-64 与
IPv64 源地址的低 6 位。 但“通用/本地”位不是
比较的。 该模块不匹配其他链路层帧,仅在
PREROUTING、INPUT 和 FORWARD 链。”
模式 eui64 接受;
模糊 “该模块匹配基于模糊逻辑控制器 [FLC] 的速率限制。”
mod 模糊下限 10 上限 20 ACCEPT;
HBH 匹配 Hop-by-Hop Options 标头 (ip6)。
mod hbh hbh-len 8 接受;
mod hbh hbh-len !8 接受;
mod hbh hbh-opts (1:4 2:8) 接受;
hl 匹配跳数限制字段 (ip6)。
mod hl hl-eq (8 10) 接受;
mod hl hl-eq !5 接受;
mod hl hl-gt 15 接受;
mod hl hl-lt 2 接受;
帮手 检查哪个 conntrack helper 模块跟踪此连接。 端口可能是
用“-portnr”指定。
mod helper helper irc 接受;
mod helper helper ftp-21 接受;
国际会议 检查 ICMP 特定属性。 使用时会自动加载此模块
“协议icmp”。
proto icmp icmp-type echo-request ACCEPT;
此选项也可用于 ip6 域,虽然这被称为 icmpv6 in
ip6表.
使用 "iptables -p icmp "-h"" 获取有效 ICMP 类型的列表。
范围 匹配一系列 IPv4 地址。
mod iprange src-范围 192.168.2.0-192.168.3.255;
mod iprange dst-range ! 192.168.6.0-192.168.6.255;
ipv4选项
匹配 IPv4 标头选项,如源路由、记录路由、时间戳和
路由器警报。
mod ipv4options ssrr 接受;
mod ipv4options lsrr 接受;
mod ipv4options no-srr 接受;
mod ipv4options !rr 接受;
mod ipv4options !ts 接受;
mod ipv4options !ra 接受;
mod ipv4options !any-opt 接受;
ipv6头
匹配 IPv6 扩展标头 (ip6)。
mod ipv6header 标头 !(hop frag) ACCEPT;
mod ipv6header 标头(auth dst)接受;
哈希限制
类似于“mod limit”,但增加了添加每个目的地或每个端口的能力
在哈希表中管理的限制。
mod hashlimit hashlimit 10/分钟 hashlimit-burst 30/分钟
hashlimit-mode dstip hashlimit-name foobar 接受;
hashlimit-mode 的可能值:dstip dstport srcip srcport(或带有
不止一种)。
有更多可能的设置,输入“iptables -m hashlimit -h”
文档。
长度 检查包装长度。
mod长度长度128; # 正好 128 个字节
mod长度长度512:768; # 范围
mod长度长度! 256; # 否定
限制 限制数据包速率。
mod限制限制1/秒;
mod limit limit 15/minute limit-burst 10;
输入“iptables -m limit -h”了解详情。
MAC 匹配源 MAC 地址。
mod mac mac-source 01:23:45:67:89;
标记 根据数据包的 netfilter 标记字段匹配数据包。 这可能是一个 32 位整数
在0和4294967295之间。
mod标记标记42;
mh 匹配移动头(域 ip6).
proto mh mh 类型绑定更新接受;
多端口
匹配一组源或目标端口(仅限 UDP 和 TCP)。
mod 多端口源端口(https ftp);
mod 多端口目标端口(mysql 域);
这条规则比“dport”和“sport”有很大的优势:它只生成一个规则
最多 15 个端口,而不是每个端口一个规则。
第XNUMX 匹配每个第 n 个数据包。
每 3 个 mod n 次;
每 5 mod n 个计数器 2;
mod nth start 2 每 3;
mod nth start 5 packet 2 每6;
输入“iptables -m nth -h”了解详情。
OSF 根据发送方的操作系统匹配数据包。
mod osf 流派 Linux;
国防部! 类型 FreeBSD ttl 1 log 1;
输入“iptables -m osf -h”了解详情。
业主 查看数据包创建者的信息,即用户id、组id、进程id、
会话 ID 和命令名称。
模组所有者 uid-owner 0;
mod owner gid-owner 1000;
mod 所有者 pid-owner 5432;
mod 所有者 sid-owner 6543;
mod owner cmd-owner "sendmail";
(“cmd-owner”、“pid-owner”和“sid-owner”需要特殊的内核补丁而不是
包含在 vanilla Linux 内核中)
物理开发 匹配数据包进入或即将离开的物理设备
机器。 这对于桥接接口很有用。
mod physdev physdev-in ppp1;
mod physdev physdev-out eth2;
mod physdev physdev-is-in;
mod physdev physdev-is-out;
mod physdev physdev-is-bridged;
类型 检查链路层数据包类型。
mod pkttype pkt 类型单播;
mod pkttype pkt 类型的大写;
mod pkttype pkt 类型组播;
政策 匹配应用于此数据包的 IPsec 策略。
mod policy dir out pol ipsec ACCEPT;
mod 策略严格 reqid 23 spi 0x10 proto ah ACCEPT;
mod 策略模式隧道隧道-src 192.168.1.2 接受;
mod 策略模式隧道隧道-dst 192.168.2.1 接受;
mod 策略严格下一个要求 24 spi 0x11 ACCEPT;
注意关键字 原 也用作简写版本 协议
(内置匹配模块)。 您可以通过始终使用 long 来解决此冲突
关键词 协议.
PSD 检测 TCP/UDP 端口扫描。
mod psd psd 权重阈值 21 psd 延迟阈值 300
psd-lo-ports-weight 3 psd-hi-ports-weight 1 丢弃;
配额 通过每个数据包递减一个字节计数器来实现网络配额。
mod 配额配额 65536 接受;
随机 匹配所有数据包的随机百分比。
mod随机平均70;
境界 匹配路由领域。 在使用 BGP 的环境中很有用。
mod领域领域3;
最近 临时标记源IP地址。
mod最近设置;
mod 最近 rcheck 秒 60;
mod 最近设置 rsource 名称“badguy”;
mod 最近设置 rdest;
mod最近的rcheck rsource名称“badguy”秒60;
mod 最近更新秒 120 hitcount 3 rttl;
这个 netfilter 模块有一个设计缺陷:虽然它是作为匹配来实现的
模块,它在使用“set”关键字时具有类似目标的行为。
<http://snowman.net/projects/ipt_recent/>
rt 匹配 IPv6 路由标头(仅限 ip6)。
mod rt rt-type 2 rt-len 20 接受;
mod rt rt-type !2 rt-len !20 接受;
mod rt rt-segsleft 2:3 接受;
mod rt rt-segsleft !4:5 接受;
mod rt rt-0-res rt-0-addrs (::1 ::2) rt-0-不严格接受;
SCTP 检查 SCTP(流控制传输协议)特定属性。 这个
使用“protocol sctp”时会自动加载模块。
proto sctp 运动 1234 dport 2345 接受;
proto sctp chunk-types only 数据:接受;
proto sctp chunk-types any (INIT INIT_ACK) ACCEPT;
proto sctp 块类型!所有(心跳)接受;
使用 "iptables -p sctp "-h"" 获取有效块类型的列表。
集 根据一组检查源或目标 IP/端口/MAC。
mod set set badguys src DROP;
看到http://ipset.netfilter.org/>有关更多信息。
州 检查连接跟踪状态。
mod状态状态INVALID DROP;
mod状态状态(ESTABLISHED RELATED)接受;
输入“iptables -m state -h”了解详情。
统计
的继任者 第XNUMX 和 随机,目前在 iptables的(8) 手册页。
mod 统计模式随机概率 0.8 ACCEPT;
mod 统计模式每 5 个数据包第 n 个 0 DROP;
绳子 匹配一个字符串。
mod string string "foo bar" ACCEPT;
mod string algo kmp 从 64 到 128 十六进制字符串“deadbeef”接受;
TCP 检查 TCP 特定属性。 使用时会自动加载此模块
“协议tcp”。
proto tcp 运动 1234;
proto tcp dport 2345;
原始 tcp tcp-flags (SYN ACK) SYN;
proto tcp tcp 标志! (SYN ACK) SYN;
proto tcp tcp-flags ALL(RST ACK);
proto tcp 同步;
proto tcp tcp 选项 2;
proto tcp mss 512;
输入“iptables -p tcp -h”了解详情。
TCPMSS 检查 SYN 或 SYN/ACK 数据包的 TCP MSS 字段。
mod tcpmss mss 123 接受;
mod tcpmss mss 234:567 接受;
次 检查数据包到达的时间是否在给定范围内。
mod时间timestart 12:00;
mod时间timestop 13:30;
mod time days(周一周三周五);
mod 时间日期开始 2005:01:01;
mod 时间日期开始 2005:01:01:23:59:59;
mod 时间 datestop 2005:04:01;
mod time 月日 (30 31);
mod time 工作日(周三周四);
mod 时间 timestart 12:00 UTC;
mod 时间 timestart 12:00 localtz;
输入“iptables -m time -h”了解详情。
咳嗽 匹配指定 TOS 值上的数据包。
mod tos tos 最小化成本接受;
mod tos tos !正常服务接受;
输入“iptables -m tos -h”了解详情。
TTL 匹配 IP 标头中的 ttl(生存时间)字段。
mod ttl ttl-eq 12; # ttl 等于
mod ttl ttl-gt 10; # ttl 大于
mod ttl ttl-lt 16; # ttl 小于
u32 比较来自数据包的原始数据。 您可以在一个 ferm 中指定多个过滤器
列表; 这些没有扩展为多个规则。
mod u32 u32 '6&0xFF=1' 接受;
mod u32 u32 ('27&0x8f=7' '31=0x527c4833') 删除;
肮脏 匹配看似畸形或异常的数据包。 这场比赛没有进一步
参数。
iptables的 目标 模块
ferm 中提供以下附加目标,前提是您在
你的内核:
分类
设置 CBQ 类。
CLASSIFY set-class 3:50;
集群
配置共享特定 IP 和 MAC 地址的简单节点集群。
连接静态分布在节点之间。
CLUSTERIP 新 hashmode sourceip clustermac 00:12:34:45:67:89
总节点数 4 本地节点 2 哈希初始化 12345;
康马克
设置与连接关联的 netfilter 标记值。
CONNMARK 设置标记 42;
CONNMARK 保存标记;
CONNMARK 恢复标记;
CONNMARK 保存标记掩码 0x7fff;
CONNMARK 恢复标记掩码 0x8000;
康赛马克
该模块将安全标记从数据包复制到连接(如果未标记),
并从连接返回到数据包(也仅在未标记的情况下)。 通常用于
与 SECMARK 一起使用,它只在 mangle 表中有效。
CONNSECMARK 保存;
CONNSECMARK 恢复;
DTA 至 [IP 地址|IP 范围|IP 端口范围]
更改数据包的目标地址。
DNAT 到 10.0.0.4;
DNAT 到 10.0.0.4:80;
DNAT 到 10.0.0.4:1024-2048;
DNAT 到 10.0.1.1-10.0.1.20;
ECN 该目标允许有选择地绕过已知的 ECN 黑洞。 它只能
在 mangle 表中使用。
ECN ecn-tcp-删除;
HL 修改 IPv6 Hop Limit 字段(仅限 ip6/mangle)。
HL hl-set 5;
HL hl-dec 2;
HL HL-INC 1;
IPV4OPTS条
从数据包中剥离所有 IP 选项。 该模块不接受任何选项。
IPV4OPTSSTRIP;
登录 在内核日志中记录与此规则匹配的所有数据包。 小心日志
洪水。 注意这是一个“非终止目标”,即规则遍历
继续下一个规则。
LOG 日志级别警告 log-prefix "看这个:";
LOG log-tcp-sequence log-tcp-options;
LOG log-ip-options;
标记 设置数据包的 netfilter 标记字段(32 到
4294967295):
MARK 设置标记 42;
标记集-xmark 7/3;
标记和标记 31;
标记或标记 1;
标记异或标记 12;
MASQUERADE
伪装匹配的数据包。 可选地后跟一个端口或端口范围,用于
iptables。 指定为“123”、“123-456”或“123:456”。 端口范围参数
指定伪装连接应源自哪些本地端口。
化妆舞会;
伪装到端口 1234:2345;
MASQUERADE 到端口 1234:2345 随机;
MIRROR 反转源场和目的场的实验演示目标
在 IP 标头中。
镜子;
网络地图 将整个网络映射到另一个网络 NAT 表。
NETMAP 到 192.168.2.0/24;
无轨电车 对匹配该规则的所有数据包禁用连接跟踪。
proto tcp dport (135:139 445)
网络日志 通过 netlink 记录数据包; 这是继任者 超日志.
NFLOG nflog-group 5 nflog-prefix "看这个:";
NFLOG nflog 范围 256;
NFLOG nflog 阈值 10;
非队列 用户空间排队,需要 nfnetlink_queue 内核支持。
proto tcp dport ftp NFQUEUE 队列编号 20;
队列 用户空间排队,前身 非队列. 所有数据包都进入队列 0。
proto tcp dport ftp 队列;
REDIRECT 到港口 [端口]
透明代理:改变数据包的目的IP到机器
本身。
proto tcp dport http 重定向到端口 3128;
proto tcp dport http 重定向到端口 3128 随机;
SAME 与 SNAT 类似,但一个客户端的所有映射到相同的源 IP
连接。
与 1.2.3.4-1.2.3.7 相同;
与 1.2.3.8-1.2.3.15 点头相同;
与 1.2.3.16-1.2.3.31 随机相同;
安全标志 这用于设置与数据包关联的安全标记值以供使用
SELinux 等安全子系统。 它仅在 mangle 表中有效。
SECMARK selctx "system_u:object_r:httpd_packet_t:s0";
设置 [添加集|删除集] [集名] [旗帜]
将 IP 添加到指定的集合中。 看http://ipset.netfilter.org/>
proto icmp icmp-type echo-request SET add-set badguys src;
SNAT 至 [IP 地址|IP 范围|IP 端口范围]
更改数据包的源地址。
SNAT 到 1.2.3.4;
SNAT 到 1.2.3.4:20000-30000;
SNAT 到 1.2.3.4 随机;
TCPMSS 更改 TCP SYN 数据包的 MSS 值。
TCPMSS 设置-mss 1400;
TCPMSS 钳位-mss-to-pmtu;
服务条款 设置 [值]
将 tcp 包服务类型位设置为此值。 这将被使用
任何流量调度器愿意,主要是你自己的 linux 机器,但也许
更多的。 原始 tos 位被该值消隐和覆盖。
TOS 设置为最大化吞吐量;
服务条款和服务条款 7;
TOS 或-tos 1;
TOS xor-tos 4;
输入“iptables -j TOS -h”了解详情。
TTL 修改 TTL 头域。
TTL TTL-设置 16;
TTL ttl-dec 1; # 减 1
TTL ttl-inc 4; # 增加 4
超日志 将数据包记录到用户空间程序。
ULOG ulog-nlgroup 5 ulog-prefix "看这个:";
ULOG ulog-cprange 256;
ULOG ulog-qthreshold 10;
其他 DOMAINS
从 2.0 版开始, 蕨类 不仅支持 ip 和 ip6,但也 ARP (ARP表)和 eb
(以太网桥接表)。 这些概念类似于 iptables的.
arp表 关键词
源IP, 目的地IP
匹配源或目标 IPv4 地址。 与...一样 萨德尔 和 爸爸 ,在 ip
域。
源-mac, 目的地-mac
匹配源或目标 MAC 地址。
接口, 外表
输入输出接口。
h-长度
数据包的硬件长度。
链 INPUT h-length 64 ACCEPT;
操作码 操作代码,详见 iptables的(8)。
操作码 9 接受;
h型 硬件类型。
h-type 1 接受;
原型
协议类型。
原型 0x800 接受;
重整
关键词 mangle-ip-s, mangle-ip-d, mangle-mac-s, mangle-mac-d, 目标
可用于 ARP 重整。 看 iptables的(8) 详情。
表 关键词
原 匹配创建帧的协议,例如 IPv4 or PPP. 有关列表,请参阅
/etc/以太类型.
接口, 外表
物理输入输出接口。
逻辑输入, 逻辑输出
逻辑桥接接口。
萨德尔, 爸爸
匹配源或目标 MAC 地址。
匹配 模块
支持以下匹配模块:802.3、arp、ip、mark_m、pkttype、stp、
VLAN,日志。
目标 扩展
支持以下目标扩展:arpreply、dnat、mark、redirect、
呸。
请注意,两者之间存在冲突 - 标记 来自 标记_m 匹配模块
和 -j 标记. 由于两者都将使用 ferm 关键字实现 标记我们
决定通过将目标名称写成大写来解决这个问题,就像在另一个
域。 以下示例将标记 1 重写为 2:
标记 1 标记 2;
高级课程 特色
变量
在复杂的防火墙文件中,使用变量是有帮助的,例如给出一个网络
interface 一个有意义的名称。
要设置变量,请编写:
@def $DEV_INTERNET = eth0;
@def $PORTS = (http ftp);
@def $MORE_PORTS = ($PORTS 8080);
在真正的 ferm 代码中,变量的使用与任何其他关键字参数一样:
链输入接口 $DEV_INTERNET proto tcp dport $MORE_PORTS ACCEPT;
注意变量只能用在关键字参数(“192.168.1.1”、“http”)中; 他们
不能包含诸如“proto”或“interface”之类的 ferm 关键字。
变量仅在当前块中有效:
@def $DEV_INTERNET = eth1;
链输入{
原型 tcp {
@def $DEV_INTERNET = ppp0;
接口 $DEV_INTERNET dport http ACCEPT;
}
接口 $DEV_INTERNET DROP;
}
将扩展为:
链输入{
原型 tcp {
接口 ppp0 dport http 接受;
}
接口 eth1 DROP;
}
“def $DEV_INTERNET = ppp0”仅在“proto tcp”块中有效; 父块
仍然知道“设置 $DEV_INTERNET = eth1”。
包含文件是特殊的 - 在包含文件中声明的变量仍然可用
调用块。 当您包含仅声明变量的文件时,这很有用。
自动表 变量
一些变量是由 ferm 内部设置的。 Ferm 脚本可以像其他任何脚本一样使用它们
变量。
$文件名
相对于目录 ferm 的配置文件的名称被启动。
$文件名
配置文件的基本名称。
$目录名
配置文件的目录。
$域 当前域。 之一 ip, ip6, ARP, eb.
$表 当前的 netfilter 表。
$链 当前的 netfilter 链。
$行 当前脚本的行。 它可以像这样使用:
@def &log($msg) = {
LOG 日志前缀 "rule=$msg:$LINE ";
}
.
.
.
&log("日志信息");
功能
函数类似于变量,除了它们可能有参数,并且它们提供
ferm 命令,而不是值。
@def &FOO() = proto (tcp udp) dport 域;
&FOO() 接受;
@def &TCP_TUNNEL($port, $dest) = {
表过滤器链 FORWARD 接口 ppp0 proto tcp dport $port daddr $dest 外表面 eth0 ACCEPT;
表 nat 链 PREROUTING 接口 ppp0 proto tcp dport $port baddr 1.2.3.4 DNAT 到 $dest;
}
&TCP_TUNNEL(http, 192.168.1.33);
&TCP_TUNNEL(ftp, 192.168.1.30);
&TCP_TUNNEL((ssh smtp), 192.168.1.2);
包含块(如“{...}”)的函数调用必须是 ferm 中的最后一个命令
规则,即后面必须跟';'。 这 '&富()' 示例不包含块,因此
您可以在通话后写上“接受”。 为了避免这种情况,您可以重新排列关键字:
@def &IPSEC() = { proto (esp ah); proto udp dport 500; }
链输入接受 &IPSEC();
反引号
使用反引号,您可以使用外部命令的输出:
@def $DNSSERVERS = `grep 名称服务器 / etc / resolv.conf中 | awk '{print $2}'`;
链 INPUT proto tcp saddr $DNSSERVERS ACCEPT;
该命令是用 shell (/ bin / sh的),就像 perl 中的反引号一样。 ferm 确实
在这里不要做任何变量扩展。
然后将输出标记化,并保存为 ferm 列表(数组)。 以“#”开头的行
被忽略; 其他行可能包含任意数量的值,以空格分隔。
包括
这个 @包括 关键字允许您包含外部文件:
@include 'vars.ferm';
文件名是相对于调用文件的,例如当包括 from
/etc/ferm/ferm.conf,上面的语句包括 /etc/ferm/vars.ferm. 变量和
在包含文件中声明的函数在调用文件中仍然可用。
包括 在块内工作:
链输入{
@include 'input.ferm';
}
如果您指定一个目录(带有尾随的“/”),则该目录中的所有文件都是
包括,按字母顺序排序:
@include 'ferm.d/';
带有拖尾管道符号, 蕨类 执行一个 shell 命令并解析它的输出:
@include '/root/generate_ferm_rules.sh $HOSTNAME|'
条件语句
关键字 @如果 引入条件表达式:
@if $条件下降;
一个值被评估为真,就像在 Perl 中一样:零、空列表、空字符串为假,
其他一切都是真的。 真值示例:
(ab); 1; '富'; (0 0)
假值示例:
(); 0; '0'; ''
也有 @别的:
@if $condition DROP; @else 拒绝;
注意前面的分号 @别的.
可以在任何一个之后使用花括号 @如果 or @别的:
@if $条件{
MARK 设置标记 2;
返回;
} @别的 {
MARK 设置标记 3;
}
由于右花括号也完成了命令,因此不需要分号。
没有 @elsif, 使用 @别的 @如果 代替。
计费示例:
@def $have_ipv6 = `test -f /proc/net/ip6_tables_names && echo 1 || 回声`;
@if $have_ipv6 {
域 ip6 {
# ....
}
}
钩
要运行自定义命令,您可以安装钩子:
@hook pre "echo 0 >/proc/sys/net/ipv4/conf/eth0/转发";
@hook post "echo 1 >/proc/sys/net/ipv4/conf/eth0/转发";
@hook 冲洗“回声 0 >/proc/sys/net/ipv4/conf/eth0/转发";
使用 shell 执行指定的命令。 “pre”表示之前运行命令
应用防火墙规则,“post”表示之后运行命令。 “冲洗”挂钩
在 ferm 刷新防火墙规则后运行(选项 --flush)。 你可以安装任何
钩子的数量。
内置 职能
有几个内置函数,您可能会发现它们很有用。
@eq(a,b)
测试两个值是否相等。 例子:
@if @eq($DOMAIN, ip6) 删除;
@ne(a,b)
与@eq 类似,它测试非相等性。
@不(x)
否定一个布尔值。
@resolve((主机名1 主机名2 ...), [类型])
通常,主机名由 iptables 解析。 要让 ferm 解析主机名,请使用
功能@resolve:
saddr @resolve(my.host.foo) proto tcp dport ssh 接受;
saddr @resolve((another.host.foothird.host.foo)) proto tcp dport openvpn ACCEPT;
daddr @resolve(ipv6.google.com, AAAA) proto tcp dport http ACCEPT;
请注意第二行中的双括号:用于创建 ferm 列表的内部对,
和外部对作为函数参数分隔符。
第二个参数是可选的,指定 DNS 记录类型。 默认值为“A”。
小心处理防火墙配置中解析的主机名。 DNS 请求可能会阻止
防火墙配置很长时间,使机器容易受到攻击,否则可能会失败。
@猫(一, b, ...)
将所有参数连接成一个字符串。
@substr(表达式, 抵消, 长度)
从表达式中提取子字符串并返回它。 第一个字符位于偏移量 0 处。如果
OFFSET 是负数,从字符串的末尾开始。
@长度(表达式)
返回 EXPR 值的字符长度。
@basename(路径)
返回给定路径的文件的基本名称 (File::Spec::splitpath)。
@目录名(路径)
返回给定路径的最后一个目录的名称,假设最后一个组件是
文件名 (File::Spec::splitpath)。
@ipfilter(列表)
过滤掉与当前域明显不匹配的IP地址。 那是
用于为 IPv4 和 IPv6 创建通用变量和规则:
@def $TRUSTED_HOSTS = (192.168.0.40 2001:abcd:ef::40);
域(ip ip6)链输入{
saddr @ipfilter($TRUSTED_HOSTS) proto tcp dport ssh 接受;
}
食谱
这个 。/例子/ 目录包含许多可用于开始的 ferm 配置
一个新的防火墙。 此部分包含更多示例、食谱和技巧。
简便 端口 转发
Ferm 函数使日常任务变得简单快捷:
@def &FORWARD_TCP($proto, $port, $dest) = {
表过滤器链 FORWARD 接口 $DEV_WORLD 外表面 $DEV_DMZ daddr $dest proto $proto dport $port ACCEPT;
表 nat 链 PREROUTING 接口 $DEV_WORLD daddr $HOST_STATIC proto $proto dport $port DNAT to $dest;
}
&FORWARD_TCP(tcp, http, 192.168.1.2);
&FORWARD_TCP(tcp, smtp, 192.168.1.3);
&FORWARD_TCP((tcp udp), domain, 192.168.1.4);
远程 蕨类
如果目标机器无法运行 蕨类 出于某种原因(可能是嵌入式设备
没有 Perl),你可以编辑 蕨类 另一台电脑上的配置文件,让 蕨类
在那里生成一个 shell 脚本。
OpenWRT 示例:
ferm --remote --shell mywrt/ferm.conf >mywrt/firewall.user
chmod +x mywrt/firewall.user
scp mywrt/firewall.user mywrt.local.net:/等等/
ssh mywrt.local.net /etc/firewall.user
配置
--noexec 不执行 iptables的(8) 命令,而是跳过。 这样你就可以
解析您的数据,使用 --行 查看输出。
--冲洗 清除防火墙规则并将所有链的策略设置为 ACCEPT。 蕨类
需要一个配置文件来确定哪些域和表是
影响。
--行 显示从规则生成的防火墙行。 他们将被展示
就在它们被执行之前,所以如果你从 iptables的(8)
等等,你可以看到是哪个规则导致了错误。
- 交互的
应用防火墙规则并要求用户确认。 恢复到
如果在 30 秒内没有有效的用户响应,则先前的规则集(请参阅
- 暂停)。 这对于远程防火墙管理很有用:您可以测试
规则而不用害怕把自己锁在外面。
- 暂停 S If - 交互的 使用,如果没有有效的用户响应则回滚
在这个秒数之后。 默认值为 30。
- 帮帮我 显示可用命令行选项的简要列表。
- 版 显示程序的版本号。
- 快速地 启用快速模式:ferm 生成一个 iptables-保存(8) 文件,并安装它
- iptables-恢复(8). 这要快得多,因为 ferm 调用 iptables的(8)
默认情况下,每条规则一次。
默认情况下启用快速模式,因为 蕨类 2.0,弃用此选项。
- 减缓 禁用快速模式,即运行 iptables的(8) 对于每条规则,不要使用
iptables-恢复(8)。
- 贝壳 生成一个 shell 脚本,它调用 iptables-恢复(8) 并打印出来。
暗示 --fast --lines。
--远程 为远程机器生成规则。 暗示 --noexec 和 --行. 可
结合 - 贝壳.
- 领域 {ip|ip6}
仅处理指定的域。 蕨类 如果域是,则输出可能为空
未在输入文件中配置。
--def '$名称=值'
覆盖配置文件中定义的变量。
使用 onworks.net 服务在线使用 ferm
