さくらクラウドVPCルータ(サイト間VPN)とOpenVPNを利用したVPN拠点の構築

昨今、コロナ禍により業務を遂行するにあたり、テレワークを余儀なくされてます。

社内のNASやら、運用・保守業務で「IPアドレス制限されている」サーバにアクセスするために、会社ルータ(RTX-1210)にVPN接続をすることが多々発生しています。

そうした中、RTX-1210にVPN(L2TP)接続ができないというスタッフが続々と発生するという問題が顕著化しました。(以前よりそういった問題がちょくちょくありましたが、特に業務への影響は軽微であったことから、放置していました。)

ログ、コンフィグなどを見直して、ある程度あたりはつけましたが、業務に影響がでるかもしれない作業を実施する時間的余裕もないのと、本当にそれで問題が解消する保証もないのと、別件で使ってる拠点間接続だと、通信が安定しているという事もあり、 外部にVPNサーバを立てて、そいつと、会社のRTX-1210を拠点間接続でつないでしまえばいいのじゃなかろうかと思い立ったが吉事。さっそくやってみました。

さくらクラウドのVPCルータにもVPN(L2TP)サービスがあるので、最初これが使えるか?と試したのですが、VPCルータから全パケットを拠点間接続の接続先に転送するルーティングを入れると、VPN(L2TP)サービスに接続できなくなってしまうという問題(というかあたりまえなんですが。。)があり、以下のようなネットワークを作ってみました。

簡単に説明すると、さくらVPCルータを拠点間接続だけに利用して、VPNサーバは別にサーバを立てて、VPNクライアントから接続されたパケットはすべて、VPCルータ経由・拠点間VPN接続を得て会社のRTX-1210から出ていくルーティングを設定するというものです。

つまり、以下のような通信ラインを確保しようという試みです。

以下構築の手順メモ

OpenVPNを設定する

【設定前提情報】

ローカルスイッチネットワーク情報: 192.168.100.0/23
接続先スイッチ: local-switch(1)
サーバのNetwork: eth0 (Global側) 30.30.30.1
サーバのNetwork: eth1 (Loal側) 192.168.100.2
OS: CentOS 7.6

【手順】

STEP1) 必要パッケージをインストールする

yum -y update
yum install epel-release -y
yum --enablerepo=epel -y install openvpn easy-rsa

STEP2) 各種設定準備を行う
※パスワード、CAのcommonnameは好きな値を設定の事

mkdir /etc/openvpn/easy-rsa
cp /usr/share/easy-rsa/3.0.7/* /etc/openvpn/easy-rsa/ -R

cd /etc/openvpn/easy-rsa

./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-dh
./easyrsa build-server-full server_r nopass
./easyrsa build-client-full client1 nopass
openvpn --genkey --secret /etc/openvpn/ta.key
cd /etc/openvpn/
cp /usr/share/doc/openvpn*/sample/sample-config-files/server.conf server_r.conf

STEP3) server_r.confの設定を行う

vi /etc/openvpn/server_r.conf

デフォルト値から以下を変更する

ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server_r.crt
key /etc/openvpn/easy-rsa/pki/private/server_r.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
push "route 192.168.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
comp-lzo
user nobody
group nobody
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log

STEP4) net.ipv4.ip_forward の設定を行う

vi /etc/sysctl.d/10-ipv4_forward.conf

net.ipv4.ip_forward = 1

sysctl --system

STEP5) iptablesの設定を行う

yum -y install iptables-services
systemctl disable firewalld
systemctl stop firewalld
systemctl enabled iptables
systemctl start iptables

vi /etc/sysconfig/iptables

*filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [6:813]
 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
 -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -d 192.168.100.0/23 -i tun+ -j ACCEPT
 -A FORWARD -o eth0 -m state --state NEW -j ACCEPT
 -A FORWARD -o eth1 -m state --state NEW -j ACCEPT
 -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 COMMIT
 *nat
 :PREROUTING ACCEPT [51:3492]
 :INPUT ACCEPT [0:0]
 :OUTPUT ACCEPT [2:152]
 :POSTROUTING ACCEPT [3:212]
 -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
 COMMIT

※ボールドの部分がポイント

systemctl restart iptables

STEP6) OpenVPN起動

systemctl enable openvpn@server_r
systemctl start openvpn@server_r

STEP7) ルーティングの設定

ip rule add from 10.8.0.0/24 table 100 prio 100


ip route add 10.8.0.0/24 dev eth0 proto kernel scope link metric 100 table 100

ip route add default via 192.168.100.1 table 100

※このルーティングがポイント(10.8.0.0/24からのパケットは全部、192.168.100.1へルーティングするという内容を用意する)

STEP7) ルーティングの永続化

※設定方法確認中
 とりあえずいまは起動時にスクリプトで実行させておく。

STEP8) クライアントで利用するcert / keyは以下ファイルを利用する

/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/ta.key
/etc/openvpn/easy-rsa/pki/issued/client1.crt
/etc/openvpn/easy-rsa/pki/private/client1.key

.ovpnファイルを作ると接続設定するのが楽になります。
以下のようなファイルを作る

client
 dev             tun
 proto           udp
 remote          30.30.30.1 1194
 resolv-retry infinite
 nobind
 persist-key
 persist-tun
 remote-cert-tls server
 tls-client
 key-direction 1
 cipher AES-256-CBC
 comp-lzo
 verb 3
<ca>
 ここに、「/etc/openvpn/easy-rsa/pki/ca.crt」の内容を張り付ける 
</ca>
<key>
 ここに、「/etc/openvpn/easy-rsa/pki/private/client1.key」の内容を張り付ける 
</key>
<cert>
 ここに、「/etc/openvpn/easy-rsa/pki/issued/client1.crt」の内容を張り付ける 
</cert>
<tls-auth>
 ここに、「/etc/openvpn/ta.key」の内容を張り付ける 
</tls-auth>

さくらクラウド VPCを利用した「拠点間VPN接続」の設定を行う。

さくらクラウドVPCの設定を行う

■さくらクラウド ネットワーク情報

【設定前提情報】
ローカルスイッチネットワーク情報: 192.168.100.0/23
接続先スイッチ: local-switch(1)
VPCルーター(インターフェース:プライベート1)に割り当てるIP: 192.168.100.1
対向IPアドレス: 10.10.10.1
対向ID: 192.168.100.1
Pre Shared Secret: unko123
対向Prefix: 0.0.0.0/0
ローカルPrefix: 192.168.100.0/23

【手順】

STEP1) VPCルーターを追加する
    プラン: スタンダード
    インターネット接続: 有効
    そのほかの項目は任意で入力する
    
STEP2) VPCルーターのインターフェースの設定
    スイッチ: 既存スイッチを接続
    接続先スイッチ: local-switch(1)
    IPアドレス: 192.168.100.1
    プレフィックス: /23

STEP3) サイト間VPNの設定
    対向IPアドレス: 10.10.10.1
    対向ID: 192.168.100.1
    Pre Shared Secret: unko123
    対向Prefix: 0.0.0.0/0
    ローカルPrefix: 192.168.100.0/23

STEP4) 「反映」を行う

RTX-1210側の設定を行う

【設定前提情報】
■RTX-1210ネットワーク情報
Global-IP:  10.10.10.1
LAN-IP: 172.16.100.1 (NetworkAddress: 172.16.100.0/23)
■さくらクラウド VPC(サイト間VPN設定情報)
Global-IP: 20.20.20.1
対向IPアドレス: 10.10.10.1
対向ID: 192.168.100.1
Pre Shared Secret: unko123
対向Prefix: 0.0.0.0/0
ローカルPrefix: 192.168.100.0/23

【手順】

★RTX-1210側への設定手順
参考: https://knowledge.sakura.ad.jp/7051/

1) RTX-1210のGUIツールにて、拠点間VPNの設定を行う。 (簡単設定→VPN→拠点間接続)
 接続種別の選択: IPSec
 ネットワーク環境: 自分側と接続先の両方とも固定のグローバルアドレスまたはネットボランチDNSホスト名を持っている
 自分側の設定(設定名): SAKURA VPN
 接続先の情報(接続先のホスト名またはIPアドレス): 10.10.10.1
接続先と合わせる設定(認証鍵 (pre-shared key)): unko123
接続先と合わせる設定(認証アルゴリズム): HMAC-SHA
接続先と合わせる設定(暗号アルゴリズム): AES-CBC
 経路に関する設定: 接続先のLAN側のアドレス
192.168.100.0 / 255.255.254.0(23bit)
10.8.0.0 / 255.255.254.0(24bit)
2) CONFIGを取得して、「description tunnel “SAKURA VPN”」の設定部分を探して、設定情報を変更する

※例えば、

tunnel select 16
 description tunnel "SAKURA VPN"
 ipsec tunnel 9
  ipsec sa policy 9 9 esp aes-cbc sha-hmac
  ipsec ike keepalive log 9 off
  ipsec ike keepalive use 9 on heartbeat 10 6
  ipsec ike local address 9 172.16.100.1
  ipsec ike nat-traversal 9 on
  ipsec ike pre-shared-key 9 text unko123
  ipsec ike remote address 9 20.20.20.1
 ip tunnel tcp mss limit auto
 tunnel enable 16

であった場合、以下のような設定情報を作成。

tunnel select 16
  description tunnel "SAKURA VPN"
  ipsec tunnel 9
   ipsec sa policy 9 9 esp aes-cbc sha-hmac
   ipsec ike always-on 9 on
   ipsec ike duration ipsec-sa 9 1800
   ipsec ike duration ike-sa 9 28800
   ipsec ike encryption 9 aes-cbc
   ipsec ike group 9 modp1024
   ipsec ike hash 9 sha
   ipsec ike keepalive log 9 off
   ipsec ike keepalive use 9 on dpd 15 2
   ipsec ike local address 9 172.16.100.1
   ipsec ike local id 9 172.16.100.0/23
   ipsec ike nat-traversal 9 off
   ipsec ike pfs 9 on
   ipsec ike pre-shared-key 9 text unko123
   ipsec ike remote address 9 20.20.20.1
   ipsec ike remote id 9 192.168.100.0/23
   ipsec auto refresh 9 on
  ip tunnel mtu 1280
  ip tunnel tcp mss limit auto
  tunnel enable 16

これを、RTX-1210の「コマンド実行」で実行する。

以上

プログラミング教育のテキスト yes!作りかけ。

だいぶん前から プログラミング教育を学校で開始するという話があり、2020年から義務教育で取り入れられるという事になりました。

そんな話もあり、Scratch+A4S+Arduinoを利用した教育用のテキスト(小学校高学年向け)を作ってみました。(ええ!もちろん作りかけです)

ScratchとA4s ( https://github.com/damellis/A4S )を組み合わせてArduino UNOを操作する環境を作り、その環境でのプログラミングを勉強するという内容にしています。

子供にプログラミングを教える、一緒にプログラミングを学ぶ時につかっていただければと思います。

#だれか資料を完成させてください!

テキスト

A4S-master2

 

 

[Laravel]環境構築編その2 Laravelとそのバックエンド

福岡拠点の香月です。

Laravel環境構築編その2はLaravelのインストールまでの実践記です。
今回インストールする環境は次の通り

      • MySQL5.7
      • PHP7.2
      • Comporser
      • Laravelインストーラ2.0.1

MVCモデルのM(Model)としてMySQLを使用します。
Laravelはphpアプリケーションなのでphpを入れて、Laravel構築に必要なComposerも入れます。Laravelの最新版は5.6、これを構築するためのLaravelインストーラを最後に入れます。

環境は前回Vagrantで構築したCentOS上です。
Windowsのコマンドプロンプトを立ち上げて次のコマンドでCentOSを起動。

ターミナルソフトでローカルポート2222にsshでアクセスします。
以降の操作はターミナル上で行います。

事前準備としてyumレポジトリの有効/無効を切り替えることができるようにユーティリティをインストールしておきます。

MySQL5.7のインストール

MySQLの公式からDOWNLOAD -> Yum Repositoryとたどり、今回のCentOS7用として「Red Hat Enterprise Linux 7」用のファイルをダウンロードし、インストールしていきます。
A Quick Guide to Using the MySQL Yum Repository

1行目で公式から最新のrpmファイルをダウンロードし、
2行目でyumレポジトリに追加します。
そのままインストールするとMySQL8.0がインストールされてしまうので、
3行目でレポジトリのMySQL8.0を無効にし、
4行目でMySQL5.7を有効にします。
5行目でインストール開始。
6行目で起動、
7行目でサービス登録です。

MySQLの初回起動時にはログファイルにrootの初期パスワードが出力されるので
それを使ってログインし、新しいパスワードを設定します。

PHP7.2のインストール

今回使用するLaravel5.6の公式ドキュメントでPHPの要件を確認すると、以下のようになっているので、それに合わせて拡張機能も一緒にインストールすることにします。またバックエンドのMySQLのための拡張機能も一緒にインストールします。

      • PHP >= 7.1.3
      • OpenSSL PHP拡張
      • PDO PHP拡張
      • Mbstring PHP拡張
      • Tokenizer PHP拡張
      • XML PHP拡張
      • Ctype PHP Extension
      • JSON PHP Extension

さらに、Laravel5.6の要件には書かれていませんが、zip拡張がないとLaravelインストールが失敗するため、これも一緒にインストールします。

PHPの公式ではソースしか公開されていませんが、yumレポジトリで使えるパッケージがRemi’s RPM Repositoryで公開されているのでそれを利用します。
CentOS用のURLからダウンロード、インストールします。

1行目でremi-release-7.rpmのインストールに必要なモジュールを事前にインストールします。
2行目でパッケージをダウンロードし、
3行目でレポジトリを追加。
4行目でレポジトリのPHP7.2を有効にし、
5行目で必要なモジュールを含めてインストールします。
この4行目のPHP7.2の有効化を忘れると、CentOSのbaseレポジトリにあるPHP5.4がインストールされるので注意しましょう。
これで必要なものが全部入りました。php -m と打って必要なPHPの拡張モジュールが入っているか確認できます。

mbstringも入ったのでPHPの日本語の設定を行っておきます。

今回Webサーバーにはapache2.4を使用しています。PHPの公式ドキュメントのApache2.x系へのインストールを見ると、apacheの設定ファイルにPHP7用のモジュールをロードするための設定の追加が必要と書かれています。

しかしそこはパッケージインストールの良いところ、yumでのインストールで以下のファイルが作成され、設定が行われています。

これを有効にするために、apacheを再起動します。また、これが正しく動作しているか確認するためにDocumentRootにファイルinfo.phpを追加します。

追加が完了したら動作確認のために、ホストOS(Windows)上のブラウザからこのファイルのURLを打ち込みます。http://localhost:8080/info.php

この画面が出れば成功です。mbstringの欄も設定どおりになっていることも確認できます。apacheでは起動時にphp.iniを読み込むため、php.iniを編集した際は必ずapacheを再起動します。

Composerのインストール

こちらも公式ページの「Getting  Started」と「Download」ページの記述に沿ってインストールします。引き続きrootでの作業です。

ComposerのインストールはPHPの構文をphp -rで処理させて実行するように記述されているので、その通りにやります。深い意味はないと思いますけど。
1行目でインストーラーをダウンロードし、
2行目でダウンロードしたものが正しいかハッシュ値の比較、
3行目の「Installer verified」で比較結果が正しいことが示されています。
4行目でインストーラー実行し、
5行目でインストーラーを削除しています。
ここまでで同じフォルダに「composer.phar」が出来上がっているので、6行目で全ユーザーにパスが通っている/usr/local/binに「composer」という名前で配置します。

Laravelインストーラのインストール

いよいよLaravelです。Laravelはそれを使用するユーザーごとにインストーラをインストールすることが求められています。

1行目でrootからvagrantユーザーに戻ります。
2行目でLaravelの最新をインストールし、
3行目で.bash_profileの編集を開始し、PATH=の行の最後に「:」をつけて、続けてLaravelのbinディレクトリを追加します。
7行目で設定を再読み込みして完了です。

正しくLaravelインストーラが実行できるか確認します。

バージョンが表示されればOK。

ということでインフラ構築はここまで。ありがとうございました。

Franzを使ってみた

作業を効率良く進めるためにツールは必要不可欠なものだと思います。
しかし多くのツールを立ち上げると配置に困ることもしばしば・・・

そこで今回は60種類以上のツールを一元管理できるFranzを紹介したいと思います。
FranzはSlack、Skype、GmailやGoogle Calendarなどのサービスを
クリック1つで切り替えることのできるすごいツールです。

インストールは
https://meetfranz.com/
から。

起動

無料アカウントを作成を選択します。

名・姓・メールアドレス・パスワードを入力します。

今回は無料プランを選択します。

招待したい人がいる場合はここで招待しましょう。

ぼっちなので後でを選択します。

あっという間に登録完了です。はじめる、または左下の+ボタンを選択します。

使いたいサービスを選択します。日本ではメジャーなものやマイナーなものまで揃っています。今回はGmailを選択してみます。

設定画面に遷移します。サービス名は好きな名前をつけることができます。

Gmailも複数アカウント登録できますので、アカウント名にするとわかりやすいかもしれません。

今回はそのままの設定でいきます!

Gmailを選択しました。右上のXボタンを押しましょう。

Gmailのログイン画面が表示されます。

あとはいつものようにログインするだけで、FranzでGmailが使えます。

サービスを増やしたい場合は、左下の+ボタンでどんどん増やせます。

  • 使ってみて

SkypeやGmailが1つのウィンドウで使用できるのは非常に便利です。

Webサービスを統合している感じなので、Web版とアプリ版を提供しているサービスが使えるのではないかと思っています。

Gmailはブラウザで使用している感じと同じなので全く違和感はありません。

未読の通知もわかりやすいですし、タスクバーにも未読数が表示されます。

SkypeはSkype for Web版になるため、アプリ版と設定画面も異なります。

改行はアプリ版がShiftとCtrlどちらも可能に対して、FranzではShiftのみのため、慣れるまでに時間がかかるかもしれません。

また、残念ながらYahooMailはありませんでしたが、今後に期待です。

メリット・デメリットはありますが、動作も軽く使いやすいツールだと思います。

今後もオススメのツールがあれば書いていこうと思います。

 

httpd 2.4.33のmod_sslでLibreSSL 2.7以上を使うときのパッチ

httpdのバージョンが上がったらそのうち対応されて直ると思いますが
それまでは使えると思うのでメモっておきます。

具体的には次のようなエラーがでた場合の対処です。

LibreSSLのopenssl/dh.hでDH_set0_pqgが宣言されているのに
mod_sslのssl_engine_init.cでDH_set0_pqgがstaticで実装されていて合っていないというエラーです。

このDH_set0_pqgという関数はOpenSSL1.1未満では実装されていないため、
mod_sslはOpenSSLが1.1未満の場合に自前の実装を使うようになっています。

プリプロセッサ的にはMODSSL_USE_OPENSSL_PRE_1_1_APIがONになっていれば
mod_ssl側でDH_set0_pqgを実装する形です。

このMODSSL_USE_OPENSSL_PRE_1_1_APIはLibreSSLを使うとONになるようになっているため
DH_set0_pqgが実装されたLibreSSL 2.7以降と合わせると不整合という状態になってしまいます。
(LibreSSLは基本的にOpenSSL 1.0.1ベースだが、LibreSSL 2.7でOpenSSL 1.0.2や1.1.0の機能がいくらか追加された)

対処としてはmod_ssl側の実装を削除してしまうだけです。

mod_sslとLibreSSLでは微妙に実装内容が違うのですが、きっとLibreSSL側の実装の方が信用できる。
mod_sslの方が信用できるよ派の人はssl_engine_init.c内のDH_set0_pqgを適当にリネームでもすればよいと思います。

あと私はApacheよりNginx派です。

FlashプレイヤーインストールでIPが変わった話

開発環境のサイトにアクセスができなくなり、解決した方法です。

皆さんももしかしたら同じ現象に陥るかもしれませんので、ご参考まで。

 

昨日までアクセスできていたのに、本日開発環境にアクセスできなくなりました。

URLをたたくとぐるぐる回り、どのページにアクセスしても同じ状態です。

他の人に聞いてみると、アクセスできるとの事。

何かネットワーク設定が変わってしまったのではと思い、PCのグローバルIPを確認してみると、見たことのないIPが表示されています。

結果として、

Flashプレイヤーインストール時に同時に知らぬ間にインストールされていたMcAfeeが原因でした。

McAfeeの関連アプリをアンインストールしたところグローバルIPが元に戻り、開発環境にアクセスできるようになりました。

【Python】pandasを利用した文字検索の方法と性能比較

東京拠点 本橋です

私の行っているプロジェクトでは開発言語の一部にPythonを使用しています。
csvなどの表形式データを処理するのにpandasライブラリはとても便利ですね。
そしてpandasを使ってSQLと同じように検索をする事が多いと思います。

「pandasで使って文字データに対する曖昧検索の処理をしたい。
けど、どうすればいいの?」

という事があったので検証してみました。

 

pandasにも曖昧検索用に以下の関数が用意されています。
 ①・match(正規表現)
 ②・contains(正規表現)
 ③・contains(検索文字)

どれを選べば良いのでしょうか・・・
技術検証を兼ねて調査してみました。

①match関数を使って正規表現で検索
 pettern = ‘.*’ + 【検索したい文字列】 + ‘.*’
 df_1[df_1[‘文字データ項目’].str.match(pettern)]

②contains関数を使って正規表現で検索
 pettern = u'(^(?=.*’ + 【検索したい文字列】 + ‘))’
 df_1[df_1[‘文字データ項目’].str.contains(pettern)]

③contains関数を使って検索文字のみで検索
 df_1[df_1[‘文字データ項目’].str.contains(【検索したい文字列】)]

・性能比較

 データ量:50項目20万行の中から80行のデータ抽出に対して実施

・結果

 ①・match(正規表現) ・・・・ 133ms
 ②・contains(正規表現)・・・・ 156ms
 ③・contains(検索文字)・・・・  96ms

containsは曖昧検索にも対応している関数なので
わざわざ正規表現にすることでかなり遅くなるようです
今回は正規表現で難しい事をしたいわけでもないので、
contains(検索文字)を採用!

運動不足なITエンジニアのマラソン奮闘記

はいさ~い!沖縄開発部の佐久本です。
沖縄は少しずつ寒さもなくなり、過ごしやすい季節となりました。

IT業界は運動不足な人が多いイメージですが、私の趣味はマラソンです。
過去にはフルマラソン完走経験もありますが、最近走るのはサボっています。

練習していない中、マラソン大会にはちゃっかりと参加していますが、
走り終わった後に、もっと練習しておけばよかったと後悔します。

今回はIT企業らしくなく、技術的な話ではありませんが、
沖縄で参加した方が良いマラソンイベントを紹介します。
※離島のマラソンには参加していないので偏った意見ですが・・・

(1)NAHAマラソン
沖縄で一番有名ではないかと思うNAHAマラソンです。
毎年12月に約3万人も人が参加する大きなイベントです。

沿道の方の応援も多く、7キロ付近で西城秀樹のYMCAが流れて
みんなで走りながらYMCAをやるという奇妙な空間があります(笑)
最初に参加したときは、恥ずかしながらやってましたが、今では違和感なくやっています(笑)
コスプレをしている人もたくさん居て、走りつつも見て楽しむマラソンだと思います。

個人的には12月の暑いマラソンとなるため、完走が難しいです。
過去に4回出てますが、完走は1回しかしていません。
ちゃんと練習してないからだと思いますが・・・

那覇マラソン公式サイト
http://www.naha-marathon.jp/

(2)尚巴志ハーフマラソン
次は、毎年11月頃に行われる尚巴志ハーフマラソンです。

NAHAマラソンのように華やかなマラソンではありませんが、
新里坂(シンザトビラ)という山登りをしているような勾配のある坂と
ニライカナイ橋という海がよく見えるポイントがあります。
綺麗な海の景色を見ながら走るマラソンは格別です!!!

あまり海が見えている写真が無かったのですが、オーシャンビューを楽しむことができるはずです。。。

尚巴志ハーフマラソン公式サイト
http://www.shouhashi.jp/

(3)あやはし海中ロードレース
次は、毎年4月頃に行われるあやはし海中ロードレース(ハーフマラソン)です。

こちらは東洋一の全長4.7Kmの「海中道路」(大きな橋)を渡るマラソンとなります。

NAHAマラソンや尚巴志ハーフマラソンに比べて平坦なコースで、
橋から眺める海の景色や磯のかおり感じながら走ることができるマラソンになります。
楽しく海をゆっくり眺めながら走りたい方におすすめのマラソンです。

あやはし海中ロードレース公式サイト
http://www.i-sam.co.jp/ayahashi_roadrace/

ということで、おすすめのマラソンイベント3つを紹介しました。
もし、沖縄でマラソンイベントに参加したい方が居れば、ぜひ参加してみてください。

技術的な話も今後は書いていきたいと思いますが、
沖縄の面白いところもどんどんアップしていきたいと思いますので、ご期待ください。