# proxy_onconnect.tcl - Kullanıcı sunucuya bağlandığında IP'sini kontrol eder (on-connect)
# Eğer proxy.txt veya DNSBL eşleşmesi varsa, kullanıcı IRC'den atılır.
set proxylist "proxy.txt"
set dnsbl_servers {
"dnsbl.dronebl.org"
"dnsbl.tornevall.org"
"rbl.efnetrbl.org"
"dnsbl.proxybl.org"
}
bind raw - "NICK" proxy:onconnect_check
proc proxy:onconnect_check {from keyword text} {
# Gelen kullanıcıyı ayrıştır (nick, ident, host)
if {[regexp {^:?([^!]+)!([^@]+)@(.+)} $text -> nick ident host]} {
set ip [proxy:getip $host]
if {$ip eq ""} return
# Local proxy.txt kontrol
if {[proxy:checklist $ip]} {
putlog "proxy_onconnect: $nick -> IP $ip = proxy.txt eşleşmesi"
proxy:kickuser $nick "Proxy bağlantı tespit edildi (local)"
return
}
# DNSBL kontrol
foreach dnsbl $::dnsbl_servers {
if {[proxy:dnsbl_check $ip $dnsbl]} {
putlog "proxy_onconnect: $nick -> IP $ip = $dnsbl eşleşmesi"
proxy:kickuser $nick "Blacklist ($dnsbl)"
return
}
}
}
}
proc proxy:getip {host} {
if {[regexp {(\d+\.\d+\.\d+\.\d+)} $host -> ip]} {
return $ip
}
return ""
}
proc proxy:checklist {ip} {
if {![file exists $::proxylist]} { return 0 }
set f [open $::proxylist r]
set data [split [read $f] "\n"]
close $f
return [expr {$ip in $data}]
}
proc proxy:dnsbl_check {ip dnsbl} {
set parts [split $ip "."]
if {[llength $parts] != 4} { return 0 }
set revip "[lindex $parts 3].[lindex $parts 2].[lindex $parts 1].[lindex $parts 0].$dnsbl"
set result [dnslookup $revip]
return [expr {$result ne ""}]
}
proc proxy:kickuser {nick reason} {
# Kullanıcıyı IRC'den atmak için NOTICE + QUIT veya ircd'ye göre KILL/AKILL kullanılabilir
putserv "NOTICE $nick :Güvenlik uyarısı: $reason"
putserv "KILL $nick :Proxy / Tor bağlantılar yasaktır"
}