C# C DNS服务器重定向

C# C DNS服务器重定向,c#,redirect,dns,C#,Redirect,Dns,我正在尝试从头开始创建自己的dns服务器,它将过滤掉包含成人内容的域,并将用户重定向到包含他们试图加载的url包含成人内容且被阻止的信息的网页 到目前为止还不错,我已经设置了自己的http服务器,我正在用自己的服务器替换黑名单域的Ip地址,以显示错误。我不确定这是否是正确的方法,其他dna服务器是否也这样做 当我尝试使用https设置将域列入黑名单时,出现了问题。在这种情况下,重定向后,浏览器会显示有关不受信任源或类似内容的错误 有没有办法绕过这种情况,或者以其他方式显示我的网页 解决方案: 事

我正在尝试从头开始创建自己的dns服务器,它将过滤掉包含成人内容的域,并将用户重定向到包含他们试图加载的url包含成人内容且被阻止的信息的网页

到目前为止还不错,我已经设置了自己的http服务器,我正在用自己的服务器替换黑名单域的Ip地址,以显示错误。我不确定这是否是正确的方法,其他dna服务器是否也这样做

当我尝试使用https设置将域列入黑名单时,出现了问题。在这种情况下,重定向后,浏览器会显示有关不受信任源或类似内容的错误

有没有办法绕过这种情况,或者以其他方式显示我的网页

解决方案:

事实证明,它不能像我计划的那样使用DNS,因为我无法找出哪个域是客户端绑定到访问的,所以我可以创建假证书。之后,我切换到代理服务器而不是DNS服务器

当客户端尝试连接到我的解决方案的代理服务器时,我使用了TcpListener,第一个请求将是connect,它不会被加密,所以我可以从主机头读取域,并决定是否应该阻止域

如果阻止创建假证书,打开ssl连接这里是一个如何建立ssl连接并返回块页作为响应的示例,否则使用TcpClient连接到真实服务器和隧道数据这两种方式都不进行SslStream,直接读写到NetworkStream

using(SslStream sslStream = new SslStream(context.ClientNetworkStream))
{
    sslStream.AuthenticateAsServer(fakeCert);

    sslStream.Write(blockPageData, 0, blockPageData.Length);
}
另外,如何创建假证书:

public void CreateCertificate(string domain, string path, X509Certificate2 rootCert, string certPassword)
{
    string dirPath = Path.GetDirectoryName(path);

    if (!Directory.Exists(dirPath))
    {
        Directory.CreateDirectory(dirPath);
    }

    SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
    sanBuilder.AddDnsName(domain);

    X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN={domain}");

    using (RSA rsa = RSA.Create(2048))
    {
        CertificateRequest request = new CertificateRequest(distinguishedName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

        request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature, false));


        request.CertificateExtensions.Add(
            new X509EnhancedKeyUsageExtension(
                new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));

        request.CertificateExtensions.Add(sanBuilder.Build());

        //Generates a cert, but does not provide a private key.
        using (X509Certificate2 certificate = request.Create(rootCert, new DateTimeOffset(rootCert.NotBefore), new DateTimeOffset(rootCert.NotAfter), new byte[] { 0, 1, 2, 3 }))
        {
            X509Certificate2 certWithPrivateKey = certificate.CopyWithPrivateKey(rsa);

            byte[] certBuffer = certWithPrivateKey.Export(X509ContentType.Pkcs12, certPassword);

            using (Stream stream = File.Create(path))
            {
                stream.Write(certBuffer, 0, certBuffer.Length);
            }
        }
    }
}          

您将与此进行斗争,因为前提有一个基本缺陷:

您的用户已在其浏览器中键入 您的DNS服务器已将其识别为成人站点,并返回了10.0.0.1的Ip,而不是真正的12.34.56.78 该浏览器已连接到10.0.0.1,正在尝试进行证书交换,并在执行任何其他操作之前获取ask证书,该证书将服务器真正标识为prawnsite.com 您的服务器没有该域的证书,但如果您获得了证书,它可能有证书 如果任何黑客能够攻击一个看起来像你的银行的网站,渗透dns并重定向它,那么某个ISP上的所有人都会被指向这个伪造的网站,并获取他们的详细信息,那么ssl证书就没有什么价值了。这就是你在没有收获部分的情况下想要做的。SSL作为安全性的一个主要思想是,最终用户可以确保他们的计算机真的在与他们想要与之交谈的服务器进行对话,这不仅仅是为了加密数据,这样人们就不会在途中抓取和检查数据

我提到,您可以为列表中的每个站点获得证书;您可能会发现一个服务,该服务会发布用于加密流量但不验证服务器所有者身份的基本ssl证书。在运行中使用google for ssl,看看是否有人这样做。例如,如果用户不期望或不关心扩展验证/绿色地址栏,则基本证书可能适合您。对于EV证书,颁发者确保其颁发的身份,但对于基本证书,您只需获得一个带有域名的证书,并且一旦安装到您的服务器上,证书交换将正常工作,用户的浏览器不会显示任何错误

综上所述,我认为您也可以在每个用户的机器上安装自定义web服务器,并对其进行编码,以便它根据自己已安装的受信任根证书创建和颁发自己的证书,然后将您的色情网站用户发送到localhost。。就像你有发展证书一样


看看Fiddler web调试代理是如何做到中间人的,这样当浏览器和服务器之间的连接是HTTPS时,您就可以用它检查web流量。实际上,浏览器连接到Fiddler,然后Fiddler连接到服务器,所以这是两个连接。将http服务器作为代理服务器运行也可以满足您的需要

您将很难解决这个问题,因为前提有一个基本缺陷:

您的用户已在其浏览器中键入 您的DNS服务器已将其识别为成人站点,并返回了10.0.0.1的Ip,而不是真正的12.34.56.78 该浏览器已连接到10.0.0.1,正在尝试进行证书交换,并在执行任何其他操作之前获取ask证书,该证书将服务器真正标识为prawnsite.com 您的服务器没有该域的证书,但如果您获得了证书,它可能有证书 如果任何黑客能够攻击一个看起来像你的银行的网站,渗透dns并重定向它,那么某个ISP上的所有人都会被指向这个伪造的网站,并获取他们的详细信息,那么ssl证书就没有什么价值了。这就是你在没有收获部分的情况下想要做的。SSL作为安全性的主要思想之一是,最终用户可以 当然,他们的计算机真的在与他们想与之交谈的服务器进行对话,这不仅仅是为了加密数据,这样人们就无法在途中抓取数据并进行检查

我提到,您可以为列表中的每个站点获得证书;您可能会发现一个服务,该服务会发布用于加密流量但不验证服务器所有者身份的基本ssl证书。在运行中使用google for ssl,看看是否有人这样做。例如,如果用户不期望或不关心扩展验证/绿色地址栏,则基本证书可能适合您。对于EV证书,颁发者确保其颁发的身份,但对于基本证书,您只需获得一个带有域名的证书,并且一旦安装到您的服务器上,证书交换将正常工作,用户的浏览器不会显示任何错误

综上所述,我认为您也可以在每个用户的机器上安装自定义web服务器,并对其进行编码,以便它根据自己已安装的受信任根证书创建和颁发自己的证书,然后将您的色情网站用户发送到localhost。。就像你有发展证书一样


看看Fiddler web调试代理是如何做到中间人的,这样当浏览器和服务器之间的连接是HTTPS时,您就可以用它检查web流量。实际上,浏览器连接到Fiddler,然后Fiddler连接到服务器,所以这是两个连接。将http服务器作为代理服务器运行也可以解决您需要的问题

@CaiusJard或可能是HTTPS上的DNS:可能不会…@John everything over http!对于一个不会放松防火墙的系统管理员来说,整个互联网是一个巨大的解决办法:我的投票,基于我在回答中给出的理由,是你保持原样,让那些想要观看色情点击的用户继续——要想通过一条错误消息,这是一项艰巨的工作,而这条错误消息在总体方案中是相当无关紧要的。没有人会登上你的拒绝页面然后离开,杜恩。无法观看mah色情,但至少我不必点击安全警告就无法观看,一些用户将在错误页面阶段被推迟,而不是在服务器上被推迟。服务器说没有阶段,所以。。同一端result@CaiusJard或者可能是HTTPS上的DNS:可能不是…@John everything over HTTP!对于一个不会放松防火墙的系统管理员来说,整个互联网是一个巨大的解决办法:我的投票,基于我在回答中给出的理由,是你保持原样,让那些想要观看色情点击的用户继续——要想通过一条错误消息,这是一项艰巨的工作,而这条错误消息在总体方案中是相当无关紧要的。没有人会登上你的拒绝页面然后离开,杜恩。无法观看mah色情,但至少我不必点击安全警告就无法观看,一些用户将在错误页面阶段被推迟,而不是在服务器上被推迟。服务器说没有阶段,所以。。同样的最终结果威尔,在运行中用谷歌搜索ssl真的很有帮助。过了一段时间,我找到了解决办法。我的第一次尝试是使用HttpListener,在这个设置中它不起作用。我所需要做的就是从TcpListener开始,在SslStream上创建假证书并调用AuthenticateTaserver。这家伙可能会要求网络上的每个人安装自己的自签名CA证书。一些企业产品就是这样绕过这个问题的。查看此链接以获取一个这样做的产品示例:这也是我没有考虑的一个选项-我有点觉得他不会对客户端计算机有太多控制权,但值得留下评论作为对answer@zmaster你甚至可以对你使用的代码和步骤给出一个答案,然后发布在回答您自己的问题时,这可能对未来的用户有用吗?好吧,即时搜索ssl真的很有帮助。过了一段时间,我找到了解决办法。我的第一次尝试是使用HttpListener,在这个设置中它不起作用。我所需要做的就是从TcpListener开始,在SslStream上创建假证书并调用AuthenticateTaserver。这家伙可能会要求网络上的每个人安装自己的自签名CA证书。一些企业产品就是这样绕过这个问题的。查看此链接以获取一个这样做的产品示例:这也是我没有考虑的一个选项-我有点觉得他不会对客户端计算机有太多控制权,但值得留下评论作为对answer@zmaster你甚至可以对你使用的代码和步骤给出一个答案,然后发布回答你自己的问题-它可能对未来的用户有用吗?