我的根目标是能够防止攻击者在我的服务器上进行未经授权的传出连接(例如,用于连接后壳)。
我可以通过使用“ufw”阻止所有输出stream量的端口来实现这一点,除了服务器需要运行的端口(即DNS,HTTP,SSH和SMTP)之外。
ufw允许我只允许传出的DNS连接到一个静态的IP地址(所以我将configuration服务器使用谷歌DNS),它允许我限制发往127.0.0.1(我的自动部署脚本需要这个与Git)的传出SSH。
据我所知,ufw并没有真正允许基于域名的传出限制,从性能的angular度来看这是有道理的。 我需要能够做到这一点,限制传出的SMTP连接到我的邮件服务器的域名(目前只使用Gmailtesting)和HTTP连接到Ubuntu服务器(用于系统更新)。
我知道iptables允许你指定基于域的规则,但是它们在启动时被翻译,而不是每次都执行(即反向DNS)。 我知道这是由devise,出于性能的原因。
那么,通过域名限制传出networkingstream量的解决scheme是什么(即每个传出连接都需要将其目标IP地址反向DNS并与域名白名单进行匹配)呢?
我在想,如果我无法获得基于域的一半外出限制,那么使用ufw通过IP来限制DNS和SSH是没有多大意义的。
然后我意识到,在接收转发的stream量时,无法知道原始目的地IP地址是什么。 那时候我发现https://github.com/mitmproxy/mitmproxy ,发现它(作为一个透明的Python代理)与iptables接口进行交互,以确定套接字的原始目标IP地址是什么。
我还没有得到所有的工作,但我很确定这种方法应该工作。
这只能在一台机器上工作,因为它依赖于透明代理能够与iptables接口并获得传出stream量的原始目的IP。
还要注意,这个方法有点冒险,就是为了克服无限循环问题(redirect到代理 – >redirect到代理 – > …),防火墙规则被应用到操作系统用户组,这意味着任何不在组中的用户都不会通过代理获取他们的传出stream量。
脚步:
iptables进行交互。 我使用mitmproxy (这是基于Python),并将其设置为作为根服务运行,并侦听mitmproxy 。 向iptables添加一条规则,将所有去往特定端口(例如http)的传出stream量redirect到127.0.0.1:proxyPort,如下所示:
iptables -t nat -A OUTPUT -m owner --gid-owner proxyGID -p tcp --dport 80 -j DNAT --to 127.0.0.1:proxyPort ,正确replaceproxyGID和proxyPort
iptables或ufw以允许传出stream量到proxyPort ,允许任何端口被代理(例如80),并且在默认情况下不允许所有其他端口。