为了解决linux配置Nginx 只能关闭防火墙才能访问的问题

为了解决linux配置Nginx 只能关闭防火墙才能访问的问题

使用Nginx和iptables做访问权限控制(IP和MAC)

   

之前配置的服务器,相当于对整个内网都是公开的,而且,除了可以通过80端口的nginx来间接访问各项服务,也可以绕过nginx,直接ip地址加端口访问对应服务,这是不对的啊,所以我们要做一些限制,因为只是对特定的人提供服务,而且局域网IP和MAC都是固定的,所以可以直接用白名单,其他的全部拒绝

/**************************************使用nginx做访问权限控制*********************************/

先在nginx做设置

在/etc/nginx/conf.d 下面新建ip.conf

在这个目录下的.conf都会被包含进nginx.conf中

假设我们只允许192.168.1.2   192.168.1.3 访问

那内容就是

allow 192.168.1.2; allow 192.168.1.3; deny all;

这样就搞定了

当然nginx还可以做得更好一些,分目录进行控制

ip.conf相当于第一层白名单,也就是全局白名单,在对应的反向代理的conf文件中,同样可以加上白名单

比如对于开放在4567端口的论坛,只想让192.168.1.2访问

那就将原来的配置文件(参考另一篇随笔Ubuntu 14.04下安装Nginx,MediaWiki,NodeBB,Everything,GitLab  http://www.linuxidc.com/Linux/2016-05/131137.htm

server {
    listen 80; server_name www.forum.zqb.local forum.zqb.local; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:4567/;  proxy_redirect off; # Socket.IO Support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

改成

server {
    listen 80; server_name www.forum.zqb.local forum.zqb.local; location / { allow 192.168.1.2; #允许访问 deny all; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:4567/;  proxy_redirect off; # Socket.IO Support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

这样就可以对每个服务分别控制访问权限,而不是一刀切了

注意修改完配置文件后,要重新启动服务

service nginx restart

当然,也可以配置整个网段,也可以配置黑名单,具体自行google或百度语法

/**************************************使用iptables做访问权限控制*********************************/

但是只对IP做限制,还是有点不够,我们还想做的更好一些,比如,针对MAC地址也做限制

这个时候nginx就不行了,要iptables

配置可以一条条写命令,也可以编辑文件后批量写入

先把当前配置写入文件 /etc/iptables.test.rules 中

iptables-save > /etc/iptables.test.rules

然后修改文件  /etc/iptables.test.rules 

修改后写回去 

iptables-restore < /etc/iptables.test.rules

就生效了

假设服务器自己的IP是192.168.1.2,mac地址为aa:bb:cc:dd:ee:ff

想达到以下效果

服务器自己可以随意访问自己的所有端口

其他的机器不允许访问4567端口(也就是不能直接访问开放在4567端口的论坛,必须通过80端口的nginx去间接访问)

可以这么配置

# Generated by iptables-save v1.4.21 on Mon May  2 15:53:51 2016 *filter :INPUT ACCEPT [96:9703] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1531:1424833] -A INPUT -s 192.168.1.2/32 -m mac --mac-source aa:bb:cc:dd:ee:ff -p tcp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 4567 -j REJECT --reject-with icmp-port-unreachable -A INPUT -s 192.168.1.3/32 -m mac --mac-source ab:cd:ef:ab:cd:ef -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Mon May 2 15:53:51 2016

前四行是自动是生成的

第五行表示,对于IP地址为192.168.1.2,mac地址为aa:bb:cc:dd:ee:ff,直接ACCEPT

第六行表示,允许环回通信

第七行表示,禁止访问4567端口

第八行表示,对于IP地址为192.168.1.3,mac地址为ab:cd:ef:ab:cd:ef,允许访问80端口

第九行表示,禁止访问80端口

 

这个规则是按顺序匹配的,匹配到任意一条就结束,否则继续往下匹配

所以对于服务器本身,第五行就匹配了,后面的规则不管,没有任何限制

对于其他机器,第五行匹配不到,第七行就禁止了直接访问4567端口

对于 192.168.1.3,匹配到第八行,所以可以访问80端口

其他机器匹配不到,执行到第九行,就禁止了80端口的访问

 

上面这种配置,只是禁止了几个端口,其他的ssh之类的并没有做限制

有点端口黑名单的感觉,更严格的话也可以做成端口白名单吧,只开放23,80等几个端口,其他的全禁止

 

哦,对了,还要弄成开机自动加载才行

iptables-save > /etc/iptables.up.rules

修改/etc/network/interfaces

在最后加上一行

pre-up iptables-restore < /etc/iptables.up.rules

/***********************************************************************/

综上,先通过iptables,让白名单(IP和MAC必须同时匹配)的机器只能访问80端口,也就是必须通过nginx而不能直接去访问服务

然后nginx再针对服务做进一步的限制

当然每个服务本身也是需要账号密码才能使用的,比如在论坛后台也可以设置注册权限,不过那个就是服务本身提供的了

另,这么做的话会带来一些附加影响,比如gitlab给出的会是

http://192.168.1.2:8081/zhuangqiubin/Books_ceshi.git

但你是无法直接访问8081的,所以要改成

http://www.gitlab.zqb.local/zhuangqiubin/Books_ceshi.git

/***********************************************************************/

不过,其实IP和MAC地址都是可以修改的==

修改IP

sudo ifconfig eth0 192.168.2.1 netmask 255.255.255.0 sudo /etc/init.d/networking restart

修改MAC

ifconfig eth0 down ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx ifconfig eth0 up 

CentOS 7.0关闭默认防火墙启用iptables防火墙  http://www.linuxidc.com/Linux/2015-05/117473.htm

iptables使用范例详解 http://www.linuxidc.com/Linux/2014-03/99159.htm

Linux防火墙iptables详细教程 http://www.linuxidc.com/Linux/2013-07/87045.htm

iptables的备份、恢复及防火墙脚本的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Linux下防火墙iptables用法规则详解 http://www.linuxidc.com/Linux/2012-08/67952.htm

Linux下iptables防火墙设置 http://www.linuxidc.com/Linux/2015-10/123843.htm

 

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-05/131139.htm

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113705.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eplan破解后又出现激活码(注册激活)

    (eplan破解后又出现激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~HCIQ56F36O-eyJsaWNlbnNlSWQiOi…

    2022年4月1日
    654
  • GPS数据格式转换[通俗易懂]

    GPS数据格式转换[通俗易懂]经纬度格式分为三种:度、 度-分、  度-分-秒 1.)ddd.ddddd °【度.度 格式】的十进制小数部分(5位) 2.)ddd°mm.mmm’ 【度分.分 格式】的十进制小数部分(3位) NMEA数据格式为$GPGGA时,得到gps数据为(度分.分)格式 3.) ddd°mm’ss’’ 【度.分.秒 格式】 Goog

    2022年6月16日
    116
  • R语言入门mac——RStudio安装➕R包安装【附安装链接】[通俗易懂]

    R语言入门mac——RStudio安装➕R包安装【附安装链接】[通俗易懂]R语言入门mac——安装【附安装链接】这里写目录标题R语言入门mac——安装【附安装链接】一、总体安装步骤1安装R2下载RStudio二、R包安装一、总体安装步骤1安装RRStudio需要R3.0.1+下载链接:https://cran.rstudio.com/2下载RStudio下载链接:https://rstudio.com/products/rstudio/download/二、R包安装下面展示r包安装代码rm(list=ls())options()$repos

    2022年6月27日
    165
  • 简单的使用protobuf和protostuff「建议收藏」

    简单的使用protobuf和protostuff「建议收藏」在我们的开发过程中,序列化是经常需要处理的问题,比如在做分布式访问数据时,或者是在做redis缓存存储数据时,如果我们涉及的知识面不够广的话,可能会简单的使用JDK的序列化,也即在需要序列化的类上implements Serializable接口去实现序列化,我想说的是这种方式在小系统中尚且可以用一用,如果是并发很大的系统会受到严重影响,这是由于JDK自带的序列化效率很低,不论是时间上还是空间上。

    2022年5月27日
    38
  • 基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)

    基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)  本学期单片机课程要求做课程设计,我选取的课题如下:基于单片机的电子时钟设计,要求:(1)实时显示当前时间;(2)能够对时间进行设置;(3)包括年月日,小时,分钟,秒.(4)整点提醒功能.经过一周的时间已实现上述功能,故在此分享一下;所选用器材单片机最小系统(这就不用细说了吧,这里我选用AT89C51),排阻,四个按钮开关,8位共阴数码管,蜂鸣器;prot……

    2022年6月28日
    28
  • request对象详解

    request对象详解 2018年10月27日15:45:51于易动 申请对象:类型:HttpServletRequest的:请求对象:封装了请求头信息,请求体信息等   .1:特点:类型:HttpServletRequest 2:生命周期:   诞生:客户端浏览器每次发出请求,都会创建一个响应对象。   销毁:服务方法执行完毕就会销毁   .3:请求对象的作用: a:作为域对象…

    2022年6月6日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号