ตั้งค่า nginx ให้รับ IP จริง จาก client เมื่อเว็บเราอยู่หลัง Cloudflare
Pattanapong Cherthong
Posted on March 11, 2024
เมื่อเราผูกโดเมนกับ dns server ของ cloudflare ซึ่ง cloudflare จะทำหน้าที่เป็นด่านหน้าแทน web server ของเราอีกชั้นนึง ทำหน้าที่เป็น reverse proxy เป็น cdn ช่วยให้เว็บเข้าได้เร็วจากทั่วทุกมุมโลก ทำหน้าที่เป็น web application firewall ป้องกันการโจมตีให้เราได้เบื้องต้น ป้องกันการ ddos ให้เราได้ค่อนข้างดี cloudflare มีให้เรามากขนาดนี้ตั้งแต่แพคเกจฟรี แบบว่าให้ใช้ฟรีซะจนเกรงใจ
เมื่อมี cloudflare มาทำหน้าที่เป็นด่านหน้าให้ web server ของเรา ข้อจำกัดอย่างหนึ่งก็คือ โดยปกติฝั่ง web server จะไม่ได้รับข้อมูล IP ของ client หรือของผู้เข้าชมเว็บไซต์ที่แท้จริงโดยตรง แต่กลายเป็นว่าได้รับ IP ของ cloudflare ซะเองที่กั้นหน้าอยู่ ทำให้การเก็บ access log หรือ audit log ในฝั่ง web server ได้รับข้อมูลไม่ตรงตามความจริง แต่ cloudflare ก็ยังใจดีแปะ Original IP ของ Client มากับ Header ให้เราด้วย
หลายๆคนอาจจะมองข้ามเรื่องการเก็บ access logs แต่ถ้าหากเกิดอะไรขึ้นกับเว็บและข้อมูลสำคัญบน server ยังสามารถสืบหา hacker ได้จาก IP Address ซึ่งก็เคยมีประสบการณ์ในการติดตาม hacker จาก IP Address และส่งข้อมูลให้ตำรวจดำเนินคดีกับ hacker มาแล้ว
และเพื่อสอดคล้องไปกับกฎหมาย PDPA จำเป็นจะต้องมีแบบฟอร์มขอความยินยอม(Consent)ในการเก็บข้อมูลส่วนบุคคลบนเว็บไซต์ด้วย ซึ่งข้อมูลหนึ่งในนั้นก็คือ IP Address
มาเข้าเรื่องการตั้งค่าใน nginx กันครับ
สำหรับ nginx จำเป็นจะต้องใช้โมดูลที่ชื่อว่า ngx_http_realip_module ซึ่งถ้าติดตั้ง nginx ปกติ หรือรัน docker nginx ก็จะมี built in มาให้พร้อมแล้วในตัว เว้นแต่ใครที่เอา source code ของ nginx มา compile เองก็อย่าลืม enable module นี้ด้วย
1.เริ่มจากสร้างไฟล์ config ไว้ที่ /etc/nginx/cloudflare.conf เพิ่มข้อมูลไฟล์ตามด้านล่างนี้
#Cloudflare
# - IPv4
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
# - IPv6
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
ในที่นี้จะเป็นตั้งค่า trusted IPs เพื่อรับ real ip header จาก cloudflare
อัพเดท list ips ของ cloudflare ได้จาก link นี้ https://www.cloudflare.com/ips/
2.แก้ไขไฟล์ /etc/nginx/nginx.conf และเพิ่ม include ให้อยู่ภายใน http{....} block ตามตัวอย่างด้านล่าง
http {
include /etc/nginx/cloudflare.conf;
}
3.แก้ไขเสร็จแล้วก็ให้ restart nginx
sudo systemctl nginx restart
Posted on March 11, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.