【メールサーバ】Postfix設定その1(基本)

  • Postfix設定(基本)

    1cp -pi /etc/postfix/main.cf /etc/postfix/main.cf.org
    2vi /etc/postfix/main.cf
    下記内容を追加
    # 自FQDN名を指定
    # hostnameコマンドの戻り値を設定する。
    # 私の環境では「z-area.net」になるが、1つのサーバで
    # 複数の機能(ウェブサーバ、メールサーバ)を持っている場合、
    # OSのホスト名は利用できないため、先頭にmailをつけました。
    myhostname = mail.z-area.net
    
    # 自ドメイン名を指定
    # 上記のmyhostnameの先頭mailを削除した値を設定する。
    mydomain = z-area.net
    
    # メール送信時の送信元メールアドレス@以降にドメイン名を付加
    # Postfixの機能でOSユーザ名のみを宛先に指定した場合、@以降を自動で補完する。
    myorigin = $mydomain
    
    # メールボックス形式をMaildir形式
    home_mailbox = Maildir/
    
    # メールサーバーソフト名の隠蔽化
    smtpd_banner = $myhostname ESMTP unknown
    
    # 受信メールサイズ制限
    message_size_limit = 10485760
    
    # SMTPのVRFYコマンドを使用禁止
    # VRFYはアカウントが実在するか確認するコマンドで、
    # でたらめなユーザ問い合わせを行う悪質なプログラムによりアカウント流出を防ぐ。
    disable_vrfy_command = yes
    
    # sasl認証に対応していないメーラーを拒否
    broken_sasl_auth_clients = yes
    
    下記内容を変更
    # 外部からのメール受信を許可
    # 127.0.0.1を指定するとローカルから外部への配送のみ許可
    inet_interfaces = localhost
    ↓
    inet_interfaces = all
    # 自ドメイン宛メールを受信許可
    mydestination = $myhostname, localhost.$mydomain, localhost
    ↓
    mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    

【メールサーバ】Postfix導入

メールサーバを構築します。
メールのプロトコルは主に3種類。

SMTP:Simple Mail Transfer Protocol
メールサーバが電子メールを他のサーバへ送信したり、受信するためのプロトコル

POP:Post Office Protocol
メールサーバ内のメールスプールに含まれているメッセージを受信したり削除するためのプロトコル

IMAP:Internet Message Access Protocol
メールスプールのメッセージに対して、移動や検索等を行うプロトコル

送信ではSMTPを利用するので、Postfixを導入します。

  • Postfixの導入確認(SMTP-Auth)
    SMTP-Authとはメール送信時にユーザ名とパスワードで認証を行う機能です。

    1yum list installed | grep cyrus-sasl
    cyrus-sasl.x86_64    2.1.23-15.el6_6.1  @updates
    cyrus-sasl-lib.x86_64
    cyrus-sasl-plain.x86_64
    

【VPNサーバ】OpenVPN導入その5

ASUSのタブレットを購入したので、こちらにもOpenVPNを導入します。

  • OpenVPN設定(クライアント用の証明書と鍵作成(追加))
    RaspberryPiでタブレット用の証明書と鍵を作成します。

    1cd /etc/openvpn/easy-rsa
    2source ./vars
    3./build-key クライアント名(タブレット)

    作成した証明書や鍵のうち、
    クライアントで利用する下記ファイルをWindowsにUSB等で持ってきて、設定を行います。

    ca.crt
    クライアント名(タブレット).crt
    クライアント(タブレット).key
    ta.key(iPhone優先のため、利用していませんが、一応)
    
  • クライアント設定ファイル(タブレット用)
    クライアント設定ファイルとして「クライアント名(タブレット).ovpn」ファイルを作成します。
    設定内容は「OpenVPN導入その3」の設定値と全く一緒です。
  • はまったこと
    タブレットにOpenVPNをインストールするとデスクトップに「OpenVPN GUI」の
    ショートカットが作成されるので、ダブルクリックして実行し、接続します。
    単純に実行するとOpenVPNには接続し、IPが割り振られますが、
    OpenVPN内の他のクライアントに接続できませんでした。
    pingももちろん飛びません。

    ipv6が悪さをしているのかと色々勘ぐりましたが、
    ちゃんとクライアント側のログを見てみると下記エラーが出力されていました。

    ROUTE: route addition failed using CreateIpForwardEntry: アクセスが拒否されました。[status=5 if_index=12]
    Route addition via IPAPI failed [adaptive]
    Route addition fallback to route.exe
    env_block: add PATH=C:\Windows\System32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
    ERROR: Windows route add command failed [adaptive]: returned error code 1
    

    Cドライブ内のexeファイルを実行できていないようです。
    これを解決するには「OpenVPN GUI」のショートカットを
    常に管理者権限で実行する必要があります。

    「OpenVPN GUI」のショートカットを右クリックからプロパティを開き、
    「互換性」タブの「管理者としてこのプログラムを実行する」のチェックボックスをチェックします。
    これで無事、OpenVPN内のクライアントにも接続できました。

【APサーバ】warファイル配置

  • Tomcat設定ファイルの内容確認

    # 下記内容が設定されていることを確認
    <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    

    warファイルは「/usr/local/tomcat/webapps」に配置します。
    上記設定内容がtrueになっていると、
    配置した瞬間にTomcatの起動中にもかかわらず、同階層に自動で展開されます。

  • Apache2とTomcatの連携設定追加

    WebアプリのURLが「http://z-area.net/コンテキスト名/」である場合、
    ポート番号を指定せずに接続するための設定を追加します。

    下記を最終行に追加
    <Location /コンテキスト名/>
            ProxyPass ajp://localhost:8009/コンテキスト名/
            allow from all
    </Location>
    

【APサーバ】Apache2とTomcat連携

ポート番号を指定せずにTomcatにアクセスします。

  • Tomcat側の設定

    1vi /usr/local/tomcat/conf/server.xml
    下記をコメントアウト
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
    下記がコメントアウトされていないことを確認
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
  • Apache2側の設定

    下記がコメントアウトされていないことを確認
    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    
    下記を最終行に追加
    <Location /examples/servlets/>
        ProxyPass ajp://localhost:8009/examples/servlets/
        allow from all
    </Location>
    
  • Apache2とTomcatの連携動作確認

    1/etc/rc.d/init.d/httpd stop
    2sudo -u tomcat /usr/local/tomcat/bin/shutdown.sh
    3sudo -u tomcat /usr/local/tomcat/bin/startup.sh
    4/etc/rc.d/init.d/httpd start
    5/etc/rc.d/init.d/iptables start

    http://z-area.net/examples/servlets/

    ポート指定なしで繋がるようになるため、iptablesは有効のままにしておきます。

【APサーバ】Tomcat導入

  • Tomcat導入

    バージョンは「apache-tomcat-7.0.50.tar.gz」にしました。
    サーバーに配置しておきます。

    1tar xvzf apache-tomcat-7.0.50.tar.gz
    2mv apache-tomcat-7.0.50 /usr/local
    3cd /usr/local
    4chown -R tomcat.tomcat apache-tomcat-7.0.50
    5ln -s apache-tomcat-7.0.50 tomcat
  • 環境変数の設定

    下記3つのうちのどれかに記載します。

    【共通設定】
    /etc/profile
    「JAVA_HOME」や「CATALINA_HOME」の値を設定する。
    
    【環境変数設定】
    $CATALINA_HOME/bin/setenv.sh
    「JAVA_OPTS」や「CATALINA_OPTS」の値を設定する。
    
    【クラスパス設定】
    $CATALINA_HOME/bin/setclasspath.sh
    追加のjarファイル等を設定する。
    

    今回は共通設定に追加します。

    下記を最終行に追加
    export JAVA_HOME=/usr/lib/jvm/java
    export CATALINA_HOME=/usr/local/tomcat
    

    環境変数を適用しておきます。

  • Tomcat起動確認

    1/etc/rc.d/init.d/iptables stop
    2sudo -u tomcat /usr/local/tomcat/bin/startup.sh

    http://z-area.net:8080/examples/servlets/

    「Servlet Examples with Code」の画面が出れば成功です。
    併せてrootユーザではなくtomcatユーザで動作していることを確認します。

    tomcat    プロセスID  親プロセスID プロセッサ使用率 プロセスの起動時刻  制御端末 累積時間 略
    

    startup.shはrootユーザで実行しないこと。
    初回でrootユーザで実行するとログファイルがrootユーザで作成されてしまい、
    tomcat専用ユーザでstartup.shを実行しても権限がないと言われてしまうので、
    そうなった場合、1度ログを削除すれば問題なし。

    起動確認ができたのでTomcat停止し、iptablesを有効にしておきます。

    1sudo -u tomcat /usr/local/tomcat/bin/shutdown.sh
    2/etc/rc.d/init.d/iptables start

【APサーバ】Java導入

  • Java導入

    読み込んだプラグイン:downloadonly, fastestmirror, security
    略
    ============================= N/S Matched: openjdk =============================
    java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
    java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
    java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
    java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
    java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
    java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
    java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
    java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
    java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
    java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
    java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
    java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos
    java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
    java-1.8.0-openjdk-headless.x86_64 : OpenJDK Runtime Environment
    java-1.8.0-openjdk-javadoc.noarch : OpenJDK API Documentation
    java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle
    略
    

    今回はJDK1.7を導入します。

    1yum install java-1.7.0-openjdk-devel
    依存性関連をインストールしました:
      flac.x86_64 0:1.2.1-6.1.el6
      giflib.x86_64 0:4.1.6-3.1.el6
    略
      xorg-x11-fonts-Type1.noarch 0:7.2-9.1.el6
    
    完了しました!
    
  • JavaHOMEの設定

    JAVA_HOMEを設定する場合は下記パスを設定する。
    Tomcat導入のエントリーで一緒に設定するので、ここでは省略。

    /usr/lib/jvm/java
    

    上記はシンボリックリンクになっており、
    実体は下記パスを参照している。

    /etc/alternatives/java_sdk
    

    さらに「java_sdk」もシンボリックリンクになっており、
    実体は下記パスを参照している。

    /usr/lib/jvm/java-1.7.0-openjdk.x86_64
    

    さらにさらに「java-1.7.0-openjdk.x86_64」もシンボリックリンクになっており、
    実体は下記パスを参照している。

    /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.71.x86_64
    

    こんな回りくどいことになっているのは
    Javaは1つのOSに複数バージョン混在できる可能性があるため。

    「alternatives」コマンドで利用したいJavaバージョンを変更できるようになっており、
    いちいちJAVA_HOMEの変更、アンインストール、インストールをせずに
    シンボリックリンクの参照だけを変更してくれているようです。

【WordPress】SyntaxHighlighterでクリップボードへコピー画像が表示されない

WordPressのプラグインでSyntaxHighlighterの2.0を利用していますが、
ツールバーにでクリップボードへコピー画像が表示されず、コピーができない。
画像は下記パスに配置されています。

/var/www/html/任意ディレクトリ名/wp-content/plugins/syntaxhighlighter/syntaxhighlighter2/scripts/clipboard.swf

確認するとサイズ0です。
プラグインを入れなおしても変わらないので、ファイルが壊れているようです。
下記公式サイトからSysntaxHighlighter2.0をダウンロードし、壊れていないファイルを手に入れ再配置。

http://alexgorbatchev.com/SyntaxHighlighter/

IEのキャッシュをクリアして再接続すれば画像が表示されます。

【CentOS】iptables設定

  • iptablesのテーブル概念
    iptablesは下記3つのテーブルを持つ。

    filter:パケットフィルタリング
    nat:IPアドレスの変換
    mangle:IPヘッダの書き換え
    

    filterはssh、http、https等のポートを通したり。
    natはRaspberry PiのOpenVPNでも設定しましたが、
    「10.8.0.0」を「192.168.XXX.XXX」に変換したり。
    mangleは利用したことありませんので、説明省略。

  • iptablesの設定追加
    現状のままだと外からWordPressにアクセスできないため、
    ルーターのポート80、443をNUCのIPに向け、
    さらにiptablesのfilterテーブルに設定を追加します。

    1iptables -I INPUT 5 -p tcp -m tcp --dport 80 -j ACCEPT
    2iptables -I INPUT 6 -p tcp -m tcp --dport 443 -j ACCEPT
    3service iptables save
    -I:チェインの任意の行番号に挿入
    -p:プロトコルを指定(icmp、 tcp、udp、all)
    -m:マッチング条件拡張(今回の例でいうと「tcp --dport」でパケットの送信先ポートを指定)
    -j:マッチングした際のターゲット(ACCEPT、 DROP、QUEUE、RETURN、LOG、REJECT等)
    

    チェインはテーブルごとに利用できる範囲があります。

    filter:FORWARD、INPUT、OUTPUT
    nat:PREROUTING、POSTROUTING、OUTPUT
    

    5行目と6行目に設定を追加した理由は、今回の設定を追加前の最終行目(5行目)に
    全ての通信を拒否する設定があるからです。
    iptablesは上から順に設定内容を評価するため、
    全ての通信を拒否する設定より前に許可したいポートの設定をしておく必要があります。

【NTPサーバ】NTPd導入

  • NTPd設定

    1cp -pi /etc/ntp.conf /etc/ntp.conf.org
    2vi /etc/ntp.conf
    下記内容を「#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap」のすぐ下に追加
    restrict 192.168.XXX.0 mask 255.255.255.0 nomodify notrap
    
    下記内容をコメントアウト
    #server 0.centos.pool.ntp.org iburst
    #server 1.centos.pool.ntp.org iburst
    #server 2.centos.pool.ntp.org iburst
    #server 3.centos.pool.ntp.org iburst
    
    下記内容を追加
    server ntp1.jst.mfeed.ad.jp
    server ntp2.jst.mfeed.ad.jp
    server ntp3.jst.mfeed.ad.jp