みなさん、こんにちは。王毅先生です。この原稿を書く準備をしていますが、遅れが多すぎて先延ばしや先延ばしになってしまい、最近から少し前に変わってきました。今はいいです、私が熱をこすっていると誰も言わないでしょう。
ご存知のように、DouyinとWeiboは少し前にIP帰属を取り上げ始め、多くの白熱した議論を引き起こしました。海外の多くのベテランが「彼らの本当の色を明らかに」し始めて、中国に配置されました。それでは、IPの所有権はどのように達成されますか?それで、インターネットの有名人が所属する場所はありますか?この記事はあなたが見つけるのに役立ちます。
1.ステップ1:ユーザーの実際のIPを取得する方法
一般的にパブリックネットワークにアクセスしたいので、インターネットアクセス環境が必要であることは誰もが知っています。ブロードバンドを開いた後、オペレーターがIPアドレスを割り当てます。通常、IPアドレスは自動的に割り当てられます。では、ローカルアドレスが何であるかわかりませんか?パブリックIPアドレスを知りたい場合は、BaidusearchIPを介してIPの場所を確認できます。
だからここに問題があります。Baiduは私のパブリックIPをどのように知っていますか?
一般的に、当社のサービスにアクセスするユーザーのネットワークトポロジは次のとおりです。
ユーザーはドメイン名またはIPを介してポータルにアクセスし、バックエンドサービスにリクエストします。この場合、バックエンドサービスはrequest.getRemoteAddr();メソッドを介してユーザーのIPを取得できます。
SpringBootは次のようにIPを取得します。
@RestController
public class IpController {
@RequestMapping("/getIp")
public String hello(HttpServletRequest request) {
String ip = request.getRemoteAddr();
System.out.println(ip);
return ip;
}
}
次に示すように、サービスをサーバーにデプロイしてから、インターフェイスにIP情報を取得するように要求します。
しかし、なぜ私たちが取得したIPは、Baiduが見つけたものとは異なるのでしょうか。
1.1イントラネットIPとエクストラネットIP
コンピューターのCMDを開き、ipconfigコマンドを出力し、マシンのIPアドレスを確認して、マシンのアドレスがプログラムによって取得されたアドレスと同じであることを確認します。
実際、ネットワークはイントラネットIPとパブリックIPにも分かれています。イントラネットはローカルエリアネットワークでもあります。独自のローカルエリアネットワークを構築している企業や学校は、内部情報を送信する際にイントラネットを介して通信し、ローカルエリアネットワークでイントラネット通信を確立することで、パブリックネットワークのIPリソースを節約し、通信効率も大幅に向上します。 。。もちろん、ローカルエリアネットワーク外のデバイスは、イントラネット上のデバイスに情報を送信できません。
ただし、マシンがインターネットのリソースにアクセスする場合は、マシンに外部ネットワークの帯域幅が必要です。
因此,我们把服务部署在同一局域网内,客户端使用内网进行通信,因此获取的就是内网IP地址。但访问百度是需要使用公网访问,因此百度搜出来的IP就是公网IP地址。
1.2.为什么有时候获取到的客户端IP有问题?
当我们兴致勃勃的把IP获取的功能搞上去之后,发现获取的IP都是同一个?这是为什么呢?不可能只是一个用户在访问呀?查询IP信息之后发现,原来是我们部署的一台负载均衡的IP地址。
那么后端服务获取的地址都是负载均衡如nginx的地址。那么怎么透过负载均衡获取真实的地址呢?
透明的代理服务器在将客户端的访问请求转发到下一环节的服务器时,会在HTTP的请求头中添加一条X-Forwarded-For记录,用于记录客户端的IP,格式为X-Forwarded-For:客户端IP
。如果客户端和服务器之间有多个代理服务器,则X-Forwarded-For记录使用以下格式记录客户端IP和依次经过的代理服务器IP:X-Forwarded-For:客户端IP, 代理服务器1的IP, 代理服务器2的IP, 代理服务器3的IP, ……
。
因此,常见的Web应用服务器可以通过解析X-Forwarded-For记录获取客户端真实IP。
public static String getIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
} else if (ip.length() > 15) {
//多次反向代理后会有多个ip值,第一个ip才是真实ip
String[] ips = ip.split(",");
for (int index = 0; index < ips.length; index++) {
String strIp = ips[index];
ip = strIp;
break;
}
}
return ip;
}
第二步:如何解析IP
IP来了,我们怎么解析呢:
IP的解析一般都要借助第三方软件使用了,第三方一般也分为离线库和在线库
- 离线库支持的有如:IPIP,使用离线库的好处是解析效率高,性能好,问题就是IP库要经常更新。如果大家需要我私信我可以提供给大家比较新版本的ip库。
- 在线库则各大云厂商接口能力都有支持。在线版本的好处是更新即时,问题就是接口查询性能和使用TPS有要求。
以下演示借助IP库离线IP解析方式:
借助IP库就可以帮我们实现ip地址的解析。
public static void main(String[] args) {
IpAddrInfo IpAddrInfo = IPAddr.getInstance().putLocInfo("114.103.71.226");
System.out.println(JSONObject.toJSONString(IpAddrInfo));
}
public IpAddrInfo putLocInfo(String ip) {
IpAddrInfo info = new IpAddrInfo();
if (StringUtils.isNotBlank(ip)) {
try {
DistrictInfo addrInfo = db.findInfo(ip, "CN");
info.setCity(addrInfo.getCityName());
info.setCountry(addrInfo.getCountryName());
info.setCountryCode(addrInfo.getChinaAdminCode());
info.setIsp(addrInfo.getIsp());
info.setLat(addrInfo.getLatitude());
info.setLon(addrInfo.getLongitude());
info.setProvince(addrInfo.getRegionName());
info.setTimeZone(addrInfo.getTimeZone());
System.out.println(addrInfo.toString());
} catch (IPFormatException e) {
e.printStackTrace();
} catch (InvalidDatabaseException e) {
e.printStackTrace();
}
}
return info;
}
実際、IPポジショニング分析は実際には巨大なロケーションライブラリであり、IPの数も限られているため、同じIPが異なるエリアに割り当てられる可能性があるため、IP分析のロケーション精度に影響を与えるいくつかの側面があります1.ロケーションライブラリが不正確であるため、解析の偏差が大きくなるか、真の地域フィールドが発生します。2。オフラインライブラリはタイムリーに更新されず、海外のライブラリには通常、それらをサポートする特別なオフラインライブラリがあります。同じオフラインライブラリのセットを使用しても、必ずしも海外の解析がサポートされるとは限りません。 IPなので、今回が最も影響を受けます。海外のインターネット有名人のドアは、中国のさまざまな地域で解析されており、もちろん、本物の偽物を含め、誰もが偽物と見なしています。ただし、この機能をオンラインで使用することも有益です。少なくともインターネットは法律の範囲外ではありません。誰もが整然とした健康的な方法でネットサーフィンを行い、ネットいじめを拒否する必要があります。
さて、今日はこれでおしまいです。私は、アイデアと意味合いを持ったエンジニアリングライオンのワン・ラオシです。私に注意を払い、より技術的な知識を学びます。
- ナゲッツテクノロジーコミュニティのクリエイター署名プログラムの募集に参加しています。リンクをクリックして登録し、送信してください。