อนุญาตเฉพาะผู้ใช้ท้องถิ่นใน nginx


22

ฉันต้องการ จำกัด การเข้าถึงสำหรับ VHosts บางอย่างเพื่อให้มีเพียง 127.0.0.1 เท่านั้นที่สามารถเข้าถึงได้ ฉันมักใช้สิ่งนี้เพื่อผูก VHost กับ localhost ไม่ใช่ IP ภายนอก:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        ....
    }
}

แต่ฉันสังเกตเห็นว่าบางบทช่วยสอนยังรวมถึงallowคำสั่งที่ชัดเจนสำหรับ localhost และปฏิเสธอย่างอื่นทั้งหมด:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        allow 127.0.0.1;
        deny all;
        ...
    }
}

allow/ denyคำสั่งเหล่านี้จำเป็นจริงๆเมื่อฉันฟังที่ 127.0.0.1 เท่านั้นหรือไม่?


ลองเปลี่ยนบรรทัดอนุญาตเป็น:allow 127.0.0.1/32;
Itai Ganot

คำถามของฉันว่าฉันต้องว่าallowเลยเพราะผมตั้งไปlisten 127.0.0.1
Biggie

คำตอบ:


15

listenสั่งบอกระบบปฏิบัติการบนสิ่งที่ผูกติดต่อเว็บเซิร์ฟเวอร์ของตัวเอง ดังนั้นเมื่อคุณดูnetstat -aหลังจากเริ่ม nginx คุณจะเห็นว่า nginx ฟังเฉพาะพอร์ต 127.0.0.1 IP 80 ซึ่งหมายความว่าไม่สามารถเข้าถึงเซิร์ฟเวอร์ nginx ผ่านอินเทอร์เฟซอื่น

การเชื่อมโยงกับที่อยู่ IP เฉพาะนั้นจะทำงานในระดับที่ต่ำกว่าในเครือข่ายสแต็กจริงกว่าallow/ denyคำสั่งภายในการกำหนดค่า nginx

ซึ่งหมายความว่าคุณไม่จำเป็นต้องแยกallow/ denyสั่งในการกำหนดค่าของคุณกับกรณีการใช้งานของคุณเนื่องจากการเชื่อมต่อจะถูก จำกัด ในเครือข่ายสแต็กที่ต่ำกว่า

หากคุณระบุlisten 80;เท่านั้นและใช้allow/ denydirectives จากนั้น nginx จะส่งรหัสข้อผิดพลาด HTTP ไปยังไคลเอนต์บอกว่าการเข้าถึงถูกปฏิเสธ

ด้วยlisten 127.0.0.1;กรณีนี้เบราว์เซอร์ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้เลยเนื่องจากไม่มีพอร์ต TCP ที่เปิดให้เบราว์เซอร์เชื่อมต่อ


1
โอเคฉันลืมที่จะพูดถึงว่าฉันมี VHosts เพิ่มอีกและบางส่วนก็ไม่ได้ผูกไว้กับ localhost เท่านั้น พวกเขาทั้งหมด (ท้องถิ่นเท่านั้นและไม่ใช่ท้องถิ่น) กำลังทำงานบนอินสแตนซ์ nginx เดียวกัน ดังนั้นnetstatจะแสดงที่อยู่ในท้องถิ่นของ0.0.0.0:80(อินเทอร์เฟซทั้งหมด) ฉันจะยังคงละเว้นdeny/ allowบนเซิร์ฟเวอร์ภายในเครื่องเท่านั้นได้หรือไม่
Biggie

ในกรณีนี้ Nginx จะแสดงเนื้อหาของโฮสต์เสมือนที่ได้รับการกำหนดด้วยlisten 80 default_server;คำสั่งเมื่อลูกค้าถามหา vhost 127.0.0.1:80ที่ถูกผูกไว้เพื่อ หากคุณไม่ได้default_serverกำหนดไว้มันจะแสดงเซิร์ฟเวอร์ที่listen 80;กำหนดไว้
Tero Kilkanen

ตกลงดังนั้นจึงมีความเป็นไปได้ที่ผู้ใช้ที่ไม่ใช่คนท้องถิ่นสามารถเข้าถึง - listen 127.0.0.1เซิร์ฟเวอร์และฉันไม่ต้องการแม้แต่allow/denyในเซิร์ฟเวอร์เหล่านี้?
Biggie

ใช่ไม่มีความเป็นไปได้สำหรับสิ่งนั้น
Tero Kilkanen

คำถามนี้ตอบคำถามต่างจากคำตอบยอดนิยมปัจจุบัน ทำไมถึงไม่ติดอันดับ
Jortstek

16

สมมติว่ารหัสเครือข่ายของคุณคือ192.168.1.0แก้ไขไฟล์ conf ของคุณเช่น:

location / {
  # block one workstation
  deny    192.168.1.1;
  # allow anyone in 192.168.1.0/24
  allow   192.168.1.0/24;
  # drop rest of the world
  deny    all;
}

โปรดแจ้งให้เราทราบว่ามันทำงานอย่างไรสำหรับคุณ

แก้ไข # 1:

ใช่อนุญาตให้สั่งเป็นต้องตามที่วิกิพีเดียเป็นทางการ Nginx ตัวอย่างของพวกเขาคือ:

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}

1
ผมต้องการที่จะ จำกัด การเข้าถึง127.0.0.1;) คำถามของฉันคือว่าฉันต้องการที่allowที่ทุกคนเพราะผมตั้งแล้วจะlisten 127.0.0.1
Biggie

กรุณาตรวจสอบแก้ไข # 1
Itai Ganot

Sry ฉันไม่คิดว่าคุณเข้าใจคำถามของฉัน;) สิ่งที่คุณโพสต์คือสิ่งที่ฉันเขียนไว้ในคำถามข้างต้น แต่นั่นไม่ใช่คำตอบสำหรับคำถามของฉัน
Biggie

1
@Biggie คุณไม่จำเป็นต้อง จำกัด การเข้าถึง 127.0.0.1 มันมีอยู่ในเครื่องโลคอลเท่านั้น
user9517 รองรับ GoFundMonica

สันนิษฐานว่านี่เป็นความจริง แต่มันไม่ได้ตอบคำถามของ OP โดยเฉพาะ! คำตอบที่ยอมรับไม่ได้
Jortstek

4

ฉันต้องการบรรลุฟังก์ชั่นเดียวกัน (อนุญาตเฉพาะผู้ใช้ในท้องถิ่นใน nginx) และฉันคิดว่าฉันสามารถทำสิ่งที่ง่ายเช่นนี้:

server {
    listen 127.0.0.1:80;

    index index.html index.htm index.nginx-debian.html;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /path/to/folder;
    }       

    location / {
        include proxy_params;
    }
}

ไฟล์ปรับแต่งนี้ใช้งานได้ดีสำหรับฉันฉันไม่ได้ใช้allowคำสั่งใด ๆแต่อย่างเดียว127.0.0.1:80และด้วยเหตุนี้ฉันจึงสามารถ จำกัด การเข้าถึง nginx ให้กับผู้ใช้ในท้องถิ่นเท่านั้น!


คำตอบที่ดีและง่ายสำหรับการ จำกัด ผู้ใช้ในท้องถิ่น
new2cpp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.