Fun-FreeBSD 回復于:2003-04-05 18:32:03 |
好啊,可惜我沒在公司,周一到公司試一下~ |
peng 回復于:2003-04-06 21:22:10 |
gadfly真強??!
看來做研發的就是厲害啊。 好文章。 |
gadfly 回復于:2003-04-07 00:40:49 |
暈,這上面的patch中,每行前面的空格都不顯示出來,復制下來肯定沒法用.
本站的ftp服務也關了. 如果手工復制下來,需要在每行沒有@或+開頭的代碼行前面加個空格, 就可以使用了. 如果覺得麻煩,可以給我發信,我把patch發給你們. gadfly@163.com 最好能有個上載的地方 :-( |
gadfly 回復于:2003-04-07 00:42:59 |
peng老大過獎了,都在技術的苦海中苦苦掙扎. 兄弟們得攜手共進才是.
說不定還有不少問題呢 |
gadfly 回復于:2003-04-07 11:43:57 |
由于,有網友給我發信提了一些問題,我想還是到這里說比較方便。
其實下面的問題,在我上面都說明了。沒辦法,我還是重點說一下 FAQ: 1. patch是基于哪一個auth的? auth smtp有兩個patch, 分別在:http://members.elysium.pl/brush/qmail-smtpd-auth/ 和www.nimh.org/hacks/qmail-smtpd.c。 基于的是后者。 如果你們auth smtp用的是前者,我提供的patch就不能直接使用。 等我有時間,在寫一個基于前者的patch吧。 2. patch執行后的結果是什么? 暈,剛發現,www.nimh.org/hacks/qmail-smtpd.c又更新了,做的糟糕,沒有版本信息,我還不知道我針對的哪一個版本。下次我也要加上版本信息了。 現在只好說: iceblood版本: 正常執行成功的話,沒有任何輸出。 最新版本(nimh.org主頁上的):輸出入下: [quote:de306b6c4e] Hunk #1 succeeded at 252 (offset -52 lines). Hunk #2 succeeded at 498 (offset -33 lines). Hunk #3 succeeded at 633 (offset -58 lines). [/quote:de306b6c4e] 但是還好,編譯出來的可以正常使用。 3.編譯出來的大小沒有區別? 這個和系統環境相關,不是絕對的。只要前兩個沒問題,你就看測試結果吧。 4.網頁上的patch不好用? 是的,因為格式的原因,手工復制下來,需要在每行沒有@或+開頭的代碼行前面加個空格, 就可以使用了. 如果覺得麻煩,可以給我發信,我把patch發給你們. gadfly@163.com 最好能有個上載的地方 |
netloafer 回復于:2003-04-07 12:13:31 |
gadfly真是強呀~~
有關資料可以上傳到linux版的FTP服務器上~~~~ |
gadfly 回復于:2003-04-07 12:23:03 |
[quote:cf2cc80f45="netloafer"]
gadfly真是強呀~~ 有關資料可以上傳到linux版的FTP服務器上~~~~ [/quote:cf2cc80f45] 呵呵,過獎了。 ftpserver我昨天試過了,還是沒有開。 聽說因為受攻擊,還影響了電信的其他業務,現在已經關閉了。只有另尋他途。 |
夜未眠 回復于:2003-04-28 19:41:16 |
針對http://members.elysium.pl/brush/qmail-smtpd-auth/認證補丁再加上樓主所說的功能.
[ 非patch ] 首先你要打補丁,然后照下面的方法修改qmail-smtpd.c源代碼. 1.增加全局變量: stralloc authusername={0}; //全局變量用于記錄認證的email地址 2.在認證成功后將mailfrom存入上面的authusername中,也就是在函數 int authenticate(void)最后return 0;語句前插入下面的語句 /*將用戶名存入全局變量 authusername*/ if(!stralloc_copy(&authusername,&user)) return 1; 3.在void smtp_rcpt(arg)函數的if (relayclient) {語句后插入下面的語句. if(case_diffs(authusername.s,mailfrom.s)) { err_noauth(); //認證用戶名與mailfrom中的地址不符 /*在這兒加入log代碼*/ return; //出錯返回 } =========================================================== 一個問題:也不知道我想的對不對,在此提出與各位討論. 但是我覺得你的patch和我上面的方法好象都有一個問題.就是如果遠程連接到服務器25號端口,不通過認證。一樣可以向control/rcpthosts中列出的地址發郵件(就象是別的MTA與你對話一樣,別人的MTA不可能知道你的用戶名和密碼)因為不通過認證那么relayclient將會是null,那么就會進行rcpthosts的比較,如果rcpt 指定的email地址在rcpthosts中列出,qmail會接收并轉發該郵件,如果一個快速請求對一個慢速服務器,那是什么情況? 有人想把用戶名與mailfrom地址比較的操作放在if(relayclient)這前,前面我說了,別人的MTA不會知道你的用戶名及密碼。如果你這樣作了,你將收不到郵件。 我想就一臺服務器再打補丁也是白打??梢杂脙膳_服務器比較安全,分別打不同的補丁<也就是在前面提到的if(relayclient)處>,一臺專收,一臺專發。兩臺之間進行通信。這樣可能才能比較安全. 不知道各位大蝦有什么看法。不仿在此討論討論.. |
tutux 回復于:2003-04-28 21:04:37 |
[quote:3284d68729="夜未眠"] ]
首先你要打補丁,然后照下面的方法修改qmail-smtpd.c源代碼. 1.增加全局變量: stralloc authusername={0}; //全局變量用于記錄認證的email地址 2.在認證成功后將mailfrom存入上面的authusern..........[/quote:3284d68729] [quote:3284d68729]就是如果遠程連接到服務器25號端口,不通過認證。一樣可以向control/rcpthosts中列出的地址發郵件(就象是別的MTA與你對話一樣,別人的MTA不可能知道你的用戶名和密碼)因為不通過認證那么relayclient將會是null,那么就會進行rcpthosts的比較,如果rcpt 指定的email地址在rcpthosts中列出,qmail會接收并轉發該郵件,如果一個快速請求對一個慢速服務器,那是什么情況? [/quote:3284d68729] 這個情況,是暫時沒辦法的啦。 |
iceblood 回復于:2003-04-29 08:50:32 |
謝謝,希望加精。
能否mail給我一份? 我盡快把qmail-smtpd.c替換掉。 |
gadfly 回復于:2003-04-29 12:22:51 |
to 夜未眠:
大概明白你的意思. 1.smtp的這種機制下,安全就是相對的,我知道你服務器的域和用戶,我就可以向你發信。 2.其實你說的分開,也就是將mail relay(本域用戶向外發信)和mail receive(用于MTA)之間,我記得和peng以前討論過,確實可以這么做.而且不同的patch確實能使效率提高,同時又起到了分流的作用.不過大部分的情況下,效率的問題并不大, 這兩者還是合一的.不過我想用不同的patch,效率上的提高還是有限的。即使有效率問題,完全可以通過多服務器負載均衡來避免. 3.你說白打,我的理解你是針對發往本域的,我同意。不過這些patch基本上都是針對relay的,從這個角度來說,patch是很有作用的. to iceblood: 看不到你的mail address。不知如何給你 |
iceblood 回復于:2003-04-29 14:32:09 |
暈到~一時忽疏~居然忘記留下地址,現在補上~
iceblood@163.com |
夜未眠 回復于:2003-04-29 18:20:36 |
to gadfly
我都不是很清楚自已在說什么,誰叫我表達能力太差呢。大哥居然能夠理解我的意圖,佩服佩服。 |
haohaoo 回復于:2003-04-30 12:54:06 |
[quote:6770b16ed1]這個patch是基于www.nimh.org/hacks/qmail-smtpd.c,iceblood版本中實際上也是的這個。因此,用iceblood版本的可以直接使用。[/quote:6770b16ed1]
那要怎么用?你還沒有說呢?下載qmail-smtpd.c后要怎么辦?我用iceblood版本已經安裝好了,要怎么打? |
gadfly 回復于:2003-04-30 13:31:52 |
不仔細看?
[quote:7de698ebbe] 安裝方法,如下,將下面這些內容存到qmail-smtpd.patch。放到qmail的源碼目錄。然后 1. patch < qmail-smtpd.patch 2. make qmail-smtpd 3. 替換qmail-smtpd [/quote:7de698ebbe] |
haohaoo 回復于:2003-04-30 17:45:54 |
[quote:f25e681436="gadfly"][/quote:f25e681436]
有看啊,不過我說iceblood版本已經安裝好了的??? 是不是把包解開,然后把qmail-smtpd.c改名,然后編譯好后,把qmail-smtpd拿到已安裝的機器上去替換就行了? |
gadfly 回復于:2003-04-30 21:01:19 |
??
不用改名,解包后按我說的步驟作就好了 |
haohaoo 回復于:2003-05-02 12:55:18 |
我替換掉qmail-smtpd后還是出問題啊,smtp不用驗證就可以發信啊 |
ryanxyz 回復于:2003-05-02 20:43:25 |
我一開始就用了gadfly兄的patch
完全沒有問題 一次搞定 如果是從網頁上複製下來的 需要注意空白的問題 |
microcao 回復于:2003-05-04 20:45:08 |
我來補充一下
首先 http://nimh.org/ 的補丁地址改變了不在本來的地方了新地地方是 http://nimh.org/dl/ 其次推薦所有使用 http://nimh.org/ 發布的 qmail-smtpd.c 的朋友 換成另外一個補丁 http://www.cuni.cz/~vhor/qmail/smtpauth-en.html 這個補丁是在 http://nimh.org/ 基礎上改進來的, 他解決了樓主說的問題 增加了系統認證的日志應該是比較完善的! |
gadfly 回復于:2003-05-05 20:12:23 |
[quote:a5ea51c1db="microcao"]
http://www.cuni.cz/~vhor/qmail/smtpauth-en.html 這個補丁是在 http://nimh.org/ 基礎上改進來的, 他解決了樓主說的問題 增加了系統認證的日志應該是比較完善的! [/quote:a5ea51c1db] 呵呵,看了你寫的鏈接上的說明以及代碼,我都沒看到檢查mail from和auth login name的一致性。另外syslog也就兩個地方用到了,不覺的它的更完善。而且是直接寫日志,而不是通過環境變量來判斷是否寫日志。 所以結論是那個鏈接上的patch沒有解決本文涉及的問題. |
IPphone 回復于:2003-05-12 16:04:00 |
哈,原來這有這么多高手在的呢??求教一個問題:我用的是http://members.elysium.pl/brush/qmail-smtpd-auth/
上的補丁,完成后可以認證發郵件,可問題是我在OUTLOOK上去掉認證時一樣還是可以發送郵件。我曾經懷疑那個relayclient的問題,就是它還是在我每次收郵件時會記錄我的客戶端IP讓它可以忘外發郵件;于是我去掉roaming-users重新編譯vpopmail,但是那樣就不能給外面發郵件了。各位大大能不能告訴我哪里出問題了?? gadfly,可不可以給我一份你的補丁程序??地址是:xzj35@msn.com |
gadfly 回復于:2003-05-12 16:33:15 |
你說的這個問題,不少的網友都遇到過。iceblood的
包中帶的qmail-smtpd-auth*.tar.gz就是這個patch。 我沒有仔細研究,反正其它問題排除,我幫他們改用了qmail-smtpd.c,也就是http://nimh.org/ 上的,這個問題就不存在了。 patch 給你發過去了。 |
IPphone 回復于:2003-05-12 16:51:20 |
[quote:529282cb58="gadfly"]你說的這個問題,不少的網友都遇到過。iceblood的
包中帶的qmail-smtpd-auth*.tar.gz就是這個patch。 我沒有仔細研究,反正其它問題排除,我幫他們改用了qmail-smtpd.c,也就是http://nimh.org/ 上的,這個問題?.........[/quote:529282cb58] 謝了??!我再玩玩看。 |
gadfly 回復于:2003-05-18 12:45:25 |
由于網友xmubeta用這個patch遇到了問題,
我仔細察看了一下代碼。 確實如xmubeta 所說,代碼有點問題。 問題出在,以前我給的patch,smtp_auth_validfrom的調用和定義的參數都不一致。 編譯居然也不報錯,也是DJK風格的一個缺點:所有的內部函數都不預定義,即使預定義也不定義參數,所以編譯不報錯。 好了,我把我的patch改過來了。 改動的地方只有一個,原來是 if (smtp_auth_validfrom(mailfrom)) { 現在是 if (smtp_auth_validfrom(mailfrom.s)) { 謝謝xmubeta的指正。 至于為什么原來的patch在linux不出錯,在solaris上出錯。 我理解是linux上將結構傳入參數,轉化成char *的時候,實際上是將第一個結構成員轉化了,而這個正好是mailfrom.s。所以沒有問題。 而solaris上就有所不同了,所以造成錯誤。 iceblood, patch我給你重發了。 |
gadfly 回復于:2003-06-02 18:51:47 |
應一些朋友的要求,加了本地發信人發給本地,也需要auth的功能。
另外而且還加了一些注釋,版本號。方法和前面一樣。 我稍微測試了一下。各位測惻看吧。 [code:1:e9fa54356d] --- qmail-smtpd.c 2003-06-02 18:34:51.000000000 -0400 +++ qmail-smtpd.c.new 2003-06-02 18:42:31.000000000 -0400 @@ -268,6 +268,7 @@ int r; r = rcpthosts(addr.s,str_len(addr.s)); if (r == -1) die_control(); + if (!localauthd()) return 0; return r; } @@ -304,7 +305,11 @@ if (!stralloc_copys(&rcptto,"")) die_nomem(); if (!stralloc_copys(&mailfrom,addr.s)) die_nomem(); if (!stralloc_0(&mailfrom)) die_nomem(); - out("250 ok\r\n"); + if (smtp_auth_validfrom(mailfrom.s)) { + out("250 ok\r\n"); + } else { + out("must use username as From authenticated! (#5.7.1)\r\n"); + } } void smtp_rcpt(arg) char *arg; { if (!seenmail) { err_wantmail(); return; } @@ -527,6 +532,89 @@ static stralloc smtpauth = {0}; static char smtpauthlogin[65]; static char smtpauthpass[65]; +static int authd = 0; + +/* Author: gadfly@163.com. Version: 1.2. + * 1. Check consistent between auth user and 'From' user. + * 2. Read the LOG_AUTH enviroment variable to determine whether logging the auth info. + * LOG_AUTH=1, write the auth smtp info into syslog. + * 3. If mail from local, rcpt to local domain, user must auth before send data. + */ +#include <syslog.h> + +#define SMTP_AUTH_SUCCESS 0 +#define SMTP_AUTH_FAILED 1 + +int localauthd() { + + if (rcpthosts(mailfrom.s, strlen(mailfrom.s)) && !authd) return 0; + return 1; +} + +int smtp_auth_validfrom(from) char * from; +{ + stralloc tmplogin={0},mydefaultdomain={0}; + char authusername[256]; + int k, userlen; + + if (!authd) return 1; + + authusername[255] = '\0'; + userlen = k = str_len(smtpauthlogin); + k = byte_rchr(smtpauthlogin, k, '@'); + + if (k == userlen) + { + k = byte_rchr(smtpauthlogin, userlen, '%'); + + if (k == userlen) + { + if (control_readfile(&mydefaultdomain,"/var/qmail/control/me",1) != 1) + { + die_nomem(); + } + if (!stralloc_copys(&tmplogin, smtpauthlogin) ) + { + die_nomem(); + } + if (!stralloc_cats(&tmplogin, "@") ) + { + die_nomem(); + } + if (!stralloc_cat(&tmplogin, &mydefaultdomain)) + { + die_nomem(); + } + strncpy(authusername, tmplogin.s, sizeof(authusername)); + } + else + { + strcpy(authusername, smtpauthlogin); + authusername[k]='@'; + } + } + else { + strcpy(authusername, smtpauthlogin); + } + return !strcasecmp(from, authusername); +} + + +void auth_smtplog(authlogin, authresult) +char * authlogin; +int authresult; +{ + char * x = env_get("LOG_AUTH"); + + if (!x || (*x != '1')) return; + + if (authresult == SMTP_AUTH_SUCCESS) { + syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, success!", authlogin); + } else { + syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, failed!", authlogin); + } +} + static int smtpauth_getl(void) { int i; if (!stralloc_copys(&smtpauth, "")) return -1; @@ -611,11 +699,14 @@ wait_pid(&st, pid); if (wait_exitcode(st) == 0) { out("235 go ahead\r\n"); + authd = 1; + auth_smtplog(smtpauthlogin, SMTP_AUTH_SUCCESS); flush(); relayclient=""; return; } sleep(2); + auth_smtplog(smtpauthlogin, SMTP_AUTH_FAILED); out("535 auth failure\r\n"); flush(); _exit(0); /* done */ } [/code:1:e9fa54356d] |
IPphone 回復于:2003-06-02 19:18:09 |
這個怎么用呢,是不是作為一個 patch 來打?????
另外我有個問題請問 gadfly ,我用呢前面的那個補丁打入最新的那個 qmail-smtpd.c (就是有三行輸出的那個)。用編譯后的 qmail-smtpd 來跑,認證沒有問題,但是客戶端的地址設置還是可以隨便改啊,可不可以幫我分析一下原因?? 我的 runsmtp 啟動腳本是: #/bin/sh LOG_AUTH=1 export LOG_AUTH tcpserver -H -R -l 0 0 smtp /var/qmail/bin/qmail-smtpd-auth /bin/checkpassword /bin/true & |
IPphone 回復于:2003-06-02 20:07:14 |
老兄啊,你那第十行的 “}” 又問題吧??我 patch 打不上啊。
另外加了你的那個日志記錄后會記錄一些什么內容???仍然是在 Linux 的 /var/log/maillog 中嗎?? 我的 runsmtp 腳本改為: #/bin/sh LOG_AUTH=1 export LOG_AUTH tcpserver -H -R -l 0 -u qmailduid -g qmaildgid 0 smtp /var/qmail/bin/qmail-smtpd-auth /bin/checkpassword /bin/true | /var/qmail/bin/splogger & |
gadfly 回復于:2003-06-02 20:30:03 |
??不會呀,具體的錯誤信息。
另外看我最前面的說明。 特別要說明的是粘貼上來后,有些沒有空格了。得自己補上 |
IPphone 回復于:2003-06-02 20:59:23 |
看來確實是空格問題。后來用 gadfly 發過來的補丁就可以了。
后來在 gadfly 的熱心幫助下解決了遇到的一些我在運行腳本和 qmail 配置文件上的問題;描述如下,供大家參考。 runsmtpd-auth腳本: #!/bin/sh LOG_AUTH=1 export LOG_AUTH tcpserver -H -R -v -p -l 0 -u 0 -g 0 0 smtp /var/qmail/bin/qmail-smtpd-auth-gadfly /bin/checkpassword /bin/true 2>&1 | /var/qmail/bin/splogger & /var/qmail/control/me 里面的內容改成了域的名稱(原來是服務器的完整域名) 這里我的服務器是只需要給本域用戶發送email 的。(呵呵,是不是有點大材小用阿?)現在不會出現亂發郵件的問題了。 謝謝 gadfly ?。。。?! |
jeff183 回復于:2003-08-08 21:59:46 |
可以直接把文件給我嗎?
謝謝! jeff183@sina.com |
erehw 回復于:2003-09-03 15:54:25 |
gadfly :
你好,這個修改過的c文件,能否提供一個地方下載?或者麻煩發一個到我的郵箱.erehw@163.com。 謝謝。 |
carelezz 回復于:2003-09-05 20:39:50 |
gadfly:
您好,我也想要您修正過的qmail-smtpd.c文件或者patch 我的郵箱:carelezz74@hotmail.com 再次感謝 carelezz |
gadfly 回復于:2003-09-07 22:33:48 |
呵呵,以上各位朋友,不好意思,由于帖子瀏覽的這個配置
[quote:b400c9f086] 默認方式只列出: 3月內的帖子 注意:回復這個時間段以外的普通帖子不能被按默認方式瀏覽的朋友看到![/quote:b400c9f086] 導致我沒有及時的看到各位的回復。 不過還好,非常感謝erehw,提供空間下載patch。 樓頂的帖子我更新了。包括最新的patch和下載地址。 |
xiaoxiaoke 回復于:2004-02-06 22:13:55 |
前提是你已經成功安裝了smtp-auth的補?。?!
刪除/var/qmail/control/rcphosts中的本機域名 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
yjc2688 回復于:2004-12-20 22:30:49 |
這樣會不會影響資源?? |
毛天吹 回復于:2004-12-22 01:15:47 |
謝謝各們樓主的無私的提供了。。我現在就趕快去更更新我的MAIL 了
. 樓上可以發給我一份不: yixiang.wang@126.com |
platinum 回復于:2005-02-12 00:16:35 |
哪位能提供一下打好補丁的qmail-smtp.c文件呢?
補丁太多,打亂了~~ |
hongfengyue 回復于:2005-03-16 16:02:45 |
是呀,誰有打好的補丁的c文件?
mail: hongfengwbw@yahoo.com.cn 謝謝??! |