メールサーバの移行

イメージ
 自前のメールサーバを停止 これまで、自ドメインのメールサーバはVPS上に構築していた。 ・Ubuntu Server ・Postfix ・Dovecot ・spamAssassinと、BlackListの利用 Spam対策を行ってきたし、サーバ上でメールをトリガーにして各種プログラムを動かしたりしてきた。 メールサーバのメンテナンスは結構面倒くさくて、  ・Disk容量のチェック  ・不正アクセスのチェック  ・各種セキュリティパッチの適用 など、手間がかかる。 そこで、外部のサーバを利用することに…。 結構安くて使い勝手の良さそうなのが、「さくらのメールボックス」 3年契約で、3070円とな…。  メールアドレスは自分のだけなので、20GBまで利用可能!  (Gmailより大きいねぇ) ということで、早速契約。 アカウント設定を行って、既存のDNSを書き換える。WHOISも書き換えて完了。 SMTPとIMAPが利用できればOK。 ちょうど、GoogleがSPF設定していないと受信しないし、DKIMおよびDMARCに対応していないメールを弾くようになったので、対応しているのを確認。 さくらサーバ自体は、これまでお客さんのサーバとして何件も利用しているので、利用方法も難しくはない。  Webメールにも対応しているので、いざという場合にもありがたい。 ということで、各メールソフトの設定を変更。  PC(常時使用する3台)とタブレット、スマートフォンと台数は多いがそれ程手間はかからない。 問題は、旧サーバで送受信したメールの履歴だけれど、これはThunderbrdを使ってローカルに保存することで回避。  本当は、サーバtoサーバでMailboxに残そうとも考えたんだけど、古いメールはそれ程必要ないし、ローカルにバックアップしてあれば凌げるので、良しとする。 移行時にDNSの反映で若干時間がかかったものの、問題なく送受信できるのを確認して、作業完了。  これでメンテナンスの手間が減るので、安いもんです。

proxyのufwで苦戦

ubuntuをproxyに設定

今回は、無線LANルータが1台設置されていたのだけれど、無線は減らしていきたいのと、細かなコントロールが、逆に面倒なのでLinuxマシンをルータ兼proxyとして動作させることにした。

過去、Vine LinuxやRedHat、CentOSなどをよく使っていたのだけれど、最近非常に使い勝手が良くなっているのと、ちょうどLTS版の12.04が出て、そろそろ不具合も改善されている頃なので、思い切って利用して見ることにした。
もちろん、デスクトップ版は11.10も11.04も…結構使ってきているので、別に心配はしていないんだけどね。

さて、ubuntuをインストールして、eth0は外向け、eth1は内部で192.168.0.1とする。さらにWindows Serverは192.168.0.2として、Windows Serverからしか問い合わせに答えない設定を多々するかたちで…。
あとは、dnsmasqとsquid,squidGuardを入れて、先のntpサーバとしても利用する。

そんなに奇をてらった設定ではないので、楽勝かと…。

ufwを調べて設定する

以前は、iptablesを利用してマスカレードしたり、ポート塞いだり、開けたりというのが、ごく一般的でしたが、9.10の頃からufwなんてツール(iptablesのwrapper)が利用できるようになっております。
これまで、縁がなかったのだけれども、簡単に設定できるらしいという情報は掴んでいたので、こいつを使って設定してみる。

いちいちsudoは面倒なので、最初にrootに上がって作業することに。

$ sudo -s
# ufw reset
# ufw enable
# ufw allow proto udp from 192.168.0.2/32 to any port 53
# ufw allow proto tcp from 192.168.0.0/24 to any port 3128
# ufw allow proto tcp from 192.168.0.2/32 to 192.168.0.1 port 5900
# ufw disable && ufw enable
# ufw status

ほう、まあ簡単やね。
ただ、masqueradeを設定するには、設定ファイルを直接書かないといけないということで、まずは/etc/default/ufw

DEFAULT_FORWARD_POLICY="DROP"

DEFAULT_FORWARD_POLICY="ACCEPT"
に変更。

続いて、/etc/sysctl.confの

#net/ipv4/ip_forward=1
がコメントアウトされているので、#を削除。

最後に/etc/ufw/before.rulesに修正を加える。

# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be proceessed
COMMIT

これを最初のコメントブロックの後に書き込めと…。

すべての作業が終わったら、
# ufw disable && ufw enable
これで完了。

ところが…

自宅で設定した感じでは、特に問題は無さそうだったんだけど…。
現地では、eth0側は光を使っているので、pppoeで接続する。
そこで、pppoeconfを使って設定をしてやることで、接続はできた。OK簡単だ。
eth0側がppp0だと表示がされる。

この時、ネットワークマネージャを利用して設定しておけば、良かったのかもしれない。
あとで調べてみると、古い設定方法だと書かれているじゃないですか…。

このマシンから外部への接続はOK。ブラウザも利用できるし、pingも通る。

なのに、内部のマシンから、どうも様子がおかしい…。外部への接続が通らない。
といっても、これ以上触りようがない。

結構すったもんだした挙句、基本通りに初めからやり直すことに。
しかも、wrapperなんて使わずに、iptablesで書きなおすことにした。で@ITなんかからサンプルを引っ張りだして、その場でカキカキ…。とりあえずiptables.shを作成してテストすることに。


#! /bin/sh
trusthost='192.168.0.2'
internal_ip='192.168.0.0/24'
my_internal_ip='192.168.0.1'
if_inner='eth1'
if_outer='eth0'
echo 1 > /proc/sys/net/ipv4/ip_forward
##############
#Flush & Reset
##############
iptables -F
iptables -t nat -F
iptables -X
##############
#Deafult Rule
##############
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A FORWARD -i $if_inner -o $if_outer -s $internal_ip -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#########
#loopback
#########
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#########
#icmp
#########
iptables -A FORWARD -i $if_inner -p icmp -j ACCEPT
#######################
#dns internal-> myhost
#######################
iptables -A INPUT  -p udp -s $internal_ip --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -d $internal_ip --sport 53 -j ACCEPT
iptables -A INPUT  -p tcp -m state --state NEW -s $internal_ip --dport 53 -j ACCEPT
#######################
#squid internal-> myhost
#######################
iptables -A INPUT  -p tcp -s $internal_ip --dport 3128 -j ACCEPT
#######################
#vnc
#######################
iptables -A INPUT  -p tcp -s 192.168.0.2 -d 192.168.0.1 --dport 5900 -j ACCEPT
#######################
#mail
#######################
iptables -A FORWARD -p tcp -s $internal_ip --dport 110 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 995 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 25  -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 587 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 465 -j ACCEPT
#######################
#windows update?
#######################
iptables -A FORWARD -p tcp -s $internal_ip --dport 443 -j ACCEPT
#################
#SNAT(masquerade)
#################
iptables -t nat -A POSTROUTING -o $if_outer -s $internal_ip -j MASQUERADE
################################################
#Outgoing packet should be real internet Address
################################################
iptables -A OUTPUT -o $if_outer -d 10.0.0.0/8 -j DROP
iptables -A OUTPUT -o $if_outer -d 176.16.0.0/12 -j DROP
iptables -A OUTPUT -o $if_outer -d 192.168.0.0/16 -j DROP
iptables -A OUTPUT -o $if_outer -d 127.0.0.0/8 -j DROP
#########
#logging
#########
iptables -N LOGGING
iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
iptables -A LOGGING -j DROP
iptables -A INPUT -j LOGGING
iptables -A FORWARD -j LOGGING

問題点がわかった!

このスクリプトを使っても、上手くいかない。もちろん、もっと削って1ブロックずつ試したりしているんだけど…。

結論から言うと、外側のinterfaceの扱いが間違っていた。
if_outer='eth0'
と書いていたのだけれど、
if_outer='ppp0'
にすれば、全部OKだった。

物理的には、eth0が外部につながっているんだけど、どうやらppp0で設定する必要があるらしい。
いままで、ルータ内部でしかiptablesを設定したことがなかったので、気づかなかった。

ということは、ufwでも同様だったのかもしれないけれど、もう動くようになったものを再度設定し直す勇気も気力もないので…。

これでOKとしましょう。
あとは忘れず、
#service iptables-save
で保存をかけておきます。

思い込みはやっぱり面倒ですな。おかげで半日無駄に過ごしました…。


コメント

このブログの人気の投稿

WPS Officeで日本語入力ができない

VirtualBoxでUSBから起動

Virtualboxとnvidiaドライバ