我的根本目标是防止攻击者在我的服务器上进行未经授权的传出连接(例如,连接回壳)。
我可以通过使用"ufw“阻塞所有传出通信的端口来实现这一点,除了服务器需要操作的端口(即DNS、HTTP、SSH和SMTP)。
ufw允许我只允许发送DNS连接到静态IP地址(因此我将配置服务器使用Google DNS),并且允许我限制发送SSH的目的地为127.0.0.1 (我的自动部署脚本需要使用Git)。
正如我所了解的,ufw并不真正允许基于域名的传出限制,这是有意义的(从性能角度来看)。我需要这样做才能将传出SMTP连接限制在我的邮件服务器域(目前正在使用Gmail进行测试)和Ubuntu服务器的HTTP连接(用于系统更新)。
我知道iptables允许您根据域指定规则,但它们在启动时被翻译,而不是每次执行(即反向DNS)。我知道这是出于设计,因为性能方面的原因。
那么,通过域名限制传出网络流量的解决方案是什么(也就是说,每个传出连接都需要有它的目标IP地址,反向DNS并与域名白名单相匹配)?
我在想,如果我无法使基于域的一半传出限制有效,那么使用ufw通过IP限制DNS和SSH就没有多大意义了。
然后我意识到,在接收到转发的通信量时,不可能知道最初的目的IP地址是什么。那时,我找到了https://github.com/mitmproxy/mitmproxy,并发现它(作为透明的Python )与iptables接口交互,以确定套接字的初始目标IP地址是什么。
我还没有让它全部发挥作用,但我确信这种方法应该会奏效的。
发布于 2015-01-26 06:14:20
这只能在一台机器上工作,因为它依赖于透明代理能够与iptables接口并获得传出通信量的原始目标IP。
还请注意,此方法有点麻烦,因为为了克服无限循环问题(重定向到代理->重定向到代理-> .),防火墙规则应用于操作系统用户组,这意味着组中的任何用户都不会通过代理转发其传出通信量。
步骤:
iptables进行接口。我使用了mitmproxy (这是基于Python的),并将其设置为作为根服务运行并侦听proxyPort。iptables添加一条规则,以便将所有发送到特定端口(例如http)的传出流量重定向到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,适当地替换proxyGID和proxyPortiptables或ufw配置为允许传出流量到proxyPort,允许任何端口被代理(例如80),默认情况下不允许所有其他端口。https://serverfault.com/questions/662393
复制相似问题