Google」カテゴリーアーカイブ

GCPとSoftEther VPNで固定IPゲートウェイ環境を作る

会社のISP回線は固定IPじゃないのだが、GCPを使って固定IPゲートウェイを作ったのでメモ

まず最初に某オープンVPN使ったが速度が遅い、というか通信途切れる。
MTUとMSS調整してもどうも接続が途切れるので2日で諦めたw

次いで、昔外から家の中のPCにつなぐ時に使ってたSoftetherがさらに進化してるというのでトライ。

1. GCEでVM立てる

まずはGCEでUbuntuインスタンスを立てる。
マシンタイプはn1-standard-1にした。個人用途ならg1-smallでもいいが、会社で数名が使うのでスタンダードで。

ネットワーク設定で、IP forwarding(IP転送)の設定をONにした。
てか、これいらないのかな?某オープンVPNの時は必須だったのでそれを倣っただけ。
VM作ったあとだとIP forwarding設定を変更出来ないのよね。

Network Tagに「vpn」という文字列をセットする。
あとでVPC Firewall Rules設定で、vpnタグに対しての通信を許可するため。

そしてExtenal IPをStaticにして固定IPにしておく事。

IP転送設定とネットワークタグを追加

2. VPC Firewall Rules設定で穴をあける

新しいFirewallルールをdefault-allow-vpnという名前で作る。
ネットワークタグ「vpn」に対してIngress通信を許可で、許可ポートは下記のもの

tcp:5555
udp:500,1701,4500

tcp:5555がSoftether用で、udpポートはMacのL2TP/IPSec用のポート。マカー社員用の措置。

VPC Firewall設定

3. Softether VPN Serverのインストール

Ubuntuへのインストールは公式の方法だとinitdを使う起動方法しか書いてないので、このサイトを参考にしてsystemdで起動するようにした。
自分だけのVPNサーバを作る!Ubuntu 18.04 に SoftEther VPN Serverをインストール

ビルドに必要なライブラリを先にインストールしておく必要があるので、

$ sudo apt-get install build-essential

で先にインストールしておく。

ファイヤーウォールはGCPのVPC Firewall設定でやるので、ufwは使わない。

インストール後、vpncmdというコマンドラインのCUI管理機能でセットアップするんだが、これが分かりづらかったの代替案。
Virtualbox内のWindowsゲストOSにSoftetherVPN Server ManagerというGUI管理ツールをインストールして設定。
これは楽だw

ゲストWindows上でSoftetherのGUIツールを実行すると楽

※話が脱線するが、VirtualboxをUbuntuにインストールする手順はこちらに書いてます。で、Windowsもってない場合はここから60日間だけ使える検証用WindowsのOVAファイルをダウンロードして、Virtualboxにインポートすれば60日間使えます。

やることは仮想ハブとユーザーを作成し、SecureNAT機能をONにするのと、あとはDHCPサーバー機能もONにした。

そして、ローカルブリッジ機能は絶対にONにしてはイケない。
やりたことはNATなのでローカルブリッジは不要。
しかし、最初よくわからずローカルブリッジをONにした結果、CPU利用率が100%になって全く通信出来ない状況になった。
というわけで、SecureNAT機能を使う時は、ローカルブリッジは必ず無効にする。

External IPを固定にしてるので、ダイナミックDNS機能は無効化する。
GUIから無効化しようとしると、設定ファイルを編集してオフにしろという。
というわけで設定ファイル編集画面から一旦設定ファイルをエクスポートして、それを編集してDDNSをオフ→そして再びインポートすればDDNS無効化できる。

DDNS設定を無効化

ユーザーを追加して、次はSoftetherクライアントのインストール

4. Softether VPN Clientのインストール

サーバーはUbuntu、そしてクライアントもUbuntu(Xubuntu)である。

Linuxクライアントのインストール方法はServer版と全く同じです。
なので、上記でやった手順の「server」を「client」に読み替えて、クライアントをインストールします。

で、コマンドライン設定がメンドサイので、これまたVirtualboxのゲストWindowsにSoftetherVPN Client ManagerをインストールしてGUIで仮想NICの作成と接続設定を作成。
これまた楽w

そして厄介なのがSoftether接続後に自分でルーティング設定を変える必要がある。
そしたらsoftetherクライアント起動後にルーティング設定を追加するためのスクリプトを書いた人がいたので、それを参考にした。

SoftEther VPN ClientをUbuntu 14.04LTSで使うときにちょっとはまったこと – KITA Eng.

ルーティング変更後、下記ページを開いてIPアドレスがGCEのExternal IPアドレスになってれば、Softetherをゲートウェイにしたアクセス完了という事。

IPアドレス確認 | KWONLINE.ORG

これで、DHCPで度々IPアドレスが変わる会社でも常に固定IPでネットにアクセスできる固定IPゲートウェイの出来上がり。

gsutilで大きいファイルをパラレルアップロードする

GCSバケットに、gsutilで大きなファイルをアップロードするのでメモ

150M以上のファイルをパラレルにする場合

$ gsutil -o GSUtil:parallel_composite_upload_threshold=150M cp [ファイル名] gs://[GCSバケット]

~/.botoファイルに追記しておいてもOK

parallel_composite_upload_threshold = 150M

公式ドキュメントに書いてある。
cp – Copy files and objects  |  Cloud Storage  |  Google Cloud

Google Spreadsheetの1枚目シートをBigQueryの外部テーブルにする

社内の同テンプレのスプレッドシートまとめるのこれでやると楽だったのでメモ。

#!/bin/bash

SCHEMA=date:DATE,id:STRING,description:STRING
URL=https://docs.google.com/spreadsheets/hoge/fuga
PRJ=myproject
DS=mydataset
TBL=mytable

bq mk --external_table_definition=${SCHEMA}@GOOGLE_SHEETS=${URL} ${PRJ}:${DS}.${TBL}

データセットは先に作っておかないと怒られる。
しかしこの方法はシート1枚目しか対応してない仕様。

複数シートも扱うならAppsScriptでBQのネイティブテーブル直接作るしかない。
外部テーブルじゃないけどさ。

function main() {
  var projectId = 'myproject';
  var datasetId = 'mydataset';

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();
  var tableId = sheet.getSheetName();
  
  var table = {
    tableReference: {
      projectId: projectId,
      datasetId: datasetId,
      tableId: tableId
    },
    schema: {
      fields: [
        {name: 'date', type: 'date'},
        {name: 'id', type: 'string'},
        {name: 'description', type: 'string'}
      ]
    }
  };
  try{
    BigQuery.Tables.remove(projectId, datasetId, tableId); 
  } catch(e) {}
  table = BigQuery.Tables.insert(table, projectId, datasetId);
  
  var range = sheet.getDataRange();
  var blob = Utilities.newBlob(convCsv(range)).setContentType('application/octet-stream');
  var job = {
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        skipLeadingRows: 1
      }
    }
  };
  job = BigQuery.Jobs.insert(job, projectId, blob);
}

function convCsv(range) {
  try {
    var data = range.getValues();
    var ret = "";
    if (data.length > 1) {
      var csv = "";
      for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < data[i].length; j++) {
          if (data[i][j].toString().indexOf(",") != -1) {
            data[i][j] = "\"" + data[i][j] + "\"";
          }
        }
        if (i < data.length-1) {
          csv += data[i].join(",") + "\r\n";
        } else {
          csv += data[i];
        }
      }
      ret = csv;
    }
    return ret;
  }
  catch(e) {
    Logger.log(e);
  }
}