【VPNサーバ】OpenVPNファイルウォール設定

  • OpenVPNファイアウォール設定

    # OpenVPNファイアウォール設定
    iptables -I INPUT 16 -p udp --dport 1194 -j ACCEPT
    service iptables save
    
    # 設定内容の確認
    # フィルタリングの確認(-t filter省略)
    iptables -L --line-numbers -n -v
    # アドレス変換の確認(-t nat)
    iptables -L -t nat --line-numbers -n -v
    

    この設定ではiPhone5sからVPNサーバに接続できても
    各サーバにPingが飛ばせませんでした。
    どこか設定をミスしているのかも。
    以下の設定を追加してみても変化なし。

    iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.11.30
    service iptables save
    

    「/var/log/message」を確認するとiPhone5sからLZOのエラーが出ていたので、
    そこを改善すれば直るのかは確認中です。

【VPNサーバ】OpenVPN設定(クライアント用)

  • OpenVPN設定(クライアント側パスワード有)
    iPhone以外でパスワード有りでログインする場合、こっちを選択。

    # クライアント用の証明書作成
    cd /etc/openvpn/easyrsa3/
    ./easyrsa build-client-full クライアント名
    
    下記内容を入力
    Enter PEM pass phrase:クライアント用パスワードを入力
    Verifying - Enter PEM pass phrase:クライアント用パスワードを入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
  • OpenVPN設定(クライアント側パスワード無)
    iPhoneやパスワード無しでログインする場合、こっちを選択。

    # クライアント用の証明書作成
    cd /etc/openvpn/easyrsa3/
    ./easyrsa build-client-full クライアント名 nopass
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
  • iPhone用のOpenVPN設定
    WindowsのOpenVPNクライアントをインストールし、
    インストール後、「インストールディレクトリ/OpenVPN/sample-config/client.ovpn」を編集する。
    iPhone用は設定値のみとし、#のコメントも削除する。

    下記内容を確認/追加/変更
    # TLSクライアントを指定
    tls-client
    
    # VPNインターフェースとしてtunデバイスを指定
    dev tun
    
    # プロトコルとしてudp
    proto udp
    
    # サーバ名とポートを指定
    remote z-area.net 1194
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # Man-in-the-Middle攻撃対策
    remote-cert-tls server
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNのログ設定
    verb 3
    
    # 鍵の設定と思われるがいまいち不明
    # しかしこの記述がないと接続できなかった
    key-direction 1
    
  • iPhone用の秘密鍵の変換
    「X509」というエラーが出いてた場合、
    iPhoneのOpenVPNクライアントアプリのTLS/SSLがPolarSSLを利用している場合があり、
    OpenSSLと秘密鍵のフォーマットが異なり、接続できないことがある。
    そこで以下のコマンドで秘密鍵を変換する。

    openssl rsa -in /etc/openvpn/easyrsa3/pki/private/クライアント名.key -out /etc/openvpn/easyrsa3/pki/private/クライアント名.key.polarssl
    

【VPNサーバ】OpenVPN設定

  • OpenVPN設定

    # OpenVPN設定ファイルをOpenVPN設定ファイル格納ディレクトリへコピー
    cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
    # OpenVPN設定ファイルを編集
    vi /etc/openvpn/server.conf
    
    下記内容を確認/追加/変更
    # VPNインターフェースとしてtunデバイスを指定
    dev tun
    
    # プロトコルとしてudp、ポートは1194を指定
    proto udp
    port 1194
    
    # 認証局証明書、サーバー証明書、サーバー秘密鍵のファイルパスを指定
    # 配置場所を変更している場合、変更する
    ca ca.crt
    cert server.crt
    key server.key
    
    # DHパラメータファイルのパスを指定
    # 配置場所を変更している場合、変更する
    dh dh.pem
    
    # VPNクライアント割当てアドレス範囲として10.8.0.0/24を指定(デフォルト)
    server 10.8.0.0 255.255.255.0
    
    # LAN(例:192.168.1.0/24)へのルートをVPNサーバー経由にする
    ;push "route 192.168.10.0 255.255.255.0"
    ;push "route 192.168.20.0 255.255.255.0"
    push "route 192.168.11.0 255.255.255.0"
    
    # TLS認証有効化(行頭の;を削除し、コメント解除)
    tls-auth ta.key 0 # This file is secret
    
    # OpenVPN実行権限を下げる(行頭の;を削除し、コメント解除)
    user nobody
    group nobody
    
    # 起動時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # ログの設定
    status /var/log/openvpn-status.log
    log-append  /var/log/openvpn.log
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNクライアントのIP固定設定を利用しない
    # 利用する場合、行頭の;を削除
    ;client-config-dir ccd
    
    # 管理インタフェースの有効化(最終行に追加)
    # 証明書廃止リストの有効化(最終行に追加)
    management localhost 7505
    crl-verify crl.pem
    
    # OpenVPN経由でSambaへのアクセスがエラーになる場合、最終行に追加
    fragment 1280
    mssfix 1280
    link-mtu 1400
    
  • OpenVPN起動時実行スクリプト作成

    # OpenVPN起動時実行スクリプト作成
    vi /etc/openvpn/openvpn-startup
    
    #!/bin/bash
    
    # VPN用のiptablesルール削除スクリプト実行(初期化)
    /etc/openvpn/openvpn-shutdown
    
    # VPNサーバーからの送信を許可
    iptables -I OUTPUT -o tun+ -j ACCEPT
    iptables -I FORWARD -o tun+ -j ACCEPT
    
    # VPNクライアントからVPNサーバーへのアクセスを許可
    iptables -I INPUT -i tun+ -j ACCEPT
    
    # VPNクライアントからLANへのアクセスを許可
    # VPNクライアントから192.168.11.0/24へのアクセスを許可する場合、
    # 192.168.11.0/24側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
    iptables -I FORWARD -i tun+ -d 192.168.11.0/24 -j ACCEPT
    
    # OpenVPN起動時実行スクリプトへ実行権限付加
    chmod +x /etc/openvpn/openvpn-startup
    
  • OpenVPN停止時実行スクリプト新規作成

    # OpenVPN停止時実行スクリプト新規作成
    vi /etc/openvpn/openvpn-shutdown
    
    #!/bin/bash
    
    # VPNインタフェース(tun+)用iptablesルール削除関数
    delete() {
        rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
        for num in $rule_number
        do
            iptables -D $target $num
        done
    }
    
    # VPNインタフェース(tun+)用iptables受信ルール削除
    target='INPUT'
    delete
    
    # VPNインタフェース(tun+)用iptables転送ルール削除
    target='FORWARD'
    delete
    
    # VPNインタフェース(tun+)用iptables送信ルール削除
    target='OUTPUT'
    delete
    
    # OpenVPN停止時実行スクリプトへ実行権限付加
    chmod +x /etc/openvpn/openvpn-shutdown
    
  • OpenVPNログローテーション設定

    # OpenVPNログローテーション設定ファイル新規作成
    vi /etc/logrotate.d/openvpn
    
    /var/log/openvpn.log {
        missingok
        notifempty
        sharedscripts
        postrotate
            systemctl restart openvpn 2>&1 > /dev/null || true
        endscript
    }
    
  • OpenVPN起動スクリプト変更

    # OpenVPN起動スクリプト変更
    vi /etc/rc.d/init.d/openvpn
    
    下記内容を変更
    # 行頭の#を削除し、コメント解除
    # パケット転送を有効化する
    echo 1 > /proc/sys/net/ipv4/ip_forward
    

【VPNサーバ】OpenVPN導入

RaspberryPiがとうとう壊れしまったので、
NUCにOpenVPNを導入します。
導入はrootユーザで実施します。

  • OpenVPN導入

    cd /usr/local/src
    # OpenVPNインストールに必要なパッケージをインストール
    yum -y install openssl-devel lzo-devel pam-devel
    # 最新の OpenVPN をダウンロードしてビルド
    # 最新版は公式サイトで確認
    wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.10.tar.gz
    rpmbuild -tb --clean openvpn-2.3.10.tar.gz
    yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.3.10-1.x86_64.rpm
    rm -f ~/rpmbuild/RPMS/x86_64/openvpn-*
    rm -f openvpn-2.3.10.tar.gz
    
    # easyrsa をダウンロードして解凍
    # OpenVPNをインストールするとOpenSSLを簡単に利用できるツール「easy-rsa」が
    # 「/usr/share/doc/openvpn/examples/easy-rsa/2.0」にインストールされるが、
    # 最新版の3.0をダウンロードします。
    wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
    unzip master.zip
    cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/
    rm -rf easy-rsa-master/
    rm -f master.zip
    
  • 証明書初期化(OpenVPN導入後の1回のみ)

    cd /etc/openvpn/easyrsa3/
    ./easyrsa init-pki
    
  • CA証明書と秘密鍵作成

    ./easyrsa build-ca
    
    下記内容を入力
    Enter PEM pass phrase:任意のパスワードを入力
    Verifying - Enter PEM pass phrase:任意のパスワードを再入力
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:z-area.net
    
    # CA証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/ca.crt /etc/openvpn/
    # CA秘密鍵は以降のサーバ証明書・秘密鍵作成時、クライアント証明書・秘密鍵作成時のみ使用するため、コピー不要
    
  • サーバ証明書と秘密鍵作成

    ./easyrsa build-server-full server nopass
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # サーバ証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/issued/server.crt /etc/openvpn/
    # サーバ秘密鍵をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/private/server.key /etc/openvpn/
    
  • DH(Diffie Hellman)パラメータ作成

    # DHパラメータ作成
    ./easyrsa gen-dh
    # DHパラメータをOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/dh.pem /etc/openvpn/
    
  • 証明書廃止リスト作成
    証明書廃止リストは、実際にクライアント証明書を
    作成してから廃止を行わないと作成できないので、
    ダミーのクライアント証明書を一旦、作成と廃止することにより、
    証明書廃止リストを作成する

    # ダミーのクライアント証明書作成
    ./easyrsa build-client-full dmy nopass
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # ダミーのクライアント証明書廃止
    ./easyrsa revoke dmy
    
    下記内容を入力
    Continue with revocation:yes
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # 証明書廃止リストを作成
    ./easyrsa gen-crl
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # 証明書廃止リストをOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/crl.pem /etc/openvpn/
    # 証明書廃止リストへ参照権限付加
    chmod o+r /etc/openvpn/crl.pem
    
  • TLS認証鍵作成

    # TLS認証鍵作成
    openvpn --genkey --secret /etc/openvpn/ta.key
    

IT単語覚書

  • HTTP
    HTMLなどのコンテンツデータをサーバ・クライアント間でやり取りするプロトコルのこと。
  • HTTPS
    HTTPのURIスキームの1つ。
    厳密にはプロトコルではなく、SSL/TLSプロトコルによって提供されるセキュアなHTTP通信。
    別名はHTTP Over SSL/TLSという。
  • SSL/TLS
    暗号化を提供するプロトコル。
    SSLの方が良く聞くが、SSLはTLSの旧名称。
    通信内容の暗号化と通信相手の証明を行う。
    HTTP専用ではなく、様々なアプリケーション層のプロトコルに利用でき、
    HTTPS(HTTP Over SSL/TLS)だけではなく、
    FTPS(FTP over SSL/TLS)、POP over SSL/TLS、IMAP over SSL/TLS、SMTP over SSL/TLSなどがある。
  • URIスキーム
    一定の書式によってリソースを指し示す識別子。
    URLの考え方を拡張したもの。
    httpやhttpsやftpなどのスキームで始まり、
    コロン(:)による区切りの後にスキームごとに定義された書式によってリソースを示す。

【FireFox】【Poster】リクエスト送信テスト

FireFoxのPosterと呼ばれるアドオンを利用し、
リクエスト送信のテストをしてみました。

  • サーブレット
    サーブレットはTestParamプロジェクトとして定義しておきます。
    TestServletはTestというサーブレットマッピング名として定義しておきます。

    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            // リクエストの設定
            request.setCharacterEncoding("UTF-8");
    
            // ヘッダ部の取得
            StringBuffer head = new StringBuffer();
            Enumeration<String> headernames = request.getHeaderNames();
            while (headernames.hasMoreElements()) {
                String name = headernames.nextElement();
                Enumeration<String> headervals = request.getHeaders(name);
                while (headervals.hasMoreElements()) {
                    String val = headervals.nextElement();
                    head.append(name);
                    head.append(":");
                    head.append(val);
                    head.append("\n");
            }
    
            // ボディー部の取得
            // メモ:Tomcatではrequest.getParameterとgetReaderが同時に使えない。
            BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
            String body = bufferReaderBody.readLine();
    
            // レスポンスの設定
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/hmtl");
            // response.setContentType("application/json");
    
            // ヘッダ部とボディー部の出力
            PrintWriter out = response.getWriter();
            out.println(head.toString());
            out.println(body);
        }
    }
    
  • Poster
    Request-URL:http://localhost:8080/TestJson/Test
    Parametersタブ:Nameにtest、Valueにあいうえおを設定し、
    Add/Changeボタンを押下する。
    Content to Sendタブ:Body from Parametersボタンを押下する。
    POSTボタンを押下する。

    サーブレットがJSONの読み取りに対応していれば、
    ParametersタブのValueに以下を指定すると、JSONをリクエストで飛ばしたことになる。
    {“name”: “John Smith”, “age”: 33}

【JSP】ボタンでリンクと同じ動作を行う

ボタン押下時にリンク押下時と同じ動作を行う。

<input type="button" value="メニュー画面へ" onclick="location.href='Menu.jsp'" class="btn btn-default">

class属性はbootstrapの指定方法のひとつ。
ボタンを無地のデフォルトにします。

【JSP】ボタンやリンクからフォームのアクションを動的に変更しSubmit

ボタンやリンク押下時に
フォームのaction先をJavaScriptで設定し、submitする。

  • ボタンの場合

    <head>
    <script type="text/javascript">
    function exec(){
    	document.form1.value = 'ACTION001'
    	document.form1.submit();
    }
    </script>
    </head>
    
    <form action="" method="POST" name="form1">
    <input type="button" value="ボタン1" onClick="exec()" />
    </form>
    
  • リンクの場合

    <head>
    <script type="text/javascript">
    function exec(){
    	document.form1.value = 'ACTION001'
    	document.form1.submit();
    }
    </script>
    </head>
    
    <form action="" method="POST" name="form1">
    <a href="javascript:void(0)"  onClick="exec()">リンク1</a>
    </form>
    

    hrefに「javascript:void(0)」を指定しないと、
    ルート(http://localhost:8080/コンテキスト)にアクセスする。

【Eclipse】動的Webプロジェクトでのプロパティファイル読込

動的Webプロジェクトのプロパティファイル読込で
以下のように処理を書いてみました。

prop.load(new FileInputStream("hoge.properties"));

プロパティファイルをプロジェクト直下、クラスパス直下、パッケージ直下においてみましたが、
いずれも実行時にエラーになりました。
解決策として以下の通りにしました。

プロパティファイルは「WEB-INF/src」直下に配置し、
「WEB-INF/class」に自動コピーされるので、
以下のように処理を変更しました。

prop.load(this.getClass().getResourceAsStream("/hoge.properties"));