NetTrust是一个动态出站防火墙授权程序。它使用DNS作为真相来源来允许/拒绝突发请求
我们的想法是,我们希望只向我们信任的网络或主机授予网络访问权限。受信任的网络和主机在输出Netfilter Hook中被列入白名单,而所有其他网络和主机都被拒绝。
对于列表中的第一项,这被称为DNS黑洞,是一种将网络通信范围缩小到仅受信任域的安全方法。然而,并非所有进程(例如javascript函数)都使用DNS查询。有许多人使用静态IP与外部世界通信。例如,javascript函数可以在渲染期间动态获取主机列表,并将流量转发给它们。在这种情况下,DNS黑洞是无忧无虑的。
防火墙通常允许对所有主机进行出站访问,但将入站访问限制在选定的少数主机上
___________________|直接通信IPv4:x.x.x | | | | |进程|=--------------------------------------------------------------->出站:允许所有入站:很少或已建立|
allow all to public but filter inbound在服务器上运行良好。在那里,我们信任我们运行的服务,并以更严格的方式控制组件
但是,当我们想要在不像服务器那样受限制的主机上,或者在可能做很多事情的主机上(比如个人电脑),过滤并提高安全性时,会发生什么呢。我们经常安装软件包,访问不同的网站,这会让我们面临不同类型的跟踪(遥测等)和风险(恶意应用程序、糟糕的javascript功能向我们无法轻易阻止的主机发送流量)
这里的问题是,很难过滤所有好的主机,因为:
大量的公共IP。IPv4地址的总数对全世界来说可能很小,但在列表中进行筛选确实是巨大的
解决这个问题的一项工作(在某种程度上,因为一切事物都有其弱点)是使用DNS进行流量授权。
DNS授权者是我们非常信任的普通DNS主机。例如,我们配置的本地DNS服务将某些域列入黑名单,或阻止除某些域以外的所有域
使用它们来过滤我们不想要的域(最常见的是,需要一个坏主机列表)
使用它们在只需要的域中进行筛选(最安全,需要更多工作)
通过使用DNS授权程序,我们拥有DNS黑洞+简单的IP过滤的优点。我们所需要的就是阻止所有出站流量,然后只允许DNS在查询中应答的流量
___________________________|查询:示例。com | | | | | |主机进程A |=---------------------------->;|网锈|=------------->;|DNS服务器|
在上图中,查询被发送到NetTrust,然后NetTrust将其转发到知道问题或已配置为转发查询的DNS服务器。
___________________________|查询:示例。com | | | | | | |主机进程A |=---------------------------->;|网锈|<;--------=|中国域名服务器的DNS服务器的服务器服务器的域名服务器的周四周四周四\\124周四周四周四周四周四周四\\\\\\\周四周四周四周四周四周四周四\\\\\\\\\\\\周四周四周四周四周四周四周四\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)Netfilter | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ||
一旦NetTrust收到查询响应,它会检查是否有任何答案(主机已解析)。如果有,它会继续更新防火墙规则(例如nftables),以便允许网络访问已解析的主机。如果没有答案,或者答案为0.0.0.0,则不采取任何行动。在所有情况下,在做出防火墙决定(如果有的话)后,dns回复将被发送回请求者进程。
NetTrust默认情况下不会在授权主机上启用TTL。主机可以获得的最大授权时间是NetTrust运行的时间。一旦NetTrust正常退出,它将清除授权主机。
我们可以在授权主机上启用TTL。通过添加TTL,只要设置了TTL,NetTrust将允许与该主机通信。一旦主机过期且没有任何会话处于活动状态(请参阅下面的Conntrack部分),它将从授权列表中删除,并且希望继续通信以再次通过DNS解析主机的进程将期待它。
所有启用TTL的会话都将根据两条规则进行检查。第一条规则是TTL本身。如果主机未过期,则不会发生任何情况,如果已过期,则将检查conntrack以确保与特定主机的连接未处于活动状态。如果一个元组在src或dst中包含主机,那么TTL将被更新,主机将在下一个到期时再次被检查。如果主机不是任何conntrack连接的一部分,那么主机将从缓存和防火墙中删除';s授权主机集
______________| |获取过期主机| | |缓存|=-------------------------------------->;|TTL Checker | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |是_________|u__________|u|否|是| | | | | | | | | | | | | | | | | | | | | |取消授权连接是否处于活动状态?=------------->;|请继续更换TTL124周四\124周四\124周四\124周四周四周四周四\124周四周四周四\\124周四周四\\\\\124周四\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\124||_________;|
fwd addr是NetTrust将用于解决查询的DNS服务器的地址
信息[2022-02-12T20:40:16+02:00]正在启动UDP DNS服务器组件=";DNS服务器";Stage=InitINFO[2022-02-12T20:40:16+02:00]启动TCP DNS服务器组件=";DNS服务器";阶段=初始信息[2022-02-12T20:40:16+02:00]起始组件=";[UDP]DNSServer";阶段=初始信息[2022-02-12T20:40:16+02:00]起动组件=";[TCP]DNSServer";Stage=Init#稍后某个时间信息[2022-02-12T20:41:02+02:00][Blocked]问题:示例。通用域名格式。组件=防火墙阶段=授权信息[2022-02-12T20:41:02+02:00][未处理]问题:示例。通用域名格式。联邦本地。-这是本地的吗?组件=防火墙阶段=授权信息[2022-02-12T20:41:14+02:00][PTR]问题:247.1.168.192。地址。阿帕。下定决心。联邦地方的Component=Firewall Stage=authorinfo[2022-02-12T20:41:36+02:00][Blocked]问题:api。已删除,但这里有一些域。Component=Firewall Stage=authorinfo[2022-02-12T20:41:37+02:00][Blocked]问题:api。已删除,但这里有一些域。Component=Firewall Stage=authorinfo[2022-02-12T20:41:38+02:00][Blocked]问题:api。已删除,但这里有一些域。Component=Firewall Stage=authorinfo[2022-02-12T20:41:41+02:00][Blocked]问题:api。已删除,但这里有一些域。Component=Firewall Stage=authorinfo[2022-02-12T20:41:49+02:00][Blocked]问题:api。已删除,但这里有一些域。Component=Firewall Stage=Authorizer#一段时间后,我做了一个git pushINFO[2022-02-12T21:19:30+02:00][Authorized]问题:github。通用域名格式。Hosts:[140.82.121.4]Component=Firewall Stage=Authorizer#一段时间后,我做了一个git fetchINFO[2022-02-12T21:41:54+02:00][已经授权]问题:github。通用域名格式。主机:140.82.121.3组件=防火墙阶段=授权人
表ip网络信任{set whitelist{type ipv4_addr elements={127.0.0.11992.168.178.21}}set authorized{type ipv4_addr elements={xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz,xyz.xyz.xyz.xyz.xyz.xyz.xyz.xyz.XY{type filter hook output priority filter;policy drop;ip daddr 127.0.0.0/8计数器数据包563字节48587接受ip daddr 10.0.0.0/8计数器数据包0字节0接受ip daddr 172.16.0.0/12计数器数据包0字节0接受ip daddr 192.168.0.0/16计数器数据包273字节20402接受ip daddr 100.64.0.0/10计数器数据包0字节0 accept ip daddr@whitelist accept ip daddr@authorized accept counter数据包23字节2637拒绝icmp类型net unreachable}
使用/bin/nettrust:-authorized ttl int在nettrust过期之前,授权主机将处于活动状态的秒数,并期望再次进行DNS查询(-1 don't expire)-配置字符串路径到配置。json-不刷新授权主机在退出时不清理授权主机列表。与请勿冲洗台面一起使用,以保持网锈台面在出口处的状态-请勿冲洗台面存在网锈时请勿清理台面。如果要在NetTrust退出后继续拒绝通信,请使用此标志-防火墙类型字符串NetTrust防火墙类型(目前仅支持nftables)-fwd addr字符串NetTrust转发dns地址-fwd协议字符串NetTrust dns转发协议-fwd tls启用点。这要求转发dns地址支持点,而fwd协议是tcp-fwd tls证书字符串路径,用于验证转发dns主机名。如果未设置此选项,则将使用主机根CA-侦听地址字符串NetTrust侦听dns地址-侦听证书字符串路径到将由TCP dns服务用于服务DoT的证书-侦听证书密钥字符串路径到将由TCP dns服务用于服务DoT的私钥-侦听tls启用tls侦听器,tls listener仅适用于TCP DNS服务,UDP将继续以明文模式提供服务-ttl check ticker int NetTrust应多久检查一次缓存中过期的授权主机(检查是阻塞的,不要输入小数字)-白名单环回网络空间127.0.0.0/8将被白名单(默认为真)-白名单专用,如果为10.0.0.0/8172.16.0.0/16192.168.0/16,100.64.0.0/10将被列入白名单(默认为true)
{";白名单";:{";网络";:[],";主机";:[],";黑名单";:{";网络";:[],";主机";:[],";fwdAddr";:"192.168.178.21:53 ", // 本地dns服务器地址示例";fwdProto";:"udp""fwdCaCert";:" ", "fwdTLS";:假";listenAddr";:"127.0.0.1:53 ", "firewallType";:"NF表""whitelistLoEnabled";:没错";whitelistPrivateEnabled";:没错";ttl";:-1, "ttlInterval";:30, "不要冲桌子";:false,//如果您想在NetTrust停止时遵守规则和链,请将其设置为true";不要乱穿衣服";:错}
注意:配置文件选项的优先级低于标志选项。例如,如果用-fwd tls启动NetTrust,并在配置中设置fwdTLS:false,NetTrust将使用tls,因为标志具有最高优先级
注意:可以想象,如果此选项设置为true,您将无法访问任何不属于白名单选项的主机(主机、网络)。如果您启用了此选项,并且希望恢复,只需再次启动NetTrust并将此选项设置为false,然后退出即可
如果你想保留这张桌子';退出NetTrust上的内容,然后通过以下两种方式之一传递-不通过标志刷新表或通过配置传递doNotFlushTable:true。NetTrust on exit将仅清除授权集,即通过已解析主机填充的集。
注:白名单、黑名单应通过DNS代理自动完成。如果要添加自定义条目,则应使用此选项
注:在NetTrust管理的链中,首先评估网络(有关更多信息,请参阅本自述文件末尾的NFTables概述部分)
注:目前尚不支持通过env将其列入黑名单。选中下一节中的配置部分以添加黑名单
{";白名单";:{";网络";:[],";主机";:[],";黑名单";:{";网络";:[],";主机";:[]}
黑名单指示NetTrust跳过与主机列表匹配或属于网络的主机。跳绳从本质上来说是最黑的,因为链子';公司的跟踪政策是拒绝和连锁';s的默认策略是drop
NetTrust创建了一个名为net trust的表和一个名为authorized的链。在链内部,它还创建了两个集合
白名单:在NetTrust初始化期间由白名单主机填充。在NetTrust的生命周期内(或除非新主机被列入白名单),此集合应保持静态
授权:此集合用于添加授权主机。如果TTL设置为-1,则该设置只应在NetTrust的生存期内增长,并在退出时清空(我们清空以确保不会忘记后面的白名单主机)
填充表和链的示例。这里127.0.0.1和192.168.178.21是冗余的,因为我们将包含它们的网络列入了白名单,但添加它们是因为127.0.0.1是NetTrust dns代理的侦听地址,192.168.178.21是本地dns黑洞的IP。我们始终将监听地址和转发地址列为白名单,以确保NetTrust在以-whitelist private=false开头的情况下不会出现问题
表ip网络信任{set白名单{type ipv4_addr elements={127.0.0.11992.168.178.21}}set authorized{type ipv4_addr}chain authorized output{type filter hook output priority filter;policy drop;ip daddr 127.0.0.0/8计数器数据包2389字节469802接受ip daddr 10.0.0.0/8计数器数据包0字节0接受ip daddr 172.16.0.0/12计数器数据包0字节0接受ip daddr 192.168.0.0/16计数器数据包807字节66255接受ip daddr 100.64.0.0/10计数器数据包0字节0accept ip daddr@whitelist accept ip daddr@authorized accept counter数据包14字节1370拒绝icmp类型net unreachable}
正如您可能已经注意到的那样,该链或任何集合中都没有黑名单条目。这是因为NetTrust使用除防火墙之外的所有拒绝实现。黑名单是所有未经DNS授权解析的主机,以及通过配置文件或env VAR手动添加的主机。黑名单是在DNS代理处理程序中进行的,在那里我们检查DNS机构返回的任何结果,如果它们符合黑名单规则,则跳过它们
如果您需要手动删除NetTrust规则和链条,请遵循本节
表ip网络信任{#句柄5集白名单{#句柄7型ipv4_地址元素={127.0.0.1192.168.178.21}集授权{#句柄9型ipv4_地址元素={140.82.121.4}链授权输出{#handle 129类型筛选器挂钩输出优先级筛选器;策略丢弃;ip daddr 127.0.0/8计数器数据包2174字节196333接受#handle 130 ip daddr 10.0.0.0/8计数器数据包0字节0接受#handle 131 ip daddr 172.16.0.0/12计数器数据包0字节0接受#handle 132 ip daddr 192.168.0.0/16计数器数据包105字节8793接受#处理133 ip daddr 100.64.0.0/10计数器数据包0字节0接受#处理134 ip daddr@whitelist accept#处理135 ip daddr@authorized accept#处理136计数器数据包90字节8380拒绝icmp类型net Unreable#处理137}
例如,要删除规则ip daddr 100.64.0.0/10计数器数据包0字节0接受#句柄134,请发出