MaxMind の GeoLite を使用しています。私の本当の仕事は、特定の IP によってシステム内の CityId を決定することです。MaxMind では、IP で locid を見つけて、locid と CityId の間のクロスの手作りのテーブルを使用します。しかし、このクロステーブルは未完成です。MaxMind からローカライズの適切なファイルを見つけました。ここでは、各 locid が GeoNames id にマッピングされています。GeoNames id は良いのですが、このファイルは未完成です。たとえば、このファイルにはバーミンガムはありません。それで、誰かそのような問題がありますか?そして、それを決定する方法があれば?
3 に答える
これは、必要なすべての出力を提供する 3 つの部分です。それをラップするのはあなた次第ですが、すべての都市情報が提供されます。lon lat と iprange の逆引きによって。
GeoIP
1 つの IP ルックアップにPythonの例を使用します。次に、IP 範囲を削除します。各範囲を参照します。次に、その都市/経度緯度をタグ付けします。これは、すべての都市のすべての IP ではありません。ただし、主要なプロバイダーと、それらがどの都市にあるか、またはどの都市に隣接しているかについて、完全に正確ではないにしてもかなり近い推定値が得られます.
1)
#!/usr/bin/python
import GeoIP
gi = GeoIP.open("/bin/script/tbl/state/GeoLiteCity.dat",GeoIP.GEOIP_STANDARD)
with open ("city.txt", "r") as myfile:
data=myfile.read().replace('\n', '')
gir = gi.record_by_addr(data)
if gir != None:
print gir['city']
print gir['region']
print gir['region_name']
print gir['latitude']
print gir['longitude']
2)
#!/bin/bash
cd /bin/script/tbl/state
for state in $(cat state.abrv); do
state=$(echo $state)
cat outputfile | grep $state | cut -f1 -d"," > SB
output=sb.csv
echo "ip,country" > $output
for i in $( cat SB );
do echo "$i,\"$( geoiplookup -f GeoLiteCity.dat $i -i | cut -d' ' -f4-99 )\"" >> $output
done
echo "a" > sb1.csv && echo "a" >> sb1.csv && echo "a" >> sb1.csv
cat sb.csv >> sb1.csv
awk 'NR == 1 || NR % 7 == 0' sb1.csv | tr -d ' ' | tr '-' '/' > sb.csv
tail -n +2 "sb.csv" > $state
rm SB sb.csv sb1.csv
done
iptables
次に、そのようなクイックロード可能なスクリプトを生成できます。これにより、新しいチェーンが作成されるため、キャッチをすべて最初にドロップできます。Python はこれらをチェーンの先頭にロードします。その後、これが読み込まれるまで 30 分待たずに、プライマリ チェーンの設定を続行できます。(もちろんパソコンにもよりますが)
#IPT=/sbin/iptables
#ACT=/bin/script/tbl/state/active.txt
#Py=/usr/bin/python
#suba='p=subprocess.Popen(["'
#subb='"],?stdout?=?subprocess.PIPE)'
#sub2='output?,?err?=?p.communicate()'
#sub3='print?output'
#
#### Any Changes?
#if diff 'active.txt' 'active.old' > /dev/null; then
# echo 'Loading Group Interests'
# /bin/bash state.bash
# $Py state.py
# exit
#else
# echo 'Modifying Rules For'
# echo $(diff active.txt active.old | head -50 | tail -49 | cut -f2 -d'0')
#fi
#
### Then lets go
# echo '#!/bin/bash' > state.bash
# echo '#!/usr/bin/python' > state.py
# echo 'import?subprocess' >> state.py
#
#for state in $(cat $ACT)
#do
# echo $IPT' -N '$state >> state.bash
# echo $IPT' -A '$state' -j DROP' >> state.bash
#done
#/bin/bash state.bash
#
#for state in $(cat $ACT)
#do
# BADIPS=$(egrep -v -E "^#|^$" $state | sed 's/[A-Za-z]*//g' | tr -d ":")
# for ip in $BADIPS
# do
# echo $ip | cut -f1 -d'/' > city.txt
# $Py city.py | head -4 | tail -1 > lon.ip
# $Py city.py | head -5 | tail -1 > lat.ip
# city=$(cat city.ip | tr ' ' '_')
# lon=$(cat lon.ip)
# lat=$(cat lat.ip)
# echo $suba'iptables -A INPUT -s '$ip' -j '$state$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# echo $suba'iptables -A FORWARD -s '$ip' -j '$state$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# echo $suba'iptables -A OUTPUT -d '$ip' -j '$state$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# echo $suba"iptables -A "$state" -s "$ip" -j LOG --log-prefix \
#'STATE_,"$ip","$state","$city","$lon":"$lat",_OUT_:'"$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# echo $suba"iptables -A "$state" -d "$ip" -j LOG --log-prefix \
#'STATE_,"$ip","$state","$city","$lon":"$lat",_IN_:'"$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# echo $suba"iptables -A "$state" -s "$ip" -j LOG --log-prefix \
'STATE_,"$ip","$state","$city","$lon":"$lat",_OUT_:'"$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# echo $suba"iptables -A "$state" -d "$ip" -j LOG --log-prefix #'STATE_,"$ip","$state","$city","$lon":"$lat",_IN_:'"$subb >> state.py
# echo $sub2 >> state.py
# echo $sub3 >> state.py
# done
#done
### MAGIC
sed 's/ /"','"/g' state.py > state1.py
cat state1.py | tr '?' ' ' > state.py
sleep 3
python state.py
cat active.txt > active.old
### adapting this to ASN or country is way easier.
### your welcome
### last time I post anything on this webpage. There is NOTHING wrong with my formatting. go cry about it
MaxMind のGeoLite2 データベースは GeoNames ID を返します。
これを見つけるまで、maxmind データベース geolite2 の国に対して geoname_id と registered_country_geoname_id を一致させることができませんでした:
https://www.kaggle.com/geonames/geonames-database?select=geonames.csv