🐈

[ローカルブレイクアウト] Windows office365のIP・URLを取得

2025/03/08に公開

手順

  • 公式ページで公開されているリストを取得する。
  • 必要な部分だけを抜き出す。

以下のようにJSON形式で公開されている

エンドポイント:
https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7

[
  {
    "id": 1,
    "serviceArea": "Exchange",
    "serviceAreaDisplayName": "Exchange Online",
    "urls": [
      "outlook.cloud.microsoft",
      "outlook.office.com",
      "outlook.office365.com"
    ],
    "ips": [
      "13.107.6.152/31",
    ...
  }
]

エンドポイントにFormatパラメータを追加すると、csv形式でも取得可能。

変更前:
https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7
変更後:
https://endpoints.office.com/endpoints/worldwide?Format=csv&clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7

更新頻度

エンドポイントのデータは、毎月初めに必要に応じて更新され、アクティブになる 30 日前に新しい IP アドレスと URL が公開されます。

とのこと。
その他詳しくは、公式ページを参考にしてください。
https://learn.microsoft.com/ja-jp/microsoft-365/enterprise/urls-and-ip-address-ranges?view=o365-worldwide

リストの更新日時取得

同ページRSSフィードのlastBuildDate項目から取得可能

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Microsoft 365 URLs and IP Addresses - Office 365 Worldwide</title>
    <link>http://aka.ms/ipurlws</link>
    <description />
    <language>en-us</language>
    <lastBuildDate>Fri, 28 Feb 2025 00:22:26 Z</lastBuildDate> # ここ
    <item>
...

pythonでIPとURLだけ抜き出してみる。

ソースコード
import requests

# requre
endpoints = 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7'
endpoints_data = requests.get(endpoints).json() #load json

# tmp
address_list_ip4 = []
address_list_ip6 = []
url_list = []

def get_json_data():
    json_data = {}
    for i, obj in enumerate(endpoints_data):
        urls = obj.get('urls')
        ips = obj.get('ips')
            
        if ips != None:
            for ip in ips:
                # ipv4
                if '.' in ip:
                    address_list_ip4.append(ip) 
                else:
                # ipv6
                    address_list_ip6.append(ip) 
        if urls != None:
            url_list.extend(urls)
    json_data['ipv4'] = address_list_ip4
    json_data['ipv6'] = address_list_ip6
    json_data['urls'] = url_list
    return json_data

if __name__ == '__main__':
    # Json
    print(get_json_data())
  • いい感じにとれる。
{
  "ipv4": [
    "13.107.6.152/31",
    "13.107.18.10/31",
    "13.107.128.0/22",
   ・・・
    "40.126.0.0/18",
    "13.107.6.192/32",
    "13.107.9.192/32"
  ],
  "ipv6": [
    "2603:1006::/40",
    "2603:1016::/36",
    "2603:1026::/36",
   ・・・
    "2603:1057:2::/48",
    "2620:1ec:4::192/128",
    "2620:1ec:a92::192/128"
  ],
  "urls": [
    "outlook.cloud.microsoft",
    "outlook.office.com",
    "outlook.office365.com",
   ・・・
    "*.cloud.microsoft",
    "*.static.microsoft",
    "*.usercontent.microsoft"
  ]
}

ほかの言語でもおそらく同じようなことができるかと思います。

コードを書くのが面倒な人へ

Jsonレスポンスを返すAPIを公開しました。

参考

https://learn.microsoft.com/ja-jp/microsoft-365/enterprise/urls-and-ip-address-ranges?view=o365-worldwide
https://www.netone.co.jp/knowledge-center/blog-column/knowledge_takumi_189/
https://qiita.com/ykhirao/items/a41322085ab55837b88e
https://www.odndo.com/posts/1628923388138/

Discussion