共计 4140 个字符,预计需要花费 11 分钟才能阅读完成。
之前配置的服务器,相当于对整个内网都是公开的,而且,除了可以通过 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
更多 iptables 相关教程见以下内容:
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