<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络安全 on Lishengxie</title><link>https://lishengxie.top/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/</link><description>Recent content in 网络安全 on Lishengxie</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 11 May 2024 21:48:52 +0800</lastBuildDate><atom:link href="https://lishengxie.top/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>Nginx禁止使用IP直接访问服务器上相应端口</title><link>https://lishengxie.top/post/nginx-prohibit-ip-request/</link><pubDate>Sat, 11 May 2024 21:48:52 +0800</pubDate><guid>https://lishengxie.top/post/nginx-prohibit-ip-request/</guid><description>&lt;h2 id="起因"&gt;起因&lt;/h2&gt;&#10;&lt;p&gt;我的服务器中部署了一个typecho博客和两个使用docker容器的服务，其中docker容器使用端口映射，将容器中的端口映射到宿主机上的端口实现访问。&lt;/p&gt;&#10;&lt;p&gt;一次偶然机会发现服务器上的服务可以通过IP+端口的方式直接访问，如果有未备案的域名解析到我们服务器的IP，可能会导致云服务器厂商关停我们的服务造成一些问题。因此，我们需要禁止通过IP+端口直接访问服务。&lt;/p&gt;&#10;&lt;h2 id="nginx-配置"&gt;Nginx 配置&lt;/h2&gt;&#10;&lt;p&gt;这里的三个服务通过nginx进行转发，对不同&lt;code&gt;server_name&lt;/code&gt;的请求会直接转发到对应的服务进程。因此，这里有限考虑使用nginx配置来禁止IP+端口的访问。服务器上主要开放了两个端口，80和443，分别用于HTTP和HTTPS请求，在实际进行相应配置时二者也有所不同。&lt;/p&gt;&#10;&lt;h3 id="80-端口"&gt;80 端口&lt;/h3&gt;&#10;&lt;p&gt;对于80端口，我们在&lt;code&gt;nginx.conf&lt;/code&gt;中添加如下配置。具体原理在于，当根据listen无法得到最佳匹配时，nginx会使用请求中的Host值匹配server_name，匹配顺序可以参考这篇&lt;a href="https://zhuanlan.zhihu.com/p/109509478"&gt;博客&lt;/a&gt;。IP+端口进行请求时匹配到下面的server配置，直接返回403错误信息。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;server&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;listen&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;80&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;default_server;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;server_name&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;_;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;return&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;403;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="443端口"&gt;443端口&lt;/h3&gt;&#10;&lt;p&gt;由于使用了HTTPS协议，因此还需要禁止通过IP+443端口的访问方式。具体参考了下面的博客：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.huixiangdou.cn/archives/nginx-jin-zhi-80-443-duan-kou"&gt;https://www.huixiangdou.cn/archives/nginx-jin-zhi-80-443-duan-kou&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;具体来说，Nginx 上对于 SSL 服务器在不配置证书的时候会出现协议错误，哪怕端口上配置了其他网站也会报错。因此，我们需要随便生成一个证书进行配置，生成 SSL 证书可以使用这个网站&lt;a href="https://myssl.com/create_test_cert.html"&gt;https://myssl.com/create_test_cert.html&lt;/a&gt;。在&lt;code&gt;nginx.conf&lt;/code&gt;中添加如下配置：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;server&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;listen&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;80&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;default;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;listen&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;443&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;default_server;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;#SSL-START&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;SSL相关配置，请勿删除或修改下一行带注释的404规则&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;#error_page&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;404/404.html;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_certificate&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/path/to/cert.pem;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_certificate_key&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/path/to/private.key;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_protocols&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;TLSv1&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;TLSv1.1&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;TLSv1.2;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_ciphers&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;on;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_session_cache&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;shared:SSL:10m;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;ssl_session_timeout&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;10m;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;error_page&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;497&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;https:&lt;/span&gt;&lt;span style="color:#75715e"&gt;//$host$request_uri;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;#SSL-END&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;server_name&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;_;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;return&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;403;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置完成后重载 Nginx 配置。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nginx -t&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nginx -s reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker容器问题"&gt;Docker容器问题&lt;/h2&gt;&#10;&lt;p&gt;Docker容器通过端口映射实现服务的对外可用性，这里是通过&lt;code&gt;-p host_port:container_port&lt;/code&gt;实现容器上的端口到宿主机上端口的映射。具体来说，以容器的80端口映射到宿主机的8080端口为例，docker容器运行时使用了&lt;code&gt;-p 8080:80&lt;/code&gt;，Nginx中监听了80端口，并在对应域名访问时将请求转发到服务器的8080端口。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://host_ip:8080&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是，在根据上面的配置禁止了直接使用IP+80/443端口访问的方式后，发现&lt;code&gt;host_ip:8080&lt;/code&gt;仍然能够访问到docker容器中的服务。查询相关资料修改了iptables路由表和sfw防火墙规则后，仍然无法解决问题。防火墙上没有打开端口，但仍然可以访问。最后通过查找资料发现是docker自身的原因，下面是docker官方的介绍：&lt;/p&gt;</description></item></channel></rss>