post by tommy @ 12 九月, 2006 22:01
所以, 試著修改一下 pure-ftpd 的程式, 在 rhost 欄位上頭, 只記錄 IP 位址就可以.
diff -Nur src.orig/ftpd.h src/ftpd.h
--- src.orig/ftpd.h 2006-02-15 22:05:54.000000000 +0800
+++ src/ftpd.h 2006-09-12 21:48:00.629546818 +0800
@@ -557,6 +557,7 @@
#define STORAGE_PORT6(X) (((struct sockaddr_in6 *) &(X))->sin6_port)
#define STORAGE_SIN_ADDR(X) ((((struct sockaddr_in *) &(X))->sin_addr).s_addr)
#define STORAGE_SIN_ADDR6(X) ((((struct sockaddr_in6 *) &(X))->sin6_addr).s6_addr)
+#define STORAGE_SIN_ADDR_NF(X) (((struct sockaddr_in *) &(X))->sin_addr)
#define STORAGE_SIN_ADDR6_NF(X) (((struct sockaddr_in6 *) &(X))->sin6_addr)
#ifdef HAVE_SS_LEN
diff -Nur src.orig/log_pam.c src/log_pam.c
--- src.orig/log_pam.c 2006-06-12 18:44:25.000000000 +0800
+++ src/log_pam.c 2006-09-12 21:48:12.161475481 +0800
@@ -168,16 +168,19 @@
logfile(LOG_INFO, "PAM_RHOST enabled. Getting the peer address");
switch (STORAGE_FAMILY(*peer)) {
case AF_INET:
- hent = gethostbyaddr(&STORAGE_SIN_ADDR(*peer), sizeof(STORAGE_SIN_ADDR(*peer)), AF_INET);
+ //hent = gethostbyaddr(&STORAGE_SIN_ADDR(*peer), sizeof(STORAGE_SIN_ADDR(*peer)), AF_INET);
+ hent = NULL;
+ host = inet_ntoa(STORAGE_SIN_ADDR_NF(*peer));
break;
case AF_INET6:
+ host = NULL;
hent = gethostbyaddr(&STORAGE_SIN_ADDR6(*peer), sizeof(STORAGE_SIN_ADDR6(*peer)), AF_INET6);
break;
}
if (!hent)
- (void)pam_set_item(pamh, PAM_RHOST, NULL);
+ (void)pam_set_item(pamh, PAM_RHOST, host);
else
(void)pam_set_item(pamh, PAM_RHOST, hent->h_name);
#endif
這個 patch 可以由這兒抓取: http://www.teatime.com.tw/~tommy/mypatch/pureftpd_pam_ip.patch
經由上頭的 patch 處理後, 就可以在 rhost 上頭記錄 IP 了.