Hướng dẫn cấu hình nhận Real-IP từ người dùng truy cập vào trang web thông qua Nginx

Tác giả: 01/06/2022

Ở bài viết này mình sẽ hướng dẫn các bạn cách cấu hình nhận Real-IP từ người dùng truy cập vào trang web. Để có thể có đầy đủ thông tin khi ta cấu hình thu thập log và có thể phục vụ cho những việc khác ví dụ như forensic ..

1. Kiểm tra lại file cấu hình site trên Nginx

Trước tiên ta kiểm tra lại file config site đã cấu hình ở bài trước để có thể chắc chắn rằng ta đã cấu hình đúng.

cat /etc/nginx/conf.d/wordpress.hungnv99.com.conf

Dưới đây là file của mình khi đã cấu hình site và bao gồm cấu hình ssl cho site.

server {
    server_name wordpress.hungnv99.com;

        location / {
            proxy_set_header   X-Real-IP             $remote_addr;
            proxy_set_header   X-Forwarded-For       $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_pass http://10.10.34.162;
        }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/wordpress.hungnv99.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/wordpress.hungnv99.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = wordpress.hungnv99.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name wordpress.hungnv99.com;
    listen 80;
    return 404; # managed by Certbot
}

Tuy nhiên, chúng ta chỉ cần quan tâm đến những nội dung như sau, hoặc các bạn không cấu hình ssl có thể sử dụng nội dung như sau trong site config site.

server {
    server_name wordpress.hungnv99.com;

        location / {
            proxy_set_header   X-Real-IP             $remote_addr;
            proxy_set_header   X-Forwarded-For       $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_pass http://10.10.34.162;
        }
}

Tại đây ta chỉ quan tâm phần location chắc chắn đã được cấu hình đúng như trên.

2. Cấu hình log_config_module tại máy chủ WordPress

Trước khi thực hiện sửa file, ta cần copy lại file để tránh trường hợp xảy ra lỗi.

cp  /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bk 

Tại máy chủ wordpress, ta tiến hành vào file /etc/httpd/conf/httpd.conf và di chuyển đến dòng chứa thẻ <IfModule log_config_module> . Tiến hành xóa thẻ và thêm lại thẻ với nội dung như sau:

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
    SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
    CustomLog "logs/access_log" combined env=!forwarded
    CustomLog "logs/access_log" proxy env=forwarded

    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
</IfModule>

Lưu lại nội dung đã thêm và khởi động lại dịch vụ http

systemctl restart httpd 

Tiếp theo, ta kiểm tra lại log trên máy chủ chạy wordpress xem đã thành công hay chưa như sau:

  • Sử dụng lệnh tailf theo dõi tệp theo thời gian thực để xem các dòng mới được ghi vào file /var/log/httpd/access_log.
  • Đứng trên 1 máy nào đó thực hiện hành động curl đến domain của trang web (máy thực hiện hành động curl của mình có IP public là 14.229.134.237).

Tại đây, sau khi bắt log tại máy chủ chạy wordpress ta thấy rằng IP header của log http đã hiển thị đúng với IP public của máy thực hiện curl đến trang web.

Như vậy mình đã hướng dẫn xong các bạn cách để nhận Real-IP từ người dùng khi truy cập web thông qua Nginx proxy. Hãy vào lại file log tại máy chủ wordpress để kiểm tra sự thay đổi.

Chúc các bạn thành công !

Trả lời