VPC PeeringされたAWS環境に、単一のVPN接続でアクセスする

これは、ドリコム Advent Calendar 2014 - Adventarの14日目の記事です。

13日目は、@k_m_y_さんによる、Processingで体験するサウンドアートの世界 - kxmxyx.github.ioです。

自己紹介

  • @shouyu
  • 社内でのアダ名はゲーリーです*1
  • 14年に新卒で入社
  • インフラエンジニアをしています
  • 入社前は京都でRails書いてました

今日の話

唐突ですが、今日はAWSの話になります。
VPC Peeringで接続されたすべてのVPC内のインスタンスに対して
1つのVPN接続で社内から直接アクセス可能にしようとして
色々と一筋縄ではいかなかったので、そのまとめになります。

ちなみに、専用線を契約して Amazon Direct Connect を使えば解決する話です。

構成

最初に載せてしまいますが、以下のような構成が最終構成になります。

この構成で、社内から図中の Service VPC1 や、Service VPC2 のインスタンス
直接 ssh 出来れば勝ちです。
図にはありませんが、Infra VPC、Service VPC1、2はすべて別アカウントという縛りもあります。

どうして VPN 接続を一本にしたかったか

前述の通り、サービスごとに AWS のアカウントを分けるという方針であったため
サービスの立ち上げごとに、社内と各VPC で、VPN 接続を作っていくと、管理が非常に煩雑になると予想出来ました。
また、図中の Infra VPC には、LDAP サーバ等も置く予定であり、VPC Peeringは必須であったので
サービス立ち上げ時には VPC Peering の設定さえしてやれば、その他の設定はしなくてよいと言うのが理想でした。

http://www.slideshare.net/AmazonWebServices/arc403-from-one-to-many-evolving-vpc-design-aws-reinvent-2014-41528054/25

そもそも、こんなことしたい人はたぶんいないと思います。

VPN 接続

最初の図を見てもらえば分かる通り、Amazon VPC 標準の VPN 接続は利用していません。
はじめは、利用する方向で考えていたのですが、社内から Infra VPCVPC VPN で接続しても
Service VPC1、2 に対してのパケットを Infra VPC が通してくれないという問題がありました。

VPC のルートテーブルの設定を色々やってみたのですが、結局解決ができず VPC VPN の使用はあきらめました。

内部構成がわからないので、あくまで推測にはなってしまいますが
VPC VPNで接続した際は、パケットのデスティネーションアドレスが 対象VPC(今回は Infra VPC)の CIDR の
範囲内ではないパケットは VPC 側の Virtual Gateway が落としているのではないかと考えています。

結果、Infra VPC内にOpenVPNインスタンスを作成し、社内と接続することにしました。

ちなみに、VPC VPNLinux で接続する方法に関しては、こちらをご参照ください。
AWS VPN (1) between VPC VPN G/W and Debian Linux (racoon, setkey, quagga) with NAT | 外道父の匠
AWS VPN (2) between VPC VPN G/W and Debian Linux (racoon, setkey, quagga) with monit for Non-NAT | 外道父の匠

VPC Subnet のルートテーブル設定

Infra VPC 内のサブネットのルートテーブルに

Dest: 10.110.0.0/16 Targe: pcx-aaaaaaa(VPC Peering Gateway to Service1)
Dest: 10.120.0.0/16 Targe: pcx-bbbbbbb(VPC Peering Gateway to Service2)

というようなルールを追加します。
こちらは、VPC が増える毎に設定が必要です。
もちろん、対向の Service VPC1、2 でも同様の設定が必要です。
この設定は、VPC Peering するうえで必須の設定になるので、特筆すべき点はないです。

AWSVPNサーバのiptablesの設定

社内ネットワークと、OpenVPN を接続し、ip_forward を有効にして勝った!
と思いましたが、まだ勝てません。

という状態になりました。
初めの図で言うと、VPC Peering Gatewayで引っ掛かっている状態です。

またまた推測にはなりますが、VPC Peering Gateway もパケットのソース、デスティネーション
をしっかりチェックしているのかなと思います。

そこで、AWS 側の VPN サーバでトンネルから入ってくるパケットを以下のように、iptables で NAT してやりました。

-A POSTROUTING -s 172.168.0.0/24 -d 10.110.0.0/16 -j MASQUERADE
-A POSTROUTING -s 172.168.0.0/24 -d 10.120.0.0/16 -j MASQUERADE

ルールを2つ追加していますが、AWS 環境で使う CIDR をうまく切ってやれば、1つですみます。

これで、無事パケットが届き、社内から各サービスインスタンスへ直接sshすることができるようになりました!
セキュリティグループの設定もお忘れなく。

ちなみに、今回の構成では、Service VPCインスタンスから社内へは接続できません。
するならAmazon Direct C(ry

*1:アダ名がげろしゃぶになりそうだった所、心優しい先輩が助けてくれました

PC接続時にAndroidが認識しない

$ lsusb

とか

$ udevadm monitor

とか

# vim /usr/lib/udev/rules.d/51-android.rules

とかいじって2時間ほど詰んでた。

結論:そのケーブルは充電専用なのでUSBケーブル変えましょう

GNOME Shellでアイコンが表示されない

GNOME ShellでNautilusやTop barのアイコンが表示されなかったりおかしくなった時の直し方

sudo /usr/bin/gdk-pixbuf-query-loaders --update-cache

Alt+F2でrを入力してEnter
で解決

Gnome-shell 3.2.2 updated: extension and tray icons missing [SOLVED]
https://bbs.archlinux.org/viewtopic.php?pid=1054054

GNOME3 + mikutter

GNOME3でmikutter起動しているとnotificationに
アイコンがぞろぞろたまっていって非常にうっとおしい感じになるので
notify-sendを発行しているところをいじるとアイコンがたまらなくなって良い感じになる

# core/addon/libnotify/notify-send.rb
...
command = ["notify-send"]
command << '--hint=int:transient:1' #この行を追加
...

VAIO ZにArch Linuxインストールした際のまとめ

コンパイル待ってるの嫌になってきたのでArch Linuxも試しました
Gentoo環境は mkfs.ext4 で消えました

https://wiki.archlinux.org/index.php/Talk:Installing_with_Fake_RAID
にdmraidとか古くね?Intelはmdadm使えって書いてるし俺できてるぜ!
とか書いてる割に全然出来なかったのでまとめ。*1

ブート

LinuxLive USB CreatorでUSBスティック作成
普通にブート・・・すると画面真っ暗
ブートメニューで TAB 押して

 i915.modeset=0

を追加して起動。英字配列になってるので=は^のキーで入力。

RAID

起動したら既に認識されてます。
/dev/md126 /dev/md126p2など

mount /dev/md126p3 /mnt
mkdir /mnt/boot
mount /dev/md126p2 /mnt/boot

でマウント。
/arch/setupに入る前に

mdadm --examine --scan > /mnt/etc/mdadm.conf

/arch/setup

Prepare Hard Drive

Manually configure block devices, filesystems and mountpoints

を選択して何も設定せずに進み、Ignore押してスキップ

Configure the system

  • >/etc/mkinitcpio.conf

MODULESに dm_mod を追加
HOOKSの udev の後ろに mdadm_udev を追加

Install Bootloaderはスキップ

GRUBのインストール

http://forums.gentoo.org/viewtopic-t-888520-start-0.html
のInstalling grub

menu.lstの書き換えを忘れると起動しないので書き換えましょう。

*1:Intelの奴には確かにmdadmでごちゃごちゃ載ってる。 http://download.intel.com/design/intarch/PAPERS/326024.pdf

VAIO Z(SVZ1311AJ)へのGentooインストール

VAIO ZにGentooインストールする際詰んだポイントのまとめ

参考
http://en.gentoo-wiki.com/wiki/RAID/Onboard
http://artifact.gnu-log.net/index.php/Linux_on_Sony_VAIO_Z_Series_(2011)
http://en.gentoo-wiki.com/wiki/Intel_GMA

インストールメディアのブート

VAIO Zには光学ドライブがないのでUSBで光学ドライブを接続するか
USBメモリなどのメディアを使ってインストールする必要があります。

今回はUSBメモリ経由でインストールする場合。

公式ではインストール用にメディアが配布されていますが
各種ツールを使ってUSBメモリにインストールしても起動しないので
SystemRescueCDを使います。

ブートメニューではインストールするつもりのビット数(32/64)と同じビット数のカーネルを選択。
そうしないとchrootで詰みます。

起動したらstartxでGUIを立ち上げ。
適当にネットワークなど確認したらターミナルからGentooをインストール。

RAIDの認識

VAIO ZはIntelのチップセットを使ってRAID 0が構成されてます。

dmsetup mknodes

で/dev/mapper/以下にノードを展開。
これでgparted等でパーティション操作ができるようになる。

その後は

mount /dev/mapper/isw...Volume03 /mnt/gentoo

でマウント。

Ubuntu Server 11.10でGitLab立てたメモ

Ubuntu Server 11.10 64bitでGitLab立てたメモです

すでに同じ環境でのエントリがあったけどうまく行かなかった&もっと簡単な方法があったので。

とりあえずインストールからやったのでそこからのメモ。
ファイアウォールなどの設定は割愛。

Ubuntu Serverのインストール

ウィザードに従ってインストール。
途中OpenSSH Serverにチェック入れましょう。

SSH設定の変更

/etc/ssh/sshd_configを適宜編集。
ポートとか、PasswordAuthenticationとか。
自分の環境だと22番が開いてなくて適当に開いてるポートに変えました。

GitLabのインストール

https://github.com/gitlabhq/gitlabhq/wiki/V2.0-easy-setup-for-ubuntu
この手順でやるだけです。
気づいたらnginx+Passengerの環境でGitLab動いてます。

Install GitLabHQの手順で注意点がいくつかあって
stableブランチにしないとUIがスクリーンショットとかと何か違う・・・
ってなります。

なので

git clone http://github.com/gitlabhq/gitlabhq.git
git checkout -b stable origin/stable

とかでstableブランチもらいましょう。

SSHのポートを変えた場合は一仕事あって

Configure GitLabHQの所で

gitlabhq/config/gitlab.yml

のPortのコメントアウトを外して22から変更後のポートに変更。

さらに

sudo vi /etc/ssh/ssh_config

でポートの指定が必要になります。
sshd_configじゃないですよ。

なんかエラー出た

自分の場合、ソースコードブラウズしたときに500エラー出ました。
いろいろ調べたらcharlock_holmesのgemがちゃんとインストールできてないとかで
該当のgemをインストールしなおしましょう。