Top / test / Ubuntu 10.04 LTS Server / GWserver01

GW用のサーバーを作成

今度は、外部に出すサーバーの前にGW用のサーバーを作成する。
ここでは、下記のようなサービスを外部に提供する。

  • iptablesによる外部からの進入の阻止
  • 外部からの受信メールのリレー(postfix)
  • あわよくば、メールのAntiVirus,AntiSpamなども実行
  • nginxによるリバースプロキシでのhttpの外部提供
  • ssh待ちうけ(鍵認証を基本)
  • うまくいけば、openVPN辺りのVPN
  • submissionやsmtpsは内部メールサーバーに DNAT

外部からのsshポートの変更

外部から接続するときに22番のままだと危険なので、待ちうけポート番号を変更する。

ポートを111に変更するには、下記のようにsshd_configのファイルを書き換えて、sshdを再起動する。

$ sudo diff -uN /etc/ssh/sshd_config.orig /etc/ssh/sshd_config
[sudo] password for kensuke:
--- /etc/ssh/sshd_config.orig   2010-07-05 11:54:31.902345397 +0900
+++ /etc/ssh/sshd_config        2010-07-05 12:36:41.598463075 +0900
@@ -2,7 +2,7 @@
 # See the sshd_config(5) manpage for details

 # What ports, IPs and protocols we listen for
-Port 22
+Port 111
 # Use these options to restrict which interfaces/protocols sshd will bind to
 #ListenAddress ::
 #ListenAddress 0.0.0.0
$ sudo /etc/init.d/sshd restart

ssh鍵認証の設定

sshでのログインを鍵認証でできるように設定する。 鍵認証の鍵の方式には、RSAとDSAがあるが、RSA方式のほうが安全性が高いらしいので、RSAを使用する。 だけど、DSAのほうが暗号鍵のbit数が多く設定できる(?未確認)なので、強度が高い(?これまた未確認)

とりあえず、DSAで行くことにする。

ログインするユーザーで下記を実行する。

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_dsa.
Your public key has been saved in /home/user/.ssh/id_dsa.pub.
The key fingerprint is:
eb:91:50:bf:91:XX:XX:XX:b6:e9:cc:e4:XX:XX:XX:XX user@hostname

/.ssh以下に、id_dsa(秘密鍵) と id_dsa.pub(公開鍵) の二つができる。

わかりにくいが、公開鍵はサーバー側、秘密鍵をクライアント側におく必要がある。

まずは、公開鍵をサーバー側にセットする。 (ファイルの名前は、sshd_configに書かれているものにそろえる)

$ cat id_rsa.pub >> $HOME/.ssh/authorized_keys
$ chmod 600 authorized_keys

次に、秘密鍵を安全な方法で、安全なクライアントにcopyをする。 クライアント側にcopyして、クライアントソフトごとに指定された方法で格納する。(具体的な方法は、次の項目で。)

sshdサーバーの設定で、passwordを使用したログインを禁止するには、下記のように設定をする。

# diff -uN sshd_config.bk1 sshd_config
--- sshd_config.bk1     2010-07-05 12:36:41.598463075 +0900
+++ sshd_config 2010-07-06 17:21:32.670477641 +0900
@@ -48,6 +48,7 @@

 # Change to no to disable tunnelled clear text passwords
 #PasswordAuthentication yes
+PasswordAuthentication no

 # Kerberos options
 #KerberosAuthentication no

設定後、sshdを再起動して、パスワード認証で接続してみて蹴られて、鍵認証で無事通過したら正しく設定できたということになる。

秘密鍵をputtyで使用できるように変換

OpenSSHで作成した鍵を、puttyで利用するには、変換が必要となる。 PuTTYからは、putty.exe と同じディレクトリにある puttygen.exe を実行する。

メニューのインポートで、opensshの秘密鍵を指定すると、変換が始まり、秘密鍵の保存を行うと、putty形式の秘密鍵の保存が可能になる。

#どこに、どんな名前で保存するのがいいの? とりあえず、C:\Users\[自分] 以下の適当な場所に保存しておいた。

Firewallの設定

今回は、ubuntu的流儀に従って、ufwを使用することにする。 ufwは、今はiptablesのフロントエンドみたいなもの。(将来は別のフィルターになるかも)

基本的には、厳しいポリシーにしたいので、下記の方針で進める。

  • 基本的には全てdeny
  • 必要なサービスは通す。
  • LAN内には現状では、全て通すように設定する。
  • 怪しいパケットを見るために、既知のもの(sambaなどのパケット)以外は記録することにする。

まずは、全てのパケットを通さないように設定する。(注意! sshのセッションは最低ひとつは確保しないと、どこからもつながらなくなってしまいます。)

ufwを有効化する。そして基本的にdenyとする。

$ sudo ufw enable
$ sudo ufw default DENY

次に、必要なサービス(ssh)を通すようにする。パッケージでインストールしたものは、ルールが提供されているかもしれないので、下記のコマンドを実行して、確認する。

$ sudo ufw app list
存在するアプリケーション:
 OpenSSH

そのまま利用できる場合には、

$ sudo ufw allow app OpenSSH

で、必要なポートが通るようになる。

ただし、今回は、ポート番号などをカスタマイズしたために、定義を変更しないといけない。

$ cd /etc/ufw/applications.d
$ sudo cp -rp openssh-server openssh-server_custom
$ sudo vi openssh-server_custom

下記のように、カスタマイズを openssh-server_customに施す

# diff -uN openssh-server openssh-server_custom
--- openssh-server      2010-05-20 01:31:47.000000000 +0900
+++ openssh-server_custom       2010-07-06 17:53:56.419647494 +0900
@@ -1,4 +1,4 @@
-[OpenSSH]
+[OpenSSH_custom]
 title=Secure shell server, an rshd replacement
 description=OpenSSH is a free implementation of the Secure Shell protocol.
-ports=22/tcp
+ports=111/tcp

これを利用して、穴を開ける。(limitとして、ある程度の制限をつける。)

$ sudo ufw limit OpenSSH_custom
$ sudo ufw status numbered

で、正しく意図したとおりになっているかを確認する。

次に、LAN側からのアクセスを許可する。

$ まだ考え中。

サーバーを再起動しても、同じ状態で起動するので、これでひとまずは完了。

悪さをするパケットについては、/var/log/syslogに記録される。(これについてのカスタマイズもまたあとで)

syslog関係を探していたら、 /var/log/ufw.log にパケットのログは集められていることが分かった。

ついでに、rsyslogがsyslogデーモンだった。

忘れないようにコマンド一覧

状態の表示

sudo ufw status

ufwの使用開始

sudo ufw enable

基本設定

sudo ufw default DENY

許可の方法

sudo ufw allow ssh

許可の削除の方法

sudo ufw delete allow 22/tcp 

ログの記録 /var/log/syslogへの記録の頻度

sudo ufw logging low(off medium high full)

サービスの一覧

sudo ufw app list

サービスを指定して、許可

sudo ufw allow Samba

設定される場所

/lib/ufw/user.rules に書き込まれる

設定の順序の表示

sudo ufw status numbered

順序を指定して設定

sudo ufw insert 1 limit from 192.168.254.20 to any port ssh

参照 : http://gihyo.jp/admin/serial/01/ubuntu-recipe/0077

syslogに定期的にMARKを出力させる方法

debianみたいに、syslogに --MARK-- が出ているとサーバーが停止した場合などにいつからなのかが追いやすくてわかりやすい。そのために出力されるように設定をしてみる。

lucidでは、rsyslogが使用されているので、昔のdebianみたいにはいかないようである。

探してみると、immark.soがあると MARKが出るという記述を発見。

下記のようにして、試してみた。

immark.confというのを下記のような名前と内容で作成してみた。

# cat /etc/rsyslog.d/51-immark.conf
#  Default rules for rsyslog.
#
#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

$ModLoad immark

そして、マシンを再起動。 すると、/var/log/messages に見慣れた -- MARK -- が表示されるようになった。

でも、よく見たら、/etc/rsyslog.confに コメントしてあるのがあるので、 51-immark.confは消して、rsyslog.confのコメントをはずしてみた。

# diff -uN rsyslog.conf.orig rsyslog.conf
--- rsyslog.conf.orig   2010-02-25 03:26:36.000000000 +0900
+++ rsyslog.conf        2010-07-07 22:41:44.999769358 +0900
@@ -12,7 +12,7 @@

 $ModLoad imuxsock # provides support for local system logging
 $ModLoad imklog   # provides kernel logging support (previously done by rklogd)
-#$ModLoad immark  # provides --MARK-- message capability
+$ModLoad immark  # provides --MARK-- message capability

 $KLogPath /proc/kmsg

そして、再起動。 すると、/var/log/messages に見慣れた -- MARK -- が表示されるようになった。

Apparmor

syslogを見ていたらどうも、見慣れないlogが出ているので、もしやとおもったらやはり、server版では動いていた。

現状の状態

$ sudo apparmor_status
[sudo] password for kensuke:
apparmor module is loaded.
5 profiles are loaded.
5 profiles are in enforce mode.
   /sbin/dhclient3
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/connman/scripts/dhclient-script
   /usr/sbin/ntpd
   /usr/sbin/tcpdump
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/ntpd (872)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.

あとから関係してきそうなので、 参照 : https://wiki.ubuntulinux.jp/Nimu/AppArmor

というか、dhclientなんていらないし。(消そうとしたけど、依存関係で消せないので、あきらめる。)

sysvinitではなく、upstart

そういえば、何かの雑誌で読んだのだが(なんだったか忘れた)、起動時のinitがupstartというものになっている。今まで慣れていたsysvinitではないらしい。

そのため、起動がとても早くなっている。今はまだ /etc/init.d とか /etc/rc2.d とかがあるが upstartではなくしていく方向らしいので、これからは service コマンドを使用するようにして行こうと思う。

MAC OSXの launchd よりも init互換性が高い。(ので変わったことに、気が着かなかった。)

nginxでリバースプロキシ

まずは、インストール

# apt-get install nginx

https://help.ubuntu.com/community/Nginx/ReverseProxy#Nginx%20vhost%20proxy%20example に書いてあるような設定を行っていく。

まずは、nginxを81番ポートで立ち上げでから、確認をして変更をしていく方針とする。

ufwの設定を変更して、まずは81番ポートだけを空いているようにする。

# cd /etc/ufw/applications.d/
# diff -uN nginx.bk nginx
--- nginx.bk    2010-03-05 09:42:36.000000000 +0900
+++ nginx       2010-12-11 20:30:13.335403881 +0900
@@ -12,3 +12,8 @@
 title=Web Server (Nginx, HTTP + HTTPS)
 description=Small, but very powerful and efficient web server
 ports=80,443/tcp
+
+[Nginx Test]
+title=Web Server (Nginx, for test)
+description=Small, but very powerful and efficient web server
+ports=81/tcp

次に、ufwに穴を開けてアクセスを許可する。

# ufw allow "Nginx Test"

デフォルトの設定は不要なので、/etc/nginx/sites-enabled 以下の defaultは消しておく。これで、defaultは使用されないし、site-availableには残っている。

まずは、特定のサーバーへのアクセスを特定の内部IPにforwardする。

$ cat /etc/nginx/sites-available/test1
server {
       listen   81;
       server_name  www.example.com example.com;

       access_log  /var/log/nginx/test1.access.log;

       location / {
               root   /var/www/nginx-default;
               proxy_pass http://192.168.1.x:80;
       }
}

外部からアクセスして、問題ないようなのでよしとする。

次に、apacheでバーチャルドメインを実現しているサーバーに対してforwardする。

$ cat test2
server {
       listen   81;
       server_name  example.net example.jp

       access_log  /var/log/nginx/virtual.access.log;

       location / {
               proxy_pass      http://192.168.1.x/;
               include         /etc/nginx/proxy.conf;
       }
}
$ cat /etc/nginx/proxy.conf
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

設定ファイルは、debianのような形式で、/etc/nginxに存在しているので、これを設定して行けばよい。

変更後、正しい設定ファイルに出来上がっているかを nginx -tで確認する。

# nginx -t
the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful

エラーが出なかったら、そこで再起動。

問題がないようであれば、80番ポートに全て変更する。

/etc/ufw/before.rules を編集して、該当するportforwardを外す。 次に、

# ufw delete allow "Nginx Test" 

を実行して、81番への許可を取り消す。

# ufw allow "Nginx HTTP"

80番へ通信を許可する。

nginxを80番で上がるように設定を変更する。 再起動して、外部から問題なく表示できるかを確認して、完了。

受信用postfixの構築

目指すものは、必要なメールだけを受信して、不要なものは受信しない。 受信したものは、全てLAN内の別のサーバーに転送。 送信用のメールについては、通らないはず。(もしくは通ってもそのままスルーする方針)

まずは、postfixのインストール

# sudo apt-get install postfix

ここで、いくつか選ばないといけない。

  • インターネットサイト
  • スマートホストつきインターネット
  • サテライトシステム
  • ローカルのみ

とりあえず、慣れているインターネットサイトを選択。

その後、main.cfの下記の部分を修正

# diff -uN main.cf.orig main.cf
--- main.cf.orig        2010-09-16 22:09:10.726986127 +0900
+++ main.cf     2010-09-16 23:16:04.887289001 +0900
@@ -6,7 +6,8 @@
 # is /etc/mailname.
 #myorigin = /etc/mailname
-smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
+#smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
+smtpd_banner = $myorigin ESMTP mailserver
 biff = no
 # appending .domain is the MUA's job.
@@ -30,10 +31,28 @@
 myhostname = gw-test.local.kensuke.jp
 alias_maps = hash:/etc/aliases
 alias_database = hash:/etc/aliases
-myorigin = /etc/mailname
-mydestination = gw-test.local.kensuke.jp, localhost.local.kensuke.jp, , localhost
+#myorigin = /etc/mailname
+# input receive mail domain
 relayhost =
+local_recipient_maps =
+local_transport = error:local mail delivery is disabled
 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
 mailbox_size_limit = 0
 recipient_delimiter = +
 inet_interfaces = all
+
+# receive mail for admin account@firewall
+virtual_alias_maps = hash:/etc/postfix/virtual
+
+# for Mail GW
+mydestination =
+myorigin = east2.local.kensuke.jp
+relay_domains = east2.local.kensuke.jp, local.kensuke.jp
+parent_domain_matches_subdomains = debug_peer_list smtpd_access_maps
+smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination
+relay_recipient_maps = hash:/etc/postfix/relay_recipients
+transport_maps = hash:/etc/postfix/transport
+
+# for SPAM block
+smtpd_helo_required = yes
+disable_vrfy_command = yes

内容としては、どのメールも受け取らない。 ローカルは受け取らない。 ローカルアドレスは、virtualに指定したアドレスだけは、内部のサーバーに転送 リレーするドメインを指定。 外部から、リレーするドメインでしてしたもの以外のsubdomainは受け取らない。 relay_recipientsに指定したあて先のみ受け取り、transportに指定した先に転送>

# cat virtual
postmaster      postmaster@east2.local.kensuke.jp
abuse           abuse@east2.local.kensuke.jp
# cat relay_recipients
kensuke@east2.local.kensuke.jp  x
# cat transport
east2.local.kensuke.jp  smtp:[192.168.1.3]

これらの3つの設定ファイルは、postmapで更新する必要がある。

さらに、localの配送を停止するために、master.cfを変更する。

# diff -uN master.cf.orig master.cf
--- master.cf.orig      2010-09-16 22:09:10.448242571 +0900
+++ master.cf   2010-09-16 22:20:14.639748087 +0900
@@ -42,7 +42,7 @@
 error     unix  -       -       -       -       -       error
 retry     unix  -       -       -       -       -       error
 discard   unix  -       -       -       -       -       discard
-local     unix  -       n       n       -       -       local
+#local     unix  -       n       n       -       -       local
 virtual   unix  -       n       n       -       -       virtual
 lmtp      unix  -       -       -       -       -       lmtp
 anvil     unix  -       -       -       -       1       anvil

あとから追加 まずは、http://www.postfix-jp.info/trans-2.3/jhtml/BASIC_CONFIGURATION_README.html を確認して、postfixの基本設定を行う必要がある。

しかし、まずは http://www.postfix-jp.info/trans-2.3/jhtml/STANDARD_CONFIGURATION_README.html#firewall にしたがって、GWとしての設定を行う。

次に、http://www.postfix-jp.info/jhtml/uce.html にしたがって、SPAMをはじく設定を努力する。


以下をまずは変更する

smtpd_banner

これは、ききかじりでまだ試していないパラメーター

  • 「unknown_local_recipient_reject_code = 450」を「550」に変更しよう。「450」というエラーコードはtry again later(一定時間後に再試行)をあらわす。一方の「550」はreject mail(メールで拒否)を表している。
  • disable_vrfy_command=yes vrfyコマンドを無効にする。vrfyコマンドとはユーザーが存在するかどうか問い合わせるためのもの。無効にしておけば有効なメールアカウントが流出することを防げる。
  • smtpd_helo_required=yes helo/ehloコマンドを要求する。helo/ehloコマンドは接続元のホストを識別するためのコマンド。自らのホスト名を通知しない接続を拒否するように設定しておく。 reject_non_fqdn_sender reject_unverified_sender

ポートフォワード

# 外部からのための対処
iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT \
--to-destination $HTTP_IP
# 内部からのための対処
iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \
--to-source $LAN_IP
# fw自体からのための対処
iptables -t nat -A OUTPUT --dst $INET_IP -p tcp --dport 80 -j DNAT \
--to-destination $HTTP_IP

これを使用したら、無事中のサーバーを外からアクセスができた。 192.168.1.5(GW) 192.168.1.3(pop実体)の場合の例

-A PREROUTING -d 192.168.1.5/32 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.1.3
-A POSTROUTING -d 192.168.1.3/32 -p tcp -m tcp --dport 110 -j SNAT --to-source 192.168.1.5
-A OUTPUT -d 192.168.1.5/32 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.1.3

他に、 echo 1 > /proc/sys/net/ipv4/ip_forward を忘れないように。

次に、これをufwで実装できるかを確認。 とおもったら、 http://man.he.net/man8/ufw-framework に Port Redirections として出てた。

これらの設定は、/etc/ufw/sysctl.conf /etc/ufw/before.rules /etc/ufw/before.rules のファイルに書き込まれている。

PPTP

VPNとして、まずは簡単なPPTPを導入してみる。iphone用がメインかも。 内部サーバー側に設定をして試す。

# apt-get install pptpd

世の中に書いてあるように、

# cat /etc/ppp/pptpd-options
(ぜんぜん変更なし)
# cat /etc/pptpd.conf
(localip と remoteip を追加)
# cat /etc/ppp/chap-secrets
# client名 サーバ名 パスワード 接続元のIPアドレス
user1    pptpd   "yourpassword"       *

を記述した。そして、クライアント側で正しく設定をしたところ、うまくできた。

ちなみに、localipは、eth0と同じアドレスを指定したけどうまくいった。 簡単簡単。

外部サーバー(gw)で実現するのが良いのかも。


トップ   一覧 単語検索   最終更新のRSS
Last-modified: 2010-12-21 (火) 22:23:51 (2741d)