2017年6月4日日曜日

Squid

今回はsquidをdockerで動かす話です。

元々は、SquidをQNAPのNASにインストールして使っていました。ところが、最近QNAPのバージョンが上がる度に設定が変わったり、動作が変わったりと危うい感じに。

元々QNAPはQAが良くないみたいで、バージョンアップの度にデグレードする会社だったんですが、ここ最近は特に酷い。

というわけで、QNAP版のSquidに見切りをつけて、NAS上のdockerから適当なSquidを動したというわけです。


最初は、sameersbnのsquidを使おうとしたんですが、動くんですが、設定で大きなファイルもキャッシュするようにしてもキャッシュしてくれないんですね。1週間ぐらいずっと悩んだんですが、どうやっても出来ないので諦めました。

他に目ぼしいdocker-squidがなくて、小さくて新しいsquidがいいなあということで、Alpine Linuxを使ったsquidに。ただこれも2年前と少し古かったので、これをforkして自前のdocker imageを作ることにしました。

Alpine Linux 3.6とSquid 3.5.23です。13MB、圧縮して6MBに収まりました。またデフォルトで以下の設定で起動するようにしました。
  • キャッシュは4GB
  • 一つのファイルにつき32MBまでキャッシュ
自分のdocker imageにしてしまえば、デフォルト設定を好きに変更できていいですな(笑)

実行は
$ docker run -p 3128:3128 jam7/squid3
です。

2017年5月21日日曜日

Edgerouterに証明書導入

今日は家庭内でhttpsの証明書を取る話です。

httpsの接続先がオレオレ証明書だと、接続する度に信頼するかと聞かれ、パスワードのオートコンプリーションも効かないし、色々面倒です。

かといって公式な認証を取ると3万円程度必要になります。無理無理無理w

そこで、今回はLet's Encryptを使って無料で公式な認証を取る話です。認証を取ると、URLが緑になって、パスワードのコンプリーションも効いて便利です。


前提として必要なのは、以下の通り。
  • Edgerouter 1.8.5以降
  • 独自ドメイン (1年目は99円や299円から)
  • ポート80を一時的に公開できること
独自ドメインは、1年目は割引で、2年目からは4000円超なんてのもあるので気をつけましょう。2年目以降が1200円程度なら妥当だと思います。ドメインを作ったら、IPはDynamic DNSを利用して、自分のドメインのDNSからは、そのDDNSをCNAME(ALIASみたいな物)で指すようにするといいでしょう。

その先の手順は以下の通りです。
  1. 外部の名前で、内部から接続できるようにする
  2. 外部から接続しacme-tinyを使って認証を作成する
まず、外部の名前、今回は`router.jam.blue`としてますが、これで内部からルーターのweb UIに接続できるよう設定します。その手順は以下の通り。
  1. router.jam.blueでIPを引けるようにする
  2. web UIをrouter.jam.blueに公開する
まず手元のPCで、nslookupしてみます。

$ nslookup router.jam.blue
Server:         127.0.1.1
Address:        127.0.1.1#53

Non-authoritative answer:
router.jam.blue canonical name = jam7.ddns.net.
Name:   jam7.ddns.net
Address: 180.145.72.84

こう出力されれば問題なし。127.0.1.1や192.168.1.1などのプライベートアドレスが出てくると問題あり。

対応方法は、まずホスト名に適当な物、router.jam.blue以外を設定します。これは、debian系のedgerouterでは、ホスト名を設定すると、それを127.0.1.1で登録するので、それを回避するためです。


こんな感じに設定します。同時に、WizardのDNS host namesも見て、router.jam.blueを全て消します。

これで、WAN側のアドレスだけになるはず。それが出来たら、Config treeから、service gui listen-addressを0.0.0.0にして、web UIを公開します。ここでは、httpdの設定を変えているだけで、これ以外にfirewallでブロックされているので、実際には外部からは接続できません。


この例では、certificates導入済みなので、ca-fileやcert-fileがデフォルトとは異なってますが、その下のlisten-addressを修正して、Previewして設定してください。

ここまでできたら、内部のPCから、router.jam.blueでweb UIが開けるはずです。

次は、「外部から接続しacme-tinyを使って認証を作成」なんですが、これは簡単で、 https://github.com/mgbowen/letsencrypt-edgemax をインストールして実行するだけです。

インストール時のgitの導入などでディスクスペースが足らない場合は、バックアップされてるシステムイメージを削除しましょう。

admin@router:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi0_0                  220080    203208     12036  94% /root.dev
aufs                    220080    203208     12036  94% /
devtmpfs                127364         0    127364   0% /dev
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488        80    127408   0% /var/log
tmpfs                   127488         8    127480   0% /tmp
none                    127488      1364    126124   1% /opt/vyatta/config
unionfs                 127488         8    127480   0% /opt/vyatta/config/tmp/new_config_4ukbi6sshf7ul2arvu74vggnd4scdcue
admin@router:~$ delete system image
The system currently has the following image(s) installed:

v1.9.1.1.4977602.170427.0113   (running image) (default boot)
v1.9.0.4901118.160804.1131

You are about to delete image [v1.9.0.4901118.160804.1131]
Are you sure you want to delete ? (Yes/No) [Yes]: yes
Removing old image... Done
admin@router:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi0_0                  220080    126412     88828  59% /root.dev
aufs                    220080    126412     88828  59% /
devtmpfs                127364         0    127364   0% /dev
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488        80    127408   0% /var/log
tmpfs                   127488         8    127480   0% /tmp
none                    127488      1364    126124   1% /opt/vyatta/config
unionfs                 127488         8    127480   0% /opt/vyatta/config/tmp/new_config_4ukbi6sshf7ul2arvu74vggnd4scdcue

後は、手順通り。sudo ./install.shするだけです。エラーが発生した場合でも、certificatesを導入してしまうため、web UIが見れなくなるかもしれません。そういう時は、sudo ./uninstall.shで回復できます。

2017年5月9日火曜日

net.ipv4.ip_forward が勝手に有効になる

会社で、それまで使ってたマシンを踏み台マシンにしようとした所、 net.ipv4.ip_forward が勝手に有効(1)になって、こまった話です。

結論からいうと、libvirtdやdockerを削除しましょう。

それらが有効になっていると、起動直後の設定処理中に、勝手にip_forwardを有効にしてしまいます。

もし、踏み台マシンでdockerを使う必要がある場合などは、各自でip_forwardを有効のまま設定する方法などを調べてみてください。

# うちは諦めて踏み台マシンからはdockerを消しましたw

2017年2月19日日曜日

git showの使い方

hackしてますか〜?

年末にchromebook買ってから、家ではひたすらプログラミング&コンパイルしてます。楽しい。

今日はgitの便利な使い方、"git show"の使い方の紹介です。

特定のバージョンの特定のソースファイルを見たい!ということはありませんか?
rcsだと、"co -p"でやっていたあれです。

$ git show master:packages/python27.rb
require 'package'

class Python27 < Package
  version '2.7.13'
  source_url 'https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz' # software source tarball url
  source_sha1 '18a8f30a0356c751b8d0ea6f76e764cab13ee046'                     # source tarball sha1 sum
  binary_url ({
    ...

みたいに書きます。数年git使ってましたが、先程やっとやり方を見つけましたw
"master^^:file"みたいな何時もの指定方法も使えます。

わーい、すごーい😁

2017年1月8日日曜日

GitHubにバイナリファイルをuploadする

今回はGitHub関連ツールの紹介です。

GitHubに公開したファイルとは別に、データファイルだけを置いて、それをwgetを使って別途利用して欲しい場合があります。例えば、chromebrewで使うコンパイル済みバイナリファイルなど。

昔のGitHubだとそういうファイルをpostして、git cloneするファイルとは別に管理できたみたいですが、今は出来ません。

今は代わりにreleaseページを作ってそこにバイナリを置けるのですが、イマイチ使いづらいのです。毎回web UIからファイルをD&Dしないといけなかったり。

なのでこれまで使ってなくて、代わりにgit lfsを使おうと調べてみたらこちらもイマイチ、バグがあったり遅かったり、更にはdevelopperは必ず全てのデータを取得しないといけないなど、使いづらそうです。

なので今度は方向性を変えて、releaseページにCLIからファイルを追加する方法を探してみました。そしたら良いのがあったので紹介です。

https://github.com/aktau/github-release

ただオプションがいっぱい必要だったりイマイチ使いづらいなと。なのでwrapperを作ってみました。

https://github.com/jam7/simple-github-release

できることは最小限に絞って、他のプロジェクトにコピーして置いて使いやすいよう工夫しています。コピーして使う時は、先頭の'owner'と'repo'をハードコーディングしてしまうといいですね。

これを使うと、
$ ./upload-github-release.sh v1.0 tarfiles/*.tar.xz
とするだけで、v1.0のリリースページにtarfilesディレクトリ配下のファイルが全てコピーされます。困ってる人は是非使ってみてください。