专栏首页QB杂货铺使用nginx和iptables做访问权限控制(IP和MAC)

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

那就将原来的配置文件(参考另一篇随笔ubuntu14.04下安装ngnix,mediawiki,nodebb,everything,gitlab

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

本文链接 http://www.cnblogs.com/zqb-all/p/5452668.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shFlags简介

    看到有脚本中使用了shFlags,于是google了一下,发现还是个挺方便的东西。

    zqb_all
  • PathMarker:命令行快速编辑跳转工具(配合git,find等)

    PathMarker提供一种快速通过标号,编辑相关文件,跳转相关目录的方法,提高效率。

    zqb_all
  • cp: 无法创建普通文件 : 文件已存在

    看了下 Makefile,这句非常简单,就是 cp ./xxx ../xxx 而已,本身没什么问题。

    zqb_all
  • 一文打尽 Linux/Windows端口复用实战

    场景:内网渗透中,搭建隧道时,服务器仅允许指定的端口对外开放。利用端口复用可以将3389或22等端口转发到如80端口上,以便外部连接。

    Ms08067安全实验室
  • Springboot之Actuator服务监控

    最近在项目当中,启动了多个微服务项目,想着如何监控启动的项目,然后就找到了Actuator这个东西!!!总结下自己学习到的知识点!!!

    海加尔金鹰
  • Springboot之Actuator服务监控

    最近在项目当中,启动了多个微服务项目,想着如何监控启动的项目,然后就找到了Actuator这个东西!!!总结下自己学习到的知识点!!!

    海加尔金鹰
  • 添加打印机 具有该名称的端口已存在

    林万程
  • Linux查看实时带宽流量情况以及查看端口信息

    Linux中查看网卡流量工具有iptraf、iftop以及nethogs等,iftop可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等。

    十四君
  • 宝塔面板下phpMyadmin曝502错误,无法正常使用

    前几天修改博客界面,由于本地只有很少几篇测试文章,对内容溢出的测试不完全,虽然复制了一堆无用的内容在里面进行测试。今天就想到把服务器上的数据和本地同步一下。

    世纪访客
  • Rainbond 服务间通信,端口别名的巧用

    定义好端口别名后,Rainbond 会为该别名生成两个对外环境变量:端口别名_HOST 和 端口别名_PORT。比如,端口别名是 MYSQL,则对应的环境变量就...

    曾庆国

扫码关注云+社区

领取腾讯云代金券