socksサーバーをConohaのVPSにインストールする その2 2015年11月27日

google-mini-server-porn_22aug2008_7324

さてsocksサーバー構築の続きです。

しかしまた、socks5のセットアップ情報も日本語では少ない。当然使ってる人が少ないからだろう。とりあえずsocks5のサーバーとしてはdanteというパッケージが有名らしく、それを入れることにする。

Dante – A free SOCKS server
↑ Danteの本家サイト

通常CentOS6でバイナリをインストールする際に使うyumにもdanteは用意されていない。調べてみるとrpmでならバイナリが用意されているようでrpmforgeというrpmのレポジトリをyumに追加してそこからインストール。

[root@localhost ~]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@localhost ~]# rpm -ivh rpmforge-release-*.rpm
[root@localhost ~]# yum -y update

% vi /etc/yum.repos.d/rpmforge.repo
### Name: RPMforge RPM Repository for RHEL 6 – dag
### URL: http://rpmforge.net/
[rpmforge]
name = RHEL $releasever – RPMforge.net – dag
baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge
mirrorlist = http://mirrorlist.repoforge.org/el6/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

yum -enablerepo=rpmforge info dante*
yum -enablerepo=rpmforge install dante*

これでとりあえずdanteのパッケージはインストール完了。

あとは設定ですが、設定ファイルの構成はシンプル。基本的には/etcの下のsockd.conf と socks.confの2つのファイルをviなどで編集するだけ。さらに今回みたいにインターネット上にサーバーを配置するならユーザー認証で認証されないと接続できないようにすると思うが、基本的にsquidのbasic認証のようにユーザー名とパスワードをsocks用に別途用意するのではなく、ホストに登録されているユーザー名とパスワードを利用するのでsocksを利用するユーザーを新たに用意して、ログインシェルをnullか/sbin/nologinを割り当てておく。

基本的にsocks.confでは

route {
from: 0.0.0.0/0 to: 0.0.0.0/0 via: direct
proxyprotocol: socks_v5 # server supports socks v5.
}

このように from: x.x.x.x/x to: x.x.x.x/x でACL指定(このサーバーはインターネット上にあり、アクセス元もGlobal IPがDHCPで変更されるので特に制限はしない記述)とサーバーでサポートするプロトコルの指定。基本的にこれだけで記載した。

sockd.confは

logoutput: /var/log/sockd.log

ログの出力をファイルに指定して、

internal: x.x.x.x port = 1080
external: x.x.x.x

でPCから接続を受け付けるIP→internal、socksサーバーから出て行く通信の送信元IPアドレス→ externalで指定する。今回はinternal = external というように同じIPになった。仮想IPを割り振ってサーバーを運用してる場合でもこのinternalとexternalに同じようにどんどん併記していけばちゃんと1のアドレスから入った通信は1から出ていき、2のアドレスから入った通信は2から出て行くように動作していた。

# methods for socks-rules.
socksmethod: username none #rfc931

# methods for client-rules.
clientmethod: none

ここに後述する詳細ポリシー設定の際に使用するアクセス方法を記載しておく。ここに書いていないと後のポリシーの記述内で指定しても有効化されない。ちなみにclientmethodの記載はPCからsocksサーバまでの通信、socksmethodに関してはsocksサーバーから外部の宛先までの通信に適用される。

user.privileged: root
user.unprivileged: nobody

これらはsocksのサービスが稼働する際のユーザー権限の設定。でいいはず。

client pass {
from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
log: connect disconnect error
}

socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
protocol: tcp udp
user: AAAA
log: connect disconnect error
}

後はこれらのポリシーの設定をしてあげる。先も言ったようにclient passがPCからsocksサーバーまでの通信のポリシー、socks passがsocksサーバーからアクセス先サーバーまでの通信のポリシーとなる。上記ではclient passではすべてのアドレスからすべてのアドレスへすべてのポート番号で許可して、通信のログをちゃんとファイルに出力しますという指定だけしている。

socks passも同じく通信の制限はほとんど課さず。サポートするプロトコルをtcp、udpと指定して同じくログ出力の記述。登録されたユーザーだけが使えるようにsocks pass内にmethod: username を追記して終わりかと思ってたが、なんでかうまく動作しない。数時間トライしたが、最終的にmethod: usernameではなく、user: <ユーザー名> というふうに記載したらとりあえずユーザー認証が正常に動作してくれた。

ffftpでsocksの指定をしてユーザー名、パスワードを設定してちゃんとftpサーバーに接続出来た。socksサーバーのユーザー名、パスワードを削除して接続しようとしても接続失敗するのも確認してとりあえず設定完了。

多分こんな感じでいいはずだ。。。

で、結局テストのみで最終的に使うことなく終わる。勉強する機会を与えて頂いてありがとうございました。。。これがなければ触る機会はなかったな。。。

以下参考にさせてもらいました。

danteでSocks Proxy — command not found:
SOCKSサーバ Dante インストール – moremagicの日記
↑ インストールに関して。日本語サイト。

sockd.conf(5): Dante server config file syntax – Linux man page
↑ 英語サイトだけどconfファイルのオプションの説明詳細が豊富。本家サイトのドキュメントより役に立つ。