ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

CentOSでずれている時間を元に戻す

CentOSを再起動した後時間がずれている問題を対処する。

まずはシステム側の時刻確認
9時間ずれてる

date
2017年  2月 22日 水曜日 05:38:35 PST

ハードウェアクロックの時刻確認
ここも9時間ずれてる

hwclock
2017年02月22日 05時39分25秒  -0.251173 秒

改めてシステムクロック見るとタイムゾーンが「PST」ってなってる。

PST:太平洋標準時(UTC - 8時間)

これか。

現在のタイムゾーン確認
PSTなってる
※最終行が該当するぽい

strings /etc/localtime
TZif2
 v+ !
 2s$
3Gt 4S
5'V 62
mvG n
oV) p
TZif2
 v+ 
3Gt 
5'V 
mvG 
oV) 
PST8PDT,M3.2.0,M11.1.0

現在のをバックアップ

cp /etc/localtime /etc/localtime.20170222 

タイムゾーンファイル変更

ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

戻った

hwclock ; date                                                                                        
2017年02月22日 23時02分29秒  -0.141986 秒
2017年  2月 22日 水曜日 23:02:30 JST

ちなみに、ntp経由でシステムクロックを設定時は

ntpdate ntp.nict.jp

ハードウェアクロックを元に戻す場合は

hwclock -w    

という方法もあるけど、いずれの場合もタイムゾーンが違ってたら意味が無いので要注意。
ちょっとハマった

LinuxでLVSを用いてロードバランサ(DSR方式)の構築を行う。

LVSとはLinuxでの負荷分散(ロードバランサ)環境構築の為のソリューション。
ラウンドロビン方式や重みづけの設定が楽に行える。
注意点として、LVSでは負荷分散の為の振り分けこそ行うがサーバーダウン時の自動切り離し等の冗長化は行えない。
冗長化を行う為には、LVSをラッパーしたkeepalivedを使用するのが一般的。

参考
http://blog.idcf.jp/entry/cloud/keepalived/

今回は冗長化は行わず、単純なラウンドロビンでの負荷分散を行う。

また転送方式には代表的な所で下記2つがあるが、DSRを採用する。

NAT(Network Address Translation)
クライアントからパケットを受け取ると、送信先IPアドレスがリアルサーバーのものに置き換えられる。
LVSサーバーを必ず通るのでLVSサーバーの負荷が上がる。
Apache等のアクセスログでのIPアドレスは接続元のIPアドレスになる。

ダイレクト・ルーティング(DSR方式)
クライアントからのパケットを直接リアルサーバーに転送する。
IPアドレスなどは変更されないので、リアルサーバーはエンドユーザーに直接応答を送信する。
LVSサーバーの負荷は下がる。
リアルサーバーも直接クライアントと通信が出来ないといけない。
Apacheなどのアクセスログに残るのはLVSのアドレスになる?(未確認)
負荷分散を行う機器とサービスを提供するサーバは、同一のネットワーク上に置かなければならないという制限がある。

参考
http://k-1-ne-jp.blogspot.jp/2013/02/lvsipvsadm.html

環境

以下3台をVMwareで構築。

  • LBサーバー(LVSサーバー)

OS:CentOS6 
(eth0)IP:192.168.11.30
(eth1)IP:10.0.10.30

  • WEBサーバーA(リアルサーバー)

OS:CentOS6 
(eth0)IP:10.0.10.40

  • WEBサーバーB(リアルサーバー)

OS:CentOS6
(eth0)IP:10.0.10.111

一般的にロードバランサ構成の場合、ロードバランサ宛先側のバックエンドサーバーを実サーバー(リアルサーバー)というらしい。

手順

WEBサーバー2台での設定作業

デフォルトゲートウェイ設定

バックエンドのWEBサーバーではデフォルトゲートウェイをLBサーバーに設定する必要があるのでその設定。

networkファイル編集

[root@localhost ~]# vi /etc/sysconfig/network

LBサーバーのIPを指定

GATEWAY=10.0.10.30

デフォルトゲートウェイ設定後はサーバー再起動が必要ぽいので注意。

ネットワークインターフェイス毎にデフォルトゲートウェイが異なる場合は
/etc/sysconfig/network-script/ifcfg-eth*
に設定するらしい。
両方に記述しては駄目。

設定ファイル変更で反映されなかったのでrouteコマンドを実行。
※ネットワーク再起動やサーバー再起動で消えるらしいので注意

[root@localhost ~]# route add default gw 10.0.10.30

反映された

[root@web ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.10.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         10.0.10.30      0.0.0.0         UG    0      0        0 eth0
Apache環境構築

WEBサーバー2台にApacheをインストールし、それぞれのサーバーのレスポンスが分かるようなファイルを配置。
今回は取り敢えず動作確認が取れればいいので簡単にyumでインストール

インストール

yum install -y httpd

起動

/etc/init.d/httpd start

index.htmlファイル配置

WEBサーバーA

echo server111 > /var/www/html/index.html       

WEBサーバーB

echo server40 > /var/www/html/index.html

index.htmlにアクセスすると以下のようにサーバーが分かる。

curl http://localhost
server40

最後に、リアルサーバーでiptables設定。
下記のIPはLVSサーバーのIPを指定する。
※この設定はDSR方式の場合のみなので、NAT方式の場合は不要

iptables -t nat -A PREROUTING -d 10.0.10.30 -j REDIRECT  

80番ポートも解放

iptables -A INPUT -p tcp ---sport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

LBサーバーでの作業

ipvsadmのインストールと設定を行う。
ipvsadmとはIPVS(IP Virtual Server)を制御するためのツール。 仮想サーバグループの追加やリアルサーバの割り当てができるほか、 現在の接続状況や転送レートの表示などができる。
IPVSadministratorの略?

ipフォワード設定

ipvsadmの設定前に、まずはipフォワードの設定を許可します。
設定

vi /etc/sysctl.conf

値を1に設定する。

net.ipv4.ip_forward = 1

IPv4 転送を有効にする設定。
異なるセグメント間のネットワークを有効にするイメージ。
下記記事が参考なる。
http://d.hatena.ne.jp/eco31/20110221/1298260941

ipv6に対応しない為、下記をコメントアウト

#net.bridge.bridge-nf-call-ip6tables = 0
#net.bridge.bridge-nf-call-iptables = 0
#net.bridge.bridge-nf-call-arptables = 0

設定を反映
※sysctlはカーネルの内部状態を設定、参照するための機能

[root@localhost ~]# sysctl -p

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
ipvsadmインストール設定

ipvsadm インストール

yum -y install ipvsadm

ipvsadm起動

/etc/rc.d/init.d/ipvsadm start

ipvsadmを起動スクリプト自動起動設定

chkconfig ipvsadm on 

仮想サービステーブルをクリア

ipvsadm -C

仮想サービスを登録。
今回は実際のLBサーバーのIPを指定してるけど仮想IPを割り当てるのが一般らしい。
IPアドレス、ポート番号、プロトコルで一意となるようにする。
ここで指定するIPは自身のローカルIP。
「-t」をつける事で、<アドレス>:<ポート番号>と指定できる。
「-s」で分散方法を指定、デフォルトの「wlc: 重み付け最小コネクション数」を使用する。

ipvsadm -A -t 10.0.10.30:80 -s wlc

※参考までに、NAT方式で転送する場合
同一セグメントにはできない為

ipvsadm -A -t 192.168.10.30:80 -s wlc

実サーバーを登録
「-a」で実サーバーを登録
「-t」で仮想サービスを指定
「-r」の後ろに実サーバーを指定
転送オプションの指定として、「-g」でDSRを指定している。
他にも転送方法はあるので、詳細はmanで確認する。

ipvsadm -a -t 10.0.10.30:80 -r 10.0.10.40:80 -g 
ipvsadm -a -t 10.0.10.30:80 -r 10.0.10.111:80 -g 

※参考までに、NAT方式で転送する場合
転送オプションの指定として、「-m」でLVS-NAT(アドレス変換)を指定している。

ipvsadm -a -t 192.168.10.30:80 -r 10.0.10.40:80 -m 
ipvsadm -a -t 192.168.10.30:80 -r 10.0.10.111:80 -m 

仮想サービステーブルを確認

[root@lb ~]# ipvsadm -l 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.10.30:http wlc
  -> 10.0.10.40:http              Masq    1      0          0         
  -> 10.0.10.111:http             Masq    1      0          0   

設定を保存

/etc/rc.d/init.d/ipvsadm save

iptables設定

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT

iptables -A OUTPUT -p tcp  --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp  --sport 80 -j ACCEPT

他サーバーから疎通確認
別でIPが10.0.10.50のクライアント・サーバーを立てて、そちらからアクセス。
ロードバランスされている
今回はラウンドロビンなので交互にアクセスされてる

[root@localhost ~]# curl http://192.168.10.30
server40
[root@localhost ~]# curl http://192.168.10.30
server111

試しにWEBサーバーBをダウンさせてみる。
冒頭で触れた通り、LVS冗長化には対応してないので、ダウンしてようがアクセスが行く。
冗長化対応の為には別途keepaliveインストールが必要。

[root@localhost ~]# curl http://192.168.10.30
server40
[root@localhost ~]# curl http://192.168.10.30
curl: (7) couldn't connect to host

ハマった所

LVS環境構築後、curlアクセスで固まった場合

curlで固まる場合は、LBサーバーとWEBサーバーどちらかのiptables設定でdropされてる可能性大。
iptablesの設定でDropしたパケットはログ出力する等して地道にポート開放設定すべし。

こんな感じでwebサーバー側のiptablesでINPUTがDropされてる事がある。

Feb 15 19:46:29 web kernel: Dropped by INPUT: IN=eth0 OUT= MAC=00:0c:29:5c:ba:fd:00:0c:29:73:76:73:08:00 SRC=192.168.10.30 DST=10.0.10.40 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=21323 DF PROTO=TCP SPT=45687 DPT=80 WINDOW=65495 RES=0x00 SYN URGP=0 

この辺でかなりハマった・・・

上記でも解決しない場合

WEBサーバー側でDSR のバランシングに応答するため、LBサーバーとサーバーへのパケットをリダイレクト処理。

iptables -t nat -A PREROUTING -d 10.0.10.30 -j REDIRECT  

但しこの設定は振り分け設定を下記のようなオプション「-g」でDSRとした場合のみ。
「-m」でのnatの場合は不要

ipvsadm -a -t 10.0.10.30:80 -r 10.0.10.111:80 -g 
実サーバー登録時にエラー

以下のようなエラーが・・・

ipvsadm -A -t 10.0.10.30:80 -s wl
Scheduler or persistence engine not found

ちょっとハマったけど、単純に分散方法の指定がおかしい。
最後のcが足りなかった・・・
イージーミス
下記で解決。

ipvsadm -A -t 192.168.10.30:80 -s wlc

やり残し&続いてやる事

LBサーバーからのアクセス、実サーバー自身からのアクセス時にレスポンスが返ってこない

…何言ってるかわからないと思いますが。

1.LBサーバーから下記のようにアクセスするとレスポンス返ってこない

curl http://10.0.10.30

2.例えば、10.0.10.40サーバーから下記でアクセスした場合、かつ内部的に10.0.10.40自身にロードバランサされた時にレスポンスが返ってこない
(別サーバー10.0.10.111にロードバランサされた時はレスポンスある)


恐らくだけど、下記が理由?
http://qiita.com/nagais/items/b9b1940cdaf9a17b4088
>同一筐体だとLVSMaster機が初回に処理した時にARP登録され、次回以降のリクエストがLVS通らず直接ARP登録されたインターフェースへいくのでダメ。。

んー、違うかも。
これはちょっと調査必要かも。

keepalivedを使用して冗長化構成構築

後日やってみます

メモ

今回、LVSのDSRでロードバランサなのですが、NAT構成の場合LVSのサーバとアプリケーションサーバが同一のネットワークセグメントに存在すると振り分けがうまくいかないらしいので、LBサーバーでは2枚NICを挿すか、trunkやIPエイリアスを用いてネットワークが2つある構成に無いといけないみたいなので要注意。

http://hryksbt.b.osdn.me/archives/273

自宅サーバーのCentOSでメールサーバーの環境構築(Postfix+Dovecot)

自宅サーバーのVMware上のCentOSPostfix+Dovecotを使用したメールサーバーを構築する。
PostfixSMTP認証にはCyrus SASLを使用。

※この記事は自分用作業ログとなり、参考にならないと思いますのでご注意下さい

環境

ファイアウォールルーター
ゲストOS:CentOS6.6(VMWare
IP:192.168.10.30
IP:10.10.0.30
ドメインvmware.local
※同サーバーのDNSサーバーで設定

・メールサーバー
ゲストOS:CentOS6.6(VMWare
IP:192.168.10.40
IP:10.10.0.40
ドメイン:mail.vmware.local

・自宅プロパイダ
OCN

上記ドメインはLAN内でのみ有効なドメイン
自宅サーバーにグローバルなドメインは設定されてない。

やりたかった事、注意点

test@mail.vmware.local
というアドレスを作成して

@gmail.com

にメールを送信、逆も出来るように。

・・・と思っていましたが、
自宅サーバーにグローバルなドメインが設定されていない場合、上記は実現出来ない。
理由として、mail.vmware.localのドメインがLAN内のみ有効で世界のインターネット上では名前解決出来ない為。

更に言うと、自宅サーバーのプロパイダによってはOP25B対策がされており、25番ポートへのアクセスを閉じられている為、その対応が必要になるみたい。
※参考
http://www.walbrix.com/jp/blog/2014-02-gentoo-postfix-relay-gmail.html

結論から言うと、
SMTPサーバー(メール送信処理)を自宅のメールサーバーに設定しメール送信を出来るようにする。
但し、メールリレーによりメール送信処理をプロパイダに委譲する。
メール送信元アドレス、メール送信先アドレスはgmail等の実際に存在するアドレスを指定する。

何か縛りが凄い・・

手順

Postfix+cyrus-sasl

postfixインストール

yum -y install postfix

Postfix設定ファイル編集

vi /etc/postfix/main.cf

追加

# メールサーバーのドメイン(FQDN)
myhostname = mail.vmware.local

# 自サーバーのドメイン
mydomain = vmware.local

# ローカルからのメール送信時の送信元メールアドレス@以降にドメイン名を付加する
myorigin = $mydomain

# メールボックス形式をMaildir形式にする
home_mailbox = Maildir/

# メールサーバーソフト名の隠蔽化
smtpd_banner = $myhostname ESMTP unknown

# 受信メールサイズ制限
message_size_limit = 10485760

バーチャルメールボックス用の設定追記

virtual_mailbox_domains = vmware.local
virtual_mailbox_base = /home/mailuser
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_alias_maps = hash:/etc/postfix/virtual

virtual_mailbox_domainsには受信するドメインを指定。
virtual_mailbox_baseにはバーチャルメールボックスユーザーを指定。
virtual_uid_mapsとvirtual_gid_mapsはバーチャルメールボックスユーザーのグループIDを指定。

SMTP認証をdovecotで行うための設定追記

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination


変更

#外部からのメール受信を許可               
inet_interfaces = all

# 自ドメイン宛メールを受信できるようにする
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

#ipv6で送信しないように
inet_protocols = ipv4 

追加
存在しないユーザー宛メールをunknown_userへ配送

local_recipient_maps =
luser_relay = unknown_user@localhost

unknown_user宛メールを破棄

echo unknown_user: /dev/null >> /etc/aliases

サブミッションポート(587)を有効にする。
サブミッションポートとは、TCP 25番ポート以外でメールの送信を行うためのポート。
SMTP認証(SMTP AUTH)」と併せて利用するのが一般的。
OBP25B(迷惑メール対策)の為に使用する。

master.cf を編集。

vi /etc/postfix/master.cf 

コメントアウトを外し以下のように設定
smtpd_tls_security_levelの行はコメントアウトのまま

submission inet n       -       n       -       -       smtpd                                                      
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes                                                                                    
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject                                                    
  -o milter_macro_daemon_name=ORIGINATING 

SMTP認証ファイルパスディレクトリ作成

mkdir -p /var/spool/postfix/private/auth

権限付与

chown postfix:postfix -R /var/spool/postfix/private/
chmod 700 -R /var/spool/postfix/private/

バーチャルメールボックスのエイリアスのデータベース更新

postmap /etc/postfix/virtual

cyrus-saslインストール

yum -y install cyrus-sasl
yum -y install cyrus-sasl-plain cyrus-sasl-md5

saslauthd起動

/etc/rc.d/init.d/saslauthd start

自動起動設定

chkconfig saslauthd on

SMTPAuthを利用する為、smtpd.confを修正。

vi /etc/sasl2/smtpd.conf

以下のように設定する

pwcheck_method: auxprop

Maildir形式メールボックスを作成する。
Postfixのメール格納形式は共有ディレクトリ形式(「/var/spool/mail/ユーザー名」というファイルに全てのメールが蓄積されていく形式)だが、アクセス性能改善及びセキュリティ強化の観点からMaildir形式へ移行する。

新規ユーザー追加時に自動でホームディレクトリにMaildir形式のメールボックスが作成されるようにする。

mkdir -p /etc/skel/Maildir/new/

パーミッション設定

chmod -R 700 /etc/skel/Maildir/

Postfix起動

/etc/rc.d/init.d/postfix restart

自動起動設定

chkconfig postfix on

iptablessmtpポート開放

iptables -A INPUT -p tcp --dport 25 -j ACCEPT

Dovecot

Dovecotインストール

yum -y install dovecot

10-mail.conf編集

vi /etc/dovecot/conf.d/10-mail.conf 

追加

# メールボックス形式をMaildir形式とする              
mail_location = maildir:~/Maildir

# ※OpenSSH+Chrootを導入している場合のみ 
valid_chroot_dirs = /home

10-auth.conf編集

vi /etc/dovecot/conf.d/10-auth.conf

コメントアウトを外す

!include auth-passwdfile.conf.ext

コメントアウトする

#!include auth-system.conf.ext

変更

# プレインテキスト認証を許可
# ※メールサーバー間通信内容暗号 ((OpenSSL+Postfix+Doveco))
disable_plaintext_auth = no

auth_mechanisms = plain login

10-ssl.conf編集

/etc/dovecot/conf.d/10-ssl.conf
# SSL接続無効
# ※メールサーバー間通信内容暗号化(OpenSSL+Postfix+Dovecot)導入必須
ssl = no

auth-passwdfile.conf.extファイルを編集

vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext

変更前

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

userdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot/users
}

変更後

passdb {
  driver = passwd-file
  args = /etc/dovecot/passwd                                                                                       
}

userdb {
  driver = passwd-file
  args = /etc/dovecot/passwd                                                                                       
}


dovecot.conf編集

vi /etc/dovecot/dovecot.conf

エラー時の調査用にデバッグモードに設定

auth_verbose = yes
auth_debug = yes


Dovecot起動

/etc/rc.d/init.d/dovecot start

自動起動設定

chkconfig dovecot on

iptablesでポート開放

iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT

メールユーザー作成

メールボックス用のグループとバーチャルメールボックスユーザーを作成
※ここではmailuserというグループ名とユーザー名としているが任意の名前でOK
グループIDを10000で指定しているが任意のIDでOK

groupadd -g 10000 mailuser
useradd -g 10000 -g mailuser -d /home/mailuser -s /sbin/nologin mailuser  

以後、メールアカウント追加時は下記作業から。

メールボックス定義ファイル作成

vi /etc/postfix/vmailbox

メールボックス メールボックスディレクトリパス
を追記。
メールアドレス:test@mail.vmware.local
メールアドレスディレクトリ:test
とする場合は

test@mail.vmware.local test

データベースを更新

postmap /etc/postfix/vmailbox

メール転送したい場合は下記ファイルに追記してデータベースを更新しますが、今回はメール転送は行わない為特に編集しません。
/etc/postfix/virtual

パスワードを作成します。
dovecot2からdoveadmというコマンドに変わったようです。
(dovecot1ではdovecotpw)
下記では「testpassword」というパスワードにハッシュアルゴリズム「HMAC-MD5」を使用してパスワードを生成しています。

doveadm pw -s HMAC-MD5 -p testpassword
{HMAC-MD5}3c4936f08f79f2bd70c0b42de4449f2286cfe22749d81c932bf2bc9e95bff4a2

パスワードファイルpasswd-fileを作成し、上記コマンドで生成したパスワードを登録します。

vi /etc/dovecot/passwd

追記

test@mail.vmware.local:{HMAC-MD5}3c4936f08f79f2bd70c0b42de4449f2286cfe22749d81c932bf2bc9e95bff4a2:502:10000:::::Maildir:/home/mailuser/Maildir/test/

※ユーザーIDとグループIDはpasswdファイルから確認する

cat /etc/passwd | grep mailuser
mailuser:x:502:10000::/home/mailuser:/sbin/nologin

メールボックスディレクトリ作成

mkdir -p /home/mailuser/Maildir/test/

権限付与

chown mailuser:mailuser -R /home/mailuser/Maildir/test/
chmod 700 -R /home/mailuser/Maildir/test/

telnetを使用してPOP3でログイン出来るか確認

telnet無い場合はインストール

yum -y install telnet

POP3ポート確認

telnet localhost 110

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
USER test@mail.vmware.local ←入力
+OK
PASS testpassword ←入力
+OK Logged in.

確認出来たらquitでログアウト。

telnetを使用してIMAPでログイン出来るか確認

telnet localhost 143

1 LOGIN test@mail.vmware.local testpassword ←入力(左端の1も忘れずに)
1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS] Logged in

2 list "" ←入力(左端の2も忘れずに)

3 LOGOUT ←入力(左端の3も忘れずに)

ログインできない場合は/var/log/maillogログを確認する。

メールでのSMTP認証用ユーザー名、パスワードとシステムのユーザー名、パスワードを別々にする。
※OS上のパスワードと同じで良いならこのコマンドは不要

echo testpassword | saslpasswd2 -p -u mail.vmware.local -c test 
  • p ... 上記のようにecho等使用してパイプでパスワードを設定(パイプモード)
  • u ... realm(ドメイン名)を指定、main.cfの「myhostname」の値と同じ
  • c 設定するユーザーを指定

SMTP認証用ユーザー名、パスワード確認

sasldblistusers2

test@mail.vmware.local: userPassword

削除する場合は

saslpasswd2 -u mail.vmware.local -d test

sasldb2所有グループをpostfixに変更※最初の1回のみ
※このコマンドは最初の1回のみ、次回からのユーザー作成時は不要。

chgrp postfix /etc/sasldb2

iptables設定

ファイアウォールルーター

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 110 -j DNAT --to 10.0.10.40
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 10.0.10.40
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 465 -j DNAT --to 10.0.10.40
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 587 -j DNAT --to 10.0.10.40

iptables -A FORWARD -m tcp -p tcp --dst 10.0.10.40 --dport 110 -j ACCEPT
iptables -A FORWARD -m tcp -p tcp --dst 10.0.10.40 --dport 25 -j ACCEPT
iptables -A FORWARD -m tcp -p tcp --dst 10.0.10.40 --dport 465 -j ACCEPT
iptables -A FORWARD -m tcp -p tcp --dst 10.0.10.40 --dport 587 -j ACCEPT

・メールサーバー

iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 587 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.10.0/24 --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.10.0/24 --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.10.0/24 --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.10.0/24 --dport 587 -j ACCEPT

iptables -A OUTPUT -p tcp -d 192.168.10.0/24 --sport 110 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.10.0/24 --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.10.0/24 --sport 465 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.10.0/24 --sport 587 -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.10.0/24 --sport 110 -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.10.0/24 --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.10.0/24 --sport 465 -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.10.0/24 --sport 587 -j ACCEPT
メール送信時エラー出たらmaillogを確認

メッセージが出た場合はログ確認

less /var/log/maillog
maillogエラー1

下記エラー出たけどmain.cf編集で解決した。

Feb  9 05:47:32 web dovecot: pop3-login: Aborted login (no auth attempts): rip=192.168.10.106, lip=10.0.10.40
Feb  9 05:47:32 web postfix/smtpd[59191]: connect from unknown[192.168.10.106]
Feb  9 05:47:32 web postfix/smtpd[59191]: warning: SASL: Connect to private/auth failed: Connection refused
Feb  9 05:47:32 web postfix/smtpd[59191]: fatal: no SASL authentication mechanisms
Feb  9 05:47:33 web postfix/master[58757]: warning: process /usr/libexec/postfix/smtpd pid 59191 exit status 1
Feb  9 05:47:33 web postfix/master[58757]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

/etc/postfix/main.cf
を以下のように変更

変更前

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

変更後

smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd
maillogエラー2

下記エラーの場合はpasswdに設定したパスワードとsaslpasswd2に設定したパスワードに差異がある可能性あり。

Feb  9 22:14:06 web postfix/smtpd[59778]: connect from unknown[192.168.10.106]                                     
Feb  9 22:14:06 web postfix/smtpd[59778]: warning: SASL authentication failure: Password verification failed       
Feb  9 22:14:06 web postfix/smtpd[59778]: warning: unknown[192.168.10.106]: SASL PLAIN authentication failed: authentication failure                                                                                                  
Feb  9 22:14:06 web postfix/smtpd[59778]: warning: unknown[192.168.10.106]: SASL LOGIN authentication failed: authentication failure                                                                                              
maillogエラー3

thunderbirdでメール送信されたけどメール受信されない。

/var/log/maillogではメール送受信ログある

Feb  9 22:50:18 web postfix/local[60127]: 8CF973158: to=<test@mail.vmware.local>, relay=local, delay=0.12, delays=0.07/0.03/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)

Feb  9 22:50:20 web dovecot: auth: Debug: master out: USER#011679870465#011test@mail.vmware.local#011uid=502#011gid=10000#011mail=Maildir:/home/mailuser/Maildir/test/

メールボックスディレクトリは空

ls -lht /home/mailuser/Maildir/test/new/                                                             
合計 0

ls -lht /home/mailuser/Maildir/test/cur/                                                             
合計 0

spool側にも届いてない

ls -lht /var/spool/mail/mailuser 
-rw-rw----. 1 mailuser mail 0  2月  8 20:15 2017 /var/spool/mail/mailuser

問題切り分けの為、postfixの設定でsmtpを一旦無効にして
/etc/postfix/main.cf

smtpd_sasl_auth_enable = no

再度メール送信

iptablesで25番ポート落とされてるぽい?

Feb  9 23:20:13 web kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=10.0.10.40 DST=108.177.97.26 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=45754 DF PROTO=TCP SPT=51835 DPT=25 WINDOW=14600 RES=0x00 SYN URGP=0 
Feb  9 23:20:14 web kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=10.0.10.40 DST=108.177.97.26 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=45755 DF PROTO=TCP SPT=51835 DPT=25 WINDOW=14600 RES=0x00 SYN URGP=0 
Feb  9 23:20:16 web kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=10.0.10.40 DST=108.177.97.26 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=45756 DF PROTO=TCP SPT=51835 DPT=25 WINDOW=14600 RES=0x00 SYN URGP=0

認証パスワード作

[root@web ~]# printf "%s\0%s\0%s" test@mail.vmware.local test@mail.vmware.local testpassword | openssl base64 -e | 
tr -d '\n'; echo                                                                                                   
dGVzdEBtYWlsLnZtd2FyZS5sb2NhbAB0ZXN0QG1haWwudm13YXJlLmxvY2FsAHRlc3RwYXNzd29yZA==


成功例??

[root@web ~]# telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.vmware.local ESMTP unknown
EHLO mail.vmware.local
250-mail.vmware.local
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN dGVzdEBtYWlsLnZtd2FyZS5sb2NhbAB0ZXN0QG1haWwudm13YXJlLmxvY2FsAHRlc3RwYXNzd29yZA==
235 2.7.0 Authentication successful
quit
221 2.0.0 Bye
Connection closed by foreign host.

認証はOK
続いて送信

[root@web ~]# telnet localhost 587                                                                               
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.vmware.local ESMTP unknown
EHLO mail.vmware.local
250-mail.vmware.local
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN dGVzdEBtYWlsLnZtd2FyZS5sb2NhbAB0ZXN0QG1haWwudm13YXJlLmxvY2FsAHRlc3RwYXNzd29yZA==
235 2.7.0 Authentication successful
mail from:test@mail.vmware.local
250 2.1.0 Ok
rcpt to:test@mail.vmware.local
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject testtitle
honbun
.
250 2.0.0 Ok: queued as 345B3315C
quit
221 2.0.0 Bye
Connection closed by foreign host.

ドメインアドレスにメール送信

[root@web ~]# telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.vmware.local ESMTP unknown
EHLO mail.vmware.local
250-mail.vmware.local
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN dGVzdEBtYWlsLnZtd2FyZS5sb2NhbAB0ZXN0QG1haWwudm13YXJlLmxvY2FsAHRlc3RwYXNzd29yZA==
235 2.7.0 Authentication successful
mail from:test@mail.vmware.local
250 2.1.0 Ok
rcpt to:***@gmail.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject testtitle
honbun
.
250 2.0.0 Ok: queued as 0B8E5315C
quit
221 2.0.0 Bye
Connection closed by foreign host.
maillogエラー4

どうやらOP25Bという問題のおかげで直接25番portでSMTPできていないみたい。

Feb 11 08:51:14 web postfix/smtp[61998]: connect to gmail-smtp-in.l.google.com[64.233.188.27]:25: Connection timed out
Feb 11 08:51:14 web postfix/smtp[61998]: connect to alt1.gmail-smtp-in.l.google.com[2607:f8b0:4003:c17::1b]:25: Network is unreachable
Feb 11 08:51:44 web postfix/smtp[61998]: connect to alt1.gmail-smtp-in.l.google.com[173.194.67.27]:25: Connection timed out
Feb 11 08:51:44 web postfix/smtp[61998]: connect to alt2.gmail-smtp-in.l.google.com[2607:f8b0:4001:c0b::1b]:25: Network is unreachable

送信失敗したメールはキューに溜まってるみたい。
Connection timed outが発生してる。

postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
32BD73163       369 Sat Feb 11 09:14:30  test@mail.vmware.local
(connect to alt4.gmail-smtp-in.l.google.com[74.125.192.26]:25: Connection timed out)
                                         ***@gmail.com

一旦キュー削除

postsuper -d ALL deferred

外部へのメールを送るメールサーバーを指定。
これを指定しないとデフォルトだと外部のメールサーバーを直接指定するらしい。
なので、これを指定しなかったので送信時にgoogleのメールサーバー見に行ってたみたい。
以下のように自サーバーのメールサーバーを指定する。

relayhost = [mail.vmware.local]

設定後はpostfixを再起動

同じようにtenletから再度メール送信したけどまたエラー。
だけど今度はメッセージ変わった
一応ちゃんと自サーバーを見てるみたい

Feb 11 10:08:24 web postfix/smtp[63630]: connect to mail.vmware.local[192.168.10.40]:25: No route to host
Feb 11 10:08:24 web postfix/smtp[63628]: 80BCA3167: to=<***@gmail.com>, relay=none, delay=1246, delays=1243/0.07/3/0, dsn=4.4.1, status=deferred (connect to mail.vmware.local[192.168.10.40]:25: No route to host)

※参考までに、DNSを変更後もpostfixのログで変更前のdns逆引きされてる場合はpostfixの再起動が必要。

No route to hostって出てるので試しにtelnetで接続

telnet 192.168.10.40 25

Trying 192.168.10.40...
telnet: connect to address 192.168.10.40: No route to host

繋がらない・・

pingも繋がらない

ping 192.168.10.40

PING 192.168.10.40 (192.168.10.40) 56(84) bytes of data.
From 192.168.10.30 icmp_seq=2 Destination Host Unreachable
From 192.168.10.30 icmp_seq=3 Destination Host Unreachable

どうやら自サーバーのDNS設定で繋がってないネットワークに対して正引き設定していたようなので、bindのゾーン情報ファイルを以下のように修正。

変更前

mail    IN A     192.168.10.40   

変更後

mail    IN A     10.0.10.40   

設定後はnamed再起動

再度telnetで587でメール送信。
まだメール送信できなかったけどエラーメッセージ変わった

Feb 11 10:19:32 web postfix/smtp[63701]: 8119A3163: to=<***@gmail.com>, relay=none, delay=15, delays=15/0/0/0, dsn=4.3.5, status=deferred (mail for mail.vmware.local loops back to myself)

調査した所、relayhostにローカルのメールサーバーを指定するとメールリレーがループしてエラーなるらしい。
なので、relayhostにはローカルのメールサーバーを指定するべきではないみたい。
relayhostには自身のメールサーバーの処理すべきドメインのみ指定するべきみたい。
ここでいうmail.vmware.local

で、自宅サーバーなどの場合、メールサーバーを構築してメール送信しようとしてもプロパイダ(ISP)側のOP25B対策によりメールが送れない事があるらしいので
relayhostにはプロパイダのSMTPを指定する必要があるみたい

relayhost = [smtp.***.ne.jp]

同じようにmyhostnameとmydomainにもプロパイダのドメインを設定。

myhostname = ***.ne.jp
mydomain = ***.ne.jp


そうするとエラーメッセージ変わった

Feb 11 18:07:17 web postfix/smtp[68579]: 1042D31A7: to=<***@gmail.com>, relay=smtp.***.ne.jp[203.160.31.73]:25, delay=0.52, delays=0.47/0/0.04/0.01, dsn=4.1.8, status=deferred (host smtp.***.ne.jp[***.***.***.***] said: 450 4.1.8 <test@mail.vmware.local>: Sender address rejected: Domain not found (in reply to RCPT TO command))

どうやらプロパイダ側のDNSのでこちらのLAN内のドメインが名前解決出来ないからみたい。

なので送信元アドレスを実際に存在してるドメインを指定してみる。

telnetモードにして

telnet localhost 587

HELO ホスト名入力

HELO mail.vmware.local

SMTP-AUTHのパスワード入力
※自サーバーアカウント(ここで言うtest@mail.vmware.local)のパスワード

AUTH PLAIN dGVzdEBtYWlsLnZtd2FyZS5sb2NhbAB0ZXN0QG1haWwudm13YXJlLmxvY2FsAHRlc3RwYXNzd29yZA==

送信元アドレス

mail from:***@ocn.ne.jp

宛先アドレス

rcpt to:***@gmail.com


dataを入力して

data

タイトル

Subject:hoge

メール文

bunsyou

.を入力してtelnetを終了

.

メーラーを確認するとメールが届いていた。

最後に

久しぶりにかなりハマりました。
はじめに書いたように、OP25B対策がされているプロパイダかつ、ドメインが無い自宅サーバーでは一般的なメール送受信可能がメールサーバー構築は難しいです。
出来る方法があればご教授頂きたく・・・
次回はVPNサーバーを借りてメールサーバーを構築してみます。

VMware上のCentOSにVPNサーバーを構築し外部からリモートデスクトップ接続をする

やりたいこと

自宅にLinuxVPNサーバーを構築し、外部からVPN接続して自宅LANのWindowsリモートデスクトップで操作する。
今回はAndroidからVPN接続してみる。
VPNサーバーはVMware上のCentOSで構築して使用する。

環境

※自宅は固定IPを使用しています

ルーター
NEC製の"ATERM-7D10F1"
IP:192.168.10.1

VPNサーバー
ホストOS
OS:Windows10
IP:192.168.10.106

ゲストOS(VMware
OS:CentOS 6.6
IP:192.168.10.30

VPNクライアント
Android
ASUSのZenFone)

VPNプロトコル

VPNプロトコルは手軽なPPP(Point-to-Point Protocol)を使用する。
セキュリティが高いのはL2TP/IPsecらしい。
PPP使用時にはIP制限とかもした方が良いかも。

VPNプロトコルの比較は下記サイトがわかりやすかった。
VPNプロトコル比較表 PPTP vs L2TP vs OpenVPN ™ vs Chameleon ™ | VyprVPN

手順

ゲストOS(VMware

ライブラリをインストール

yum install -y ppp
yum install -y pppd

pppdのインストールで下記エラーが出た場合は、rmpでインストールする。

[root@lb ~]# yum install -y pppd
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
パッケージ pppd は利用できません。
エラー: 何もしません

ダウンロードしてインストール

cd /usr/local/src
wget http://poptop.sourceforge.net/yum/stable/rhel6/x86_64/pptpd-1.4.0-1.el6.x86_64.rpm
rpm -Uhv pptpd-1.4.0-1.el6.x86_64.rpm

pptpd.conf編集

vi /etc/pptpd.conf

localipとremoteipを設定

localip 192.168.10.240
remoteip 192.168.10.241-249  

・localip
PPTP-VPNサーバー自身のローカルIP。
今回の例だと10.0.10.30

・remoteip
PPTP-VPNクライアントに割り当てられるIPアドレス範囲を指定。
上記設定だと241から249の9クライアントを最大接続数とする。
LAN内のコンピューターとIPが重なると 通信できないので被らないよう注意する。


コメントアウトを外しデバッグモードに設定

debug

ログ出力の為rsyslog設定

vi /etc/rsyslog.conf

下記を追記

*.=debug;\
        news.none;mail.none     -/var/log/pptpd

chap-secretsを編集し、VPNサーバーにアクセス可能なアカウントを作成します。

vi /etc/ppp/chap-secrets

ユーザー名 接続名(サーバー名) パスワード IPアドレス
を記入します。
サーバー名は/etc/ppp/options.pptpd の nameと同じにする必要があるようですが、アスタリスクを指定してもOKだそうです。
IPアドレスにはpptpd.confで設定した範囲のIPアドレスを指定しますが、ランダムに割り振る場合はアスタリスクで良いみたいです。

vpnuser *  passhoge  *

VPN接続したユーザーが外部ネットワークに接続できるように設定。
VPNユーザーに外部ネットワークアクセスを許可しない場合は設定不要です

vi /etc/ppp/options.pptpd

同LANネットワークで使用してるDNSサーバーを指定
外部DNSを使用してる場合はそれを指定(8.8.8.8等)

ms-dns 192.168.10.30 
ms-dns 192.168.10.1  

参考までにresolv.conf

[root@lb src]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.10.30
nameserver 192.168.10.1

ipv4転送設定

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

iptables設定

iptables -A INPUT -i eth0 -p tcp -dport 1723 -j ACCEPT 
iptables -A INPUT -i eth0 -p gre -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT

VPN許可IPの制限を設ける場合は、上記の1行目を以下のように変更。

iptables -A INPUT -i eth0 -s ***.***.***.***/32 -p tcp --dport 1723 -j ACCEPT 

VPN接続されたパケットをログ出力する場合はこうなる。

iptables -N VPN_LOGGING
iptables -A VPN_LOGGING -j LOG --log-level debug --log-prefix "VPN : "
iptables -A VPN_LOGGING -j ACCEPT

iptables -A INPUT -i eth0 -s ***.***.***.***/32 -p tcp --dport 1723 -j VPN_LOGGING

SELinuxの状態確認
SELinuxは高度なセキュリティ機能だが、これが有効になっているとVPN接続が行えない。

getenforceを確認し、Enforcingだと有効になっているので無効にする。

/usr/sbin/getenforce
Enforcing

Enforcingを0に設定

/usr/sbin/setenforce 0

設定ファイルも修正

vi /etc/selinux/config
SELINUX=disabled

SELinux変更後はサーバー再起動が必要

reboot

pptpdの再起動

service pptpd restart

自動起動設定

chkconfig pptpd on

自動起動設定がされている事を確認。

chkconfig pptpd --list

pptpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

ルータの設定

詳細設定 > ポートマッピング設定

IPアドレス ... 192.168.10.30
VPNサーバーのローカルIP
プロトコルに ... TCP
ポート範囲 ... 1723
コメント ... 適当に

「設定」をクリック

AndroidからVPN接続

設定からVPN設定。
自宅のグローバルIPと上記で設定したアカウント情報を入力で接続できた。

接続後、VPNサーバーのifconfigではpppの接続が表示される

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.10.30  P-t-P:192.168.10.241  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1396  Metric:1
          RX packets:3871 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3747 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:401489 (392.0 KiB)  TX bytes:1244178 (1.1 MiB)

デバッグログも出力されている
(但し意味は分からない)

less /var/log/pptpd 

Feb  2 23:20:03 lb pptpd[6638]: MGR: Launching /usr/sbin/pptpctrl to handle client
Feb  2 23:20:03 lb pptpd[6638]: CTRL: local address = 192.168.10.30
Feb  2 23:20:03 lb pptpd[6638]: CTRL: remote address = 192.168.10.241

CentOS6.6で急にmessageログが出力されなくなったので対処

CentOS6.6で急にmessageログが出力されなくなった。。
というかmessageログだけで無く、iptablesやsecureのログ等、/var/log/配下のログが出力されていないような。。

別サーバーからずっとping送信してもiptablesのログが更新されない

ls -lht /var/log/iptables/iptables.log
-rwxrwxrwx 1 root root 196K  1月 30 22:05 2017 /var/log/iptables/iptables.log

調査した所、messageログ等はrsyslogによって出力されてるらしい。

rsyslogの起動状態確認

/etc/init.d/rsyslog status
rsyslogd (pid  3972) を実行中...

起動してる。。

再起動してみる

/etc/init.d/rsyslog restart

お、更新された

ls -lht /var/log/iptables/iptables.log
-rwxrwxrwx 1 root root 196K  1月 31 22:34 2017 /var/log/iptables/iptables.log


根本原因分かってないけどとりあえず解決。