一個系統工程師常常會需要用到 myip 來驗證自己的對外IP,這個動作平常不用,但有需要的時候就會變得很頻繁使用
但是常常遇到常用的 myip 網站無法使用或者是在沒有外網的環境下使用,這時候不如就自己架一個 myip 網站
myip 實際上的運用很廣,又非常簡單,只要使用 php + curl 就可以達到 Server / Client 的功能!
*** 2016/07/23 更新:由於本篇採用的是 client header 去判斷使用者的 IP,若是要作為記錄操作資訊的話切勿使用這種方式,因為 client header 是可以輕易遭到竄改,正確的作法;如何正確的取得使用者 IP?,提到將可能的 header 存入資料庫並且先行過濾篩選或者使用 Prepared Statement 儲存。
「任何從客戶端取得的資料都是不可信任的!」
參考的 HTTP Header(依照可能存放真實 IP 的順序)
- HTTP_CLIENT_IP
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_X_CLUSTER_CLIENT_IP
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- REMOTE_ADDR (真實 IP 或是 Proxy IP)
- HTTP_VIA (參考經過的 Proxy)
MyIP Server 架設
在這邊使用 nginx 當作 WebServer 當範例
Step.1 安裝套件,設定 nginx 允許 php 執行。
$ yum install nginx php php-fpm $ vim /etc/nginx/conf.d/myip.conf server { listen 80; server_name my.shazi.info; root /usr/local/nginx/html; access_log /var/log/nginx/myip_access.log; error_log /var/log/nginx/myip_error.log; index index.php index.html index.htm; location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-myip.socket; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
Step.2 設定 php-fpm
$ vim /etc/php-fpm.d/myip.conf [php-my] listen = /var/run/php-fpm/php-myip.socket listen.allowed_clients = 127.0.0.1 user = nginx group = nginx pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 slowlog = /var/log/php-fpm/www-slow.log php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on $ chown -R nginx.nginx /var/lib/php/session
Step.3 建立 index.php 抓取 client IP
$ vim /usr/share/nginx/html/index.php <?php if(!empty($_SERVER['HTTP_CLIENT_IP'])){ $myip = $_SERVER['HTTP_CLIENT_IP']; }else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $myip = $_SERVER['HTTP_X_FORWARDED_FOR']; }else{ $myip= $_SERVER['REMOTE_ADDR']; } echo $myip; ?>
主要是抓 client header 把任何可能為 client IP 都放進來檢查。
啟動服務並測試
$ service php-fpm start $ service nginx start $ curl http://my.shazi.info 192.168.121.99
搞定!
就如同上面 client 端只要 curl 指定網址就可以抓到 IP,你也可以寫成 script
$ vim myip.sh #!/bin/bash echo -e "My IP :" & curl http://my.shazi.info echo "" $ chmod 755 myip.sh
執行效果
$ ./myip.sh My IP : 192.168.121.99