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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM