自宅サーバーのCentOSでメールサーバーの環境構築(Postfix+Dovecot)
自宅サーバーのVMware上のCentOSでPostfix+Dovecotを使用したメールサーバーを構築する。
PostfixのSMTP認証には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
やりたかった事、注意点
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を指定。
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
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
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無い場合はインストール
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 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を終了
.
メーラーを確認するとメールが届いていた。
VMware上のCentOSにVPNサーバーを構築し外部からリモートデスクトップ接続をする
やりたいこと
自宅にLinuxのVPNサーバーを構築し、外部から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
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
根本原因分かってないけどとりあえず解決。
NTPサーバーを構築してLAN内サーバーでも日本時刻を同期する
NTPサーバーを構築してLAN内サーバーでも日本時刻を同期する。
NTPサーバーとは時刻を同期する為のもの(説明適当)。
LAN内にNTPサーバーを構築するメリットして
・LAN内の全てのサーバーで時刻を同期できる
→各サーバーで外部NTPサーバーを参照する事も可能だが多少のズレが発生する可能性あるみたい
・NTPサーバーだけが外部問い合わせをする事で、外部ネットワークへのトラフィックの削減につながる
環境
・サーバーA
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている
・サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない
ntpd 4.2.6
手順
NTPサーバー
現在時刻を確認
[root@lb ~]# date 2017年 1月 28日 土曜日 08:52:00 JST
ハードウェアクロックの時刻を確認
hwclock -r 2017年01月28日 10時13分09秒 -0.353933 秒
ずれてる・・
ntpインストール
yum -y install ntp
ntp設定ファイル修正
LAN内のNTPサーバーはNICTのNTPサーバーを元にして時刻を同期する。
ntp.nict.jpは独立行政法人情報通信研究機構(NICT)が管理している日本標準時に直結したNTPサーバー
vi /etc/ntp.conf
以下の設定を行います。
#NTPサーバーの時刻と,ローカル・マシンの時刻のずれを記録するファイル driftfile /var/lib/ntp/drift
#デフォルトのアクセス制御を設定、明示的に許可されていないアクセスを禁止 restrict -6 default ignore restrict default ignore restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery
最初の2行でipv6とipv4のデフォルトのアクセス制限として拒否設定。
その後、必要なアクセスのみを許可していってる。
上記3つのIPはこちらからアクセスする上位NTPサーバーのIP(後述)。
こちらからのタイムクエリーはしますが、あちらからのntpqやntpdcクエリーはさせないようnomodify以降のオプションを付与。
restrictでは外部からのアクセスと外部へのアクセス両方の設定となるようです。
各オプションは
ignore ... 指定したサーバからのすべてのNTPアクセスを無視
noquery ... 指定したサーバからの時刻問い合わせパケットを無視
nomodify... 指定したサーバからの設定変更要求パケットを無視
notrap ... 指定したサーバに対して状変時にトラップを上げない
# 自分自身のアクセスを許可 restrict 127.0.0.1 # 10.0.10.0/24からのアクセスを許可 restrict 10.0.10.0 mask 255.255.255.0 nomodify notrap
書いての通り、NTPサーバーへのアクセス許可設定です。
# 時刻同期先NTPサーバーを指定 server ntp1.jst.mfeed.ad.jp iburst server ntp2.jst.mfeed.ad.jp iburst server ntp3.jst.mfeed.ad.jp iburst
ちなみにデフォルトの下記だと、デフォルトのNTPサーバーを参照するらしい。
これでも動くみたいだけど、変更したほうが良さ気。
server 0.centos.pool.ntp.org server 1.centos.pool.ntp.org server 2.centos.pool.ntp.org
server に 127.127.1.0 を指定すると、自分自身のローカルクロック(システム時刻)を使用するみたい。
外部ネットワークに接続できない場合に使用する事あるみたいだけど、今回は上位NTPサーバーを参照するのでこの設定は使用しない。
server 127.127.1.0
上位サーバーを参照しない場合は、以下のようにfedgeをつける?
Stratumは、小さい方が優先度が高くなるとの事。
ちょっとこの辺よくわかってない。。
fudge 127.127.1.0 stratum 10
iptablesにNTPサーバーへのアクセスを許可する
※ntp.confのserverのIP
iptables -A OUTPUT -p udp -d 210.173.160.27 --dport 123 --sport 123 -j ACCEPT iptables -A OUTPUT -p udp -d 210.173.160.57 --dport 123 --sport 123 -j ACCEPT iptables -A OUTPUT -p udp -d 210.173.160.87 --dport 123 --sport 123 -j ACCEPT
ntpを起動する前に手動で時刻を合わせてみる。
※ntpdateの後にNTPサーバーのホスト名またはIPを指定する
ntpdate ntp.nict.jp 28 Jan 12:32:56 ntpdate[37946]: step time server 133.243.238.164 offset 122958.759329 sec ntpdate
以下のようなメッセージが出た場合ntpdが起動中、またはNTPサーバーの指定がない。
27 Jan 00:01:09 ntpdate[38507]: no servers can be used, exiting
27 Jan 00:01:09 ntpdate[38507]: the NTP socket is in use, exiting
自動起動設定
chkconfig ntpd on
確認
[root@lb ~]# chkconfig --list ntpd ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ntp起動
service ntpd start
NTPサーバーとの同期確認
※remoteで指定されたホストの左に*が表示されていれば、そのサーバと同期していることを確認できるらしい
[root@lb ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== +ntp1.jst.mfeed. 133.243.236.17 2 u - 64 1 44.714 54.252 8.762 *ntp2.jst.mfeed. 133.243.236.17 2 u 1 64 1 46.647 57.935 5.071 ntp3.jst.mfeed. 133.243.236.17 2 u - 64 1 44.669 57.794 5.860
※refidの値がずっと「.INIT.」の場合
以下のようにrefidの値が「.INIT.」の場合、「.INIT.」はNTPサーバに到達できないという事。
st(Stratum) 16 は、最下位の階層で、NTPクライアントはこの階層のNTPサーバには同期しない。
ntpdは、上位サーバの時刻の違いが 1000 秒より大きい場合、何か決定的にまずいことが生じたと仮定し同期しない。
[root@lb ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== ntp-b2.nict.go. .INIT. 16 u - 64 0 0.000 0.000 0.000 ntp1.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000 ntp2.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000 ntp3.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
自分はここでかなりハマりました。
結論から言うと、設定してる上位NTPサーバーのIPのアクセスを許可するよう設定しntpdを再起動する事で解決しました。
ntp.confのserverにしているホストのIPを調べ、
server ntp1.jst.mfeed.ad.jp iburst server ntp2.jst.mfeed.ad.jp iburst server ntp3.jst.mfeed.ad.jp iburst
restrictに指定
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery
※同期確認時にタイムアウトエラーが出た場合。
$ ntpq -np ::1: timed out, nothing received ***Request timed out
色々可能性はありますが、自分の場合はipv6でlocalhostに対して通信しようとしており、ntp.conf側ではipv6を許可していないのが原因でした。
そもそもipv6は使用しないのでシステム側でipv6の通信をさせないように設定。
sysctl.confを編集し、
vi /etc/sysctl.conf
ipv6の通信をさせないように設定追加
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
反映
sysctl -p
これで解決しました。
※iptablesのログでNTPのポート123がDropされていた場合。
下記の例だとntp.confのserverで指定した下記IPの123ポートがDropされてる。
210.173.160.27
210.173.160.57
210.173.160.87
これらは、ntpd.confに設定したNTPサーバーのIP
Jan 28 13:02:49 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.27 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 Jan 28 13:06:59 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.57 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 Jan 28 13:07:00 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.87 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56
iptablesに下記設定で解決した
iptables -A OUTPUT -p udp -d 210.173.160.27 --dport 123 --sport 123 -j ACCEPT iptables -A OUTPUT -p udp -d 210.173.160.57 --dport 123 --sport 123 -j ACCEPT iptables -A OUTPUT -p udp -d 210.173.160.87 --dport 123 --sport 123 -j ACCEPT
同期確認
最後に時刻の同期が取れている事を確認。
[root@lb ~]# date 2017年 1月 28日 土曜日 09:58:18 JST
動作確認の為、故意的に時間をずらしてみる。
※ntpサーバーとのズレが大きすぎると同期されない為、2,3分だけずらしてみる。
date -s "2017/01/29 08:57:00"
直後は以下のようだけど
[root@lb ~]# ntpstat unsynchronised polling server every 64 s
同期されると以下のように表示される
ntpstat synchronised to NTP server (210.173.160.87) at stratum 3 time correct to within 34 ms polling server every 64 s
20分位すると同期されました。
直ぐに動悸したい場合は、ntpdateコマンドを使用した方が良いでしょう。
[root@lb ~]# date 2017年 1月 29日 日曜日 09:20:13 JST
クライアントサーバー
インストール手順は省略します。
ntp.confを編集
vi /etc/ntp.conf
restrict -6 default ignore restrict default ignore restrict 127.0.0.1 restrict 10.0.10.0 mask 255.255.255.0 nomodify notrap server 10.0.10.30
sysctl.confを編集
vi /etc/sysctl.conf
ipv6の通信をさせないように設定追加
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
反映
sysctl -p
ntp.conf設定
vi /etc/ntp.conf
同期確認
refidやstが正常に表示されてればOKだはず。
[root@web ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== 10.0.10.30 210.173.160.87 3 u 2 64 1 0.386 1823354 0.000
※「ntpq -p」実行後タイムアウトし、NTPサーバーのiptablesのログでNTPのポート123がDropされていた場合。
Jan 29 09:25:02 lb kernel: Dropped by INPUT: IN=eth1 OUT= MAC=00:0c:29:73:76:73:00:0c:29:5c:ba:fd:08:00 SRC=10.0.10.40 DST=10.0.10.30 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 Jan 29 09:28:20 lb kernel: Dropped by OUTPUT: IN= OUT=eth1 SRC=10.0.10.30 DST=10.0.10.40 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56
NTPサーバー側でファイアウォール設定する事で解決した。
iptables -A INPUT -p udp -s 10.0.10.0/24 --dport 123 -j ACCEPT iptables -A OUTPUT -p udp -d 10.0.10.0/24 --dport 123 --sport 123 -j ACCEPT
クライアント側から「ntpq -p」実行してタイムアウトが発生する場合は、NTPサーバー側のiptables設定やntp.confのrestrict設定あたりも疑った方が良い
DNSサーバーの種類と構成を整理
DNSサーバーの種類と構成を整理。
※間違ってる情報があれば指摘頂けると嬉しいです
種類
※外部=外部の世界中のインターネット
※内部=LAN内ネットワーク
冗長化
プライマリ=マスタ、セカンダリ=スレーブ、
と扱われる事が多いが、実際はそうでは無いと思われる。
DNSプライマリサーバー
クライアント側のリゾルバから、最初にアクセスすべきDNSサーバー。
大抵クライアント側ではDNSサーバーを1つ指定しており基本的にアクセスされるサーバー。
冗長化の為、クライアント側でセカンダリサーバーもDNSにしていれば、このサーバーがアクセスできなかった場合セカンダリサーバーにアクセスが行く。
DNSマスターサーバー
名前解決の情報を管理しているサーバー。
その為、コンテンツサーバーのみがマスターになり得る。
対応する名前解決の情報をスレーブに自動転送する。
マスター側が最初にアクセスされるサーバーとは限らない。
DNSスレーブサーバー
名前解決の情報をマスターから受け取って管理する。
マスターと同じ情報を管理する。
コンテンツサーバーのみがスレーブになり得る。