Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 526|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-22 22:01:06 | 显示全部楼层 |阅读模式

    使用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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-25 07:51 , Processed in 0.073512 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表