Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

親プロクシがあるときのSquidの設定方法 Windows編

f:id:fa11enprince:20201227234532j:plain 何らかの理由で閉じたネットワーク内で、いわゆる踏み台の内側にネットワークを組んでいる場合、
その内側のマシンからインターネット接続をしたいことがあると思います。
その場合、例えば企業内のネットワークでインターネットに出る場合
Proxyを経由しないといけない場合があると思います。
踏み台には単にProxyの設定をすれば踏み台からインターネットアクセスができます。
では、内側のマシンからの場合はどうするかという内容です。
多段プロクシをすればいいのです。この場合、親になるプロクシは親プロクシとか上位プロクシと呼ばれたりします。

踏み台の設定

構成は次のような感じとします。IP体系がへんてこなのは実は私が実験している環境がHyper-Vだからです。
普通に社内と192.168.1.0/24のNICを2つ持っている踏み台があると思ってもらえばよいです。 今回は、192.168.185.224/28ですが…。 踏み台もdev01Default Switchを使っているのでプロクシを通さずとも、インターネットに出れるので
私の環境を再現した図としては、この図は正確ではないですが、
開発用のネットワークだとありそうな感じかなと思っていただければ…。 f:id:fa11enprince:20210101011345p:plain
本当に同じ環境をしたい場合は下記リンクのように 踏み台にNIC2枚(外部スイッチとプライベートスイッチ)をつけてください。
Hyper-Vのスイッチの違い - 海を飛んで君の許へ。
そのうえで、片方をプライベートスイッチにしてください。

企業プロクシに見立てたフリーで公開されているプロクシで下記を使います。
http://www.cybersyndrome.net/plr6.html

150.95.198.104:3128

これをWindowsのProxy設定で設定すると当然踏み台からは
Edgeとかでインターネットにつなげるはずです。

Squidの設定

では、内側のマシン(例:Dev01)からの場合はどうするかというといくつか方法がありますが、
Squidを使うパターンでやってみます。
Squid for Windowsのインストールをします。
バージョンは最新版で3.5.28です。
https://squid.diladele.com/

最近数日間だけこのサイトが停止していました…(ドメイン更新忘れかな?)。

ダウンロードしたsquid.exeをダブルクリックしてインストールをします。
特に設定項目みたいのはなく、デフォルトのままでOKです。
既定ではC:\Squidにインストールされます。

C:\Squid\etc\squidをエディタで開き設定を末尾の行に追加します。
もちろんタスクバーに常駐しているのでそこから開いてもかまいません。 この記事で重要なのはここだけです。

# parent proxy server
cache_peer [親のproxyのhost] parent [親のproxyのポート] 0 no-query
icp_port 0
never_direct allow all

を追記します。 キャッシュサーバーとして動作させるときにicp_port 0とするのですがたいていこれでOKです。 never_direct allow allは送信元(このSquidの利用元)からインターネットへの直接アクセスを禁止します。
今回の場合は、

# parent proxy server
cache_peer 150.95.198.104 parent 3128 0 no-query
icp_port 0
never_direct allow all

となります。あとは

以上でおわりですが、Firewallも忘れずに開けておきましょう。 Windowsのファイヤーウォールの設定で、 受信の規則で3128ポートを許可します。※キャプチャはお試しWindows 10 Enterpriseの英語版です。 f:id:fa11enprince:20210101015314p:plain

あとは閉じたネットワークのLinuxマシン等から(もちろんWindowsでもOK) /etc/environment等にhttp_proxy, https_proxy, no_proxy変数等を設定すればよいでしょう。 今回は面倒なのでUbuntuのFirefoxにProxy設定を入れます。 Windows(Squidサーバー)のIPは今回でいうと、192.168.185.227:3128なのでそれを入力します。 f:id:fa11enprince:20210101103259p:plain

参考

Squidによるプロキシサーバーの構築
水銀室 Squidで多段プロキシーを設定する -CentOS最短構築支援-
上記リンクはそれぞれの設定値の意味を細かく書いてくださっているのでわかりやすいです。

トラブルシューティング

Squid通らないぞと思ったらまずはマシン同士が通信できるかping等で確認してください。
もちろんpingもWindows Firewallの設定を解除してあげなければなりません。
【Windows 10対応】Windowsのファイアウォールで「ping」コマンドへの応答を許可する:Tech TIPS - @IT
また、ちゃんとProxyを介しているかどうかはC:\Squid\var\log\squid\access.logを見てください。 Windowsの仮想スイッチの概念わかりにくいなー。
デフォルトスイッチ・外部スイッチ・内部スイッチ・プライベートスイッチがある。。。 デフォルトスイッチと外部スイッチの違いがよくわからん。

あと、ちゃんとSquidつかうならログのローテーションの設定を忘れずに!

2020年の振り返り

f:id:fa11enprince:20201231035937j:plain 今年取り組んだ技術の振り返りです。

認証・認可

LDAP(OpenDJ)
OpenId Connect/OAuth 2.0(OpenAM)

Webアプリ

Node.js(Express)

リバースプロクシ

Nginx

データベース

MongoDB

データ分析・簡易的な定型処理

Jupyter/Python

仮想化

VMware ESXi
Docker

サーバー

AWS(EC2/S3/Route53)
Azure(Virtual Machines/Blob Storage)

総括

あまり目新しいことやってないなーと感じています。
認証・認可のOpenAMだけが唯一新しいくらいかな。
あとは設計書とかその辺のドキュメントだったり、品質管理だったり、そんなところの比重も多かったですかね。

画像をJavaScriptでXHR経由で読み込む方法

f:id:fa11enprince:20201111022041j:plain
やむをえない事情があり、JWT認証を通過して画像を表示させる必要があったので、
XHR(Ajax)で画像を読み込む方法を調べました。
同一ドメインならこんな苦労はしないのにーとか最近そんなことを悩んでいます。

サーバーサイドのコード

何でもいいのですが、最近お気に入りのexpress
サクッとなんか書くのが楽なんです。環境構築も長楽だし。
JavaScriptいいお。
Nodeはversion 12くらい。Expressはversion 4です。

$ express --view=ejs myapp

とかでサクッとひな形作って、
とりあえずroutes/image.jsとかいうルーターを作り、単にバイナリデータを返します。

const express = require('express');
const router = express.Router();
const fs = require('fs');

router.get('/', async (req, res, next) => {
    fs.readFile('./public/images/nyam.jpg', (err, data) => {
        if (err) {
            console.error(err);
            res.sendStatus(500);
            return;
        }
        res.writeHead(200, {'Content-Type': 'image/jpg'});
        res.end(data);
    });
});

module.exports = router;

index.jsのコードは省きます。
nyam.jpgというのは猫の画像です。にゃーむ。
当然PythonのFlaskでもRuby On Railsでもなんでもええです。楽なやつにしましょう。
Spring Bootでもいいですが若干だるいと思います。

フロントエンドのコード

jQueryでも実はできるとのことですが、まぁXHRでいいでしょう。 Blobってのを使うと超絶らくちんです。
Base64ならなんでもできるぜい、っていう素敵なおっさんから話は聞いてましたけど
めんどっちいんでBlobで。

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <div style='height: 300px;'>
      <img id='img' alt='nyam' height="300" />
    </div>
  </body>
  <script>
  var loadBinaryImage = function(url, cb) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        cb(this.response);
      }
    }
    xhr.open('GET', url);
    xhr.responseType = 'blob';
    xhr.send();
  }
  document.addEventListener('DOMContentLoaded', function () {
    loadBinaryImage('./image', function (blob) {
      var img = document.getElementById('img');
      img.src = URL.createObjectURL(blob);
    });
  });
  </script>
</html>

これを調べた動機

そもそも画像を表示するなら

<img src='http://localhost:3000/images/nyam.jpg' alt='nyam.jpg'>

で事足りるわけですが、 やんごとなき事情によりAuthorization: Bearer [token]がないと画像が取れねーよって状況になってるので調べました。 さてと動画というと… 206の応答を返してごにょごにょして…

こんな感じでできるっぽい。
重い動画の場合は知らん。
そもそもほかのドメインに動画読み取らせるのはなぁという…。

参考リンク

XMLHttpRequestで取得した画像バイナリをJavaScriptでロードする - kinjouj.github.io
AjaxでバイナリのJPEG画像データを受け取って表示する - Qiita

Hyper-VのGuestでWSL2でdockerを動かしてみる

f:id:fa11enprince:20200819231041j:plain
こんなのすぐに終わるかなー。と思ったら、案の定、罠が仕掛けられてました。単なる備忘録です。
Windows 10 Enterprise 2004でお試ししてみました。

Windows 10 Enterpriseのゲストを作成してみる

ダウンロード編

評価版の仮想環境を作れるよーってことで、QuickからWindows 10 dev environmentを作ります。
期限付きとはいえ、太っ腹っすな、最近のMSさん。
が、しょっぱなから失敗する。
"Failed hash verification" in Hyper-V Quick Create with Windows 10 dev environment
とか出るよ。

ということで、直にDLする。
https://download.microsoft.com/download/7/c/e/7ce1271d-04bb-4f0f-b1f4-e031bccb9712/WinDev2007Eval.HyperVGen2.zip
んで、Explorerで管理者としてアクセス
C:\Users\Public\Documents\Hyper-V\
移動してダウンロードしたWinDev2007Eval.HyperVGen2.zipを展開した中にある、
WinDev2007Eval.vhdxファイルを
C:\Users\Public\Documents\Hyper-V\Virtual hard disks
に置く。別にここじゃなくてもよいのだけれど、ダウンロードフォルダに置きっぱなしもなんだかなぁというよくわからない心情でこうしました。
Zipファイルの解凍めちゃ遅い…。そこそこいいスペックのマシーンなんだけどな。M2.SSDでCore i7-9700KなのでそこそこおれTUEEEEができるスペックのはず。

Guestマシン作成編

Hyper-V Managerから
Local intallation sourceで、Change installation sourceで先ほどのvhdxを選ぶ
Name: Windows 10 dev environment
Network: Default Switch
Create Virtual Machineを押す
これでOK

Docker DesktopをWSL2でやってみる

Hyper-VのGeuest上で何も考えずにDocker Desktopをインストールすると、
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
とか出る。またか。。。

Install Windows Subsystem for Linux (WSL) on Windows 10 | Microsoft Docs
仮想マシン プラットフォーム" オプション機能を有効にしてみる
Powre Shellを管理者で起動して以下のコマンドを実行。
ついでにWSL2をデフォにする。

> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
> wsl --set-default-version 2

これでもダメ
はいはいVT-xが有効になってないのね。
GuestのVT-xが有効かどうか確認するためにTask ManagerをみるとVirtualization: Enabledのかわりに
Virtual Machine: Trueになってる
おーこれはどうするんだ?と調べたらすぐに出てきた。

HOST側のPowerShellで管理者権限で実行
kakkoyakakko2.hatenablog.com

Nested Virtualization を設定

Set-VMProcessor -VMName "<VMName>" -ExposeVirtualizationExtensions $true

これをやってGuestを立ち上げると…(なんか時間かかるけど…) f:id:fa11enprince:20200819231441p:plain
できたできた。
ああ、そうかHyper-VのGuest上のでWSL2だとやっぱり内部的にHyper-Vを使ってるから、
Hyper-VのHyper-VになるからNested virtualizationってことが必要なのか。

所感

Hyper-V使えるPro EditionだったけどWindowsのお試し環境をお手軽に作れるのはうれしい。
WSL2速くないすか?
あと、2004にしたらWSL2に乗り換えようかなと思いました。