CentOSにSquid(Proxy)をインストールしてProxy経由で日本国内専用サービスにアクセスする方法

日本国内だけのHPやサービスにアクセスする時は普通はVPNを使ったほうがいいんだけど、それが使えないケースもある(私の場合はappetize.io)

 

できるだけ安全に運用するための手順です

イメージ

世界→Myサーバー(squid)→国内専用HP

Basic認証でなおかつホワイトリスト方式(許可したドメインだけのアクセス許可)にします

 

インストール:

yum -y install squid

firewall-cmd –zone=public –add-port=3128/tcp –permanent
systemctl start squid.service
systemctl enable squid.service

yum install httpd-tools

htpasswd -c /etc/squid/passwords user

password#これはBasic認証のために


vi /etc/squid/squid.conf

 

 

/etc/squid/squid.confの中身
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
auth_param basic children 10

acl authenticated proxy_auth REQUIRED
http_access deny !authenticated #このDeny!にしないと、DNSのホワイトリスト方式が取れない

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

acl mysite dstdomain www.yahoo.co.jp
acl mysite dstdomain www.google.co.jp
acl mysite dstdomain .google.com
acl mysite dstdomain fonts.googleapis.com
acl mysite dstdomain ajax.googleapis.com
acl mysite dstdomain cdn.jsdelivr.net
#acl mysite dstdomain .googleapis.com
#acl mysite dstdomain .jsdelivr.net
acl mysite dstdomain youtu.be
acl mysite dstdomain .youtube.com
acl mysite dstdomain appetize.io
acl mysite dstdomain .medicalfields.jp
acl mysite dstdomain 157.7.94.189
acl mysite dstdomain www.ugtop.com #To Check Ip
acl SSL_ports port 443
acl Safe_ports port 80 # http
#acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on “localhost” is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
#http_access allow localhost
http_access allow mysite
http_access deny !mysite

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

dns_v4_first on #こうしないとGoogleに入れなかった

dns_nameservers 8.8.8.8 208.67.222.222

 

 

ApacheのPHP7にバージョンアップしたら実行時に500 Internal Server Errorが出て、php-fpmのエラーログに何も情報が表示されていない場合

.htaccessが悪い可能性が高いです。

私の場合は

.htaccessに

php_value post_max_size 100M
php_value upload_max_filesize 100M
php_flag display_errors On

が記載されていたことが原因でした。

php_valueとphp_flagを削除すると、ちゃんと動きました

どうもphp_valueやphp_flagはPHPのモジュール版でのみ有効で、php7ではセキュリティの観点からデフォルトで無効になっているようです。

素直にphp.iniで設定しましょう

 

ConohaのロードバランサーでHTTPのヘルスモニターがうまく動作しない

当社はNginxでConohaのロードバランサーを使用している。

今まではPINGでヘルスチェックを行っていたのだが、Nginxに障害が出た際に、Pingだと予備サーバーのNginxデーモンが落ちた際に、うまいことバランシング出来なくて、障害が発生したので、HTTPのヘルスチェックに切り替えることにした。

でもうまいこと行かない

原因はHTTPSでした。

今までNginxは

server {
listen 80;
server_name xxx.medicalfields.jp;

if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}

てな感じで設定したんだけど、どうもConohaだとHTTPでアクセスするとステータスコードが301(URL転送)になってヘルスチェック失敗になるっぽい

そのため親ディレクトリだけはHTTPでアクセスした際にリダイレクトしないように設定した

解決↓

server {
listen 80;
server_name xxx.medicalfields.jp;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
location ^~ /php/ {
if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}
}

ロードバランサーでHTTPのヘルスチェックに失敗する場合は、参考にしてください

 

WordPressのサーバー移動時に記事のURL(ドメイン)を変えることなく、新サーバーで事前テストする方法

タイトルが長くなったけど、つまりはWordpressの設定で

WordPress アドレス (URL):medicalfields.jp

みたいな感じで普通は設定するけど、これだとテストで自分の環境だけで動かしたい場合、テスト環境じゃなくて本番環境のURLに飛ばされる(当たり前だけど)

でも、サーバー移行時のテストなどで、どうしても自分の環境だけで本番URLのままで試したい場合がある。

解決法:

hostsファイルを書き換えましょう

具体的にはテスト環境のIPアドレスに書き換える

例えば当ブログだとmedicalfields.jpがドメインなので、これをテスト環境のIPアドレス(ローカル環境だと127.0.0.1とか)に書き換える。

そうすると、なんとローカル環境でもURLがきちんと逆引きされWordpressが問題なく動作する。

ちなみにWindowsの場合でしか試していないですけど、マックでも問題なくできるとは思う

やり方:

・Windows 10のhostsファイルの場所

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 medicalfields.jp

と追加する

ちなみに管理者権限じゃないと書き換えれないです。また、上書きしたら直ぐに反映されます。

これを知っているだけでwordpressのサーバー移動がかなり楽になるので、ぜひ試してください!

CentOS7からCentOS8に移行した時にトラブったこと

現在当社ではConohaのVPSとオブジェクトストレージとロードバランサーを利用している。

その中でさらにVPSではDB(mariaDB)サーバー、HTTPS(Nginx)サーバーで分けている(DBはインターネットからは接続できないようにしている)。

セキュリティアップデートと動作が早くなるとのことで今回VPSをすべてCentOS8に変更してみた。

素直に動作するかなーと思ったら動作しなかったので、トラブった所をメモ

トラブった所

症状:カスタムのネットワークスクリプト(/etc/sysconfig/network-scripts/)で設定した、プライベートIPアドレスの設定がうまいこと行かない

nmtuiで確認したのに、なんかプライベートIPアドレスが設定されていなかったり設定されていたりする。

これ凄く悩んだ。なぜなら中途半端にスクリプトが動いたから

例えばcd /etc/sysconfig/network-scripts/

でロードバランサーを使用する場合はlo: <LOOPBACK>の設定をするんだけど、Loは有効になってなくて、eth1とかはスクリプトが動いたから(nmtuiでの設定は信用できない?)

ifcfg-eth1は動きます

解決法:network-scriptsが未インストール(deprecated)なのでインストールする

コマンド:yum install networkscripts

 

 

症状:systemctl restart network が動作しない

解決法:systemctl restart NetworkManager.service にかわった

とりあえず、ネットワーク関係がちょっと変わっている。

それ以外は一応問題なく動いた。

まぁCentOS8からyumじゃなくてdnfに変わったけど、しばらくはyumが使えるっぽい

あと、メインHPのWordpressの移行もやったからそれについても後日記事各予定です。

Windows hostsファイルを書き換えて、ローカルで確認ってやり方が凄く良かったから、それについて詳しく書きます!

 

AWS IoT ButtonでSwitch Botをオンにする

現在、当家ではセコムホームセキュリティに入っている。

これをSwitch Botを使ってアマゾンダッシュボタンではなくアマゾンダッシュボタンの代わりとなるAWS IoT Button(AWS IoT エンタープライズボタンとか)でオン、オフを制御しようと思う。

イメージとしては

AWS IoT Button

自宅ルーター

AWS IoT 1-Click

AWS Lambda

IFTTTのWebhook

自宅ルーター

Switch Bot Hub

Switch Bot

セコムホームセキュリティがオン

という流れ。

ボタンが押されたらセコムが自動的にオンになって、すごく安全になるはず。

この設定で難しいところがAWS関係だと思うので、そこを中心にやり方を説明します!

やり方

1.スマホにSwitch Botインストールし、ID作って、セットアップ

2.スマホにIFTTTをインストールして、IFTTTのSwitch Botのアクセスを許可して、WebhooksでSwitch Botの連動設定

こんな感じになる

3.スマホにAWS IoT 1-Click(Apple Store Google Play)をインストールして、AWS IoT buttonをセットアップ

4.PCよりAWSにログインしてサービス→コンピューティング→Lambdaを開いて関数作成

関数名:secom

ランタイム:python 3.6

でプロジェクト作成

5.Lambdaの関数コードにIFTTTと連動させる

 

IFTTTのAPIキーはWebhooksのAccount Infoで見れる

シングルクリック、ダブルクリック、長押しの変更は以下のコードを参考にしてください

↓これを入力(APIキーはかえてね)↓

import json
import urllib.request
    
def lambda_handler(event, context):
    clicktype = event['deviceEvent']['buttonClicked']['clickType']
    print(clicktype)
     
    if (clicktype == "SINGLE"):
        url = 'https://maker.ifttt.com/trigger/secom_on/with/key/あなたのAPIkey'
        message = "ボタンが1回押されました"
    elif (clicktype == "DOUBLE"):
        url = 'https://maker.ifttt.com/trigger/secom_off/with/key/あなたのAPIkey'
        message = "ボタンが2回押されました"
    elif (clicktype == "LONG"):
        url = 'https://maker.ifttt.com/trigger/secom_off/with/key/あなたのAPIkey'
        message = "ボタンが長押しされました"
    else:
        message = "clickTypeを正常に取得できませんでした"
        

    req = urllib.request.Request(url)
    with urllib.request.urlopen(req) as res:
        body = res.read()
    return {
        'statusCode': 200,
        'body': json.dumps('')
    }

作成できたらこんな感じになる

6.AWSのメイン画面に戻って、サービス→IoT→IoT 1-Click→プロジェクトを作成を選択

7.プロジェクト名に適当な名前をつけて以下のように設定し、プロジェクトを作成

8.作成したプロジェクトにプレイスメントを以下のように設定。

9.IoT 1 Clickのメイン画面に戻って、管理→デバイス→デバイスの有効化

以上で設定完了です。

これでIoT buttonを押したらSwitch Botが反応するようになります。

ただ、注意点として、毎月AWSのサーバー利用代金に25円ほどかかります。

また押してからのタイムラグは7秒ほどあります!

 

 

Buffaloの外付けSSD(SSD-PM120U3A-S)を分解したらSSDが入ってなかった

ノートパソコンのHDDが壊れたから修理のためにSSDを調達しようとした。

すると最近SSDの値段が高騰していて、2.5インチの内蔵SSDがなかなか昔と比べて値段が上がっている。

安く買えないかなーと思っていたら128GBのBuffaloの外付けSSD(SSD-PMU3AシリーズのSSD-PM120U3A-S)が相対的にお安く買えたので購入した。

これを分解してHDDが壊れたノートパソコンに換装する予定だったのだが、誤算だった。

↓分解から結果↓

2.5インチのHDDとの比較、明らかに小さい(この時点でちょっと焦る)

裏の比較

USB3.1(Gen1)の差込口

普通に小さなマイナスドライバーでこじ開ける

 

こじ開けた結果

 

SATAが挿せるSSDが入ってない・・・・・・・・

使いみちがなくなってしまった。

非常に残念

Google Tag Managerでタグが配信されないことがある

当サイトではGoogle Tag ManagerからGoogle Analyticsに飛ばしてサイトのアクセスを管理している。

そのときにURLに /blog/ が含まれている場合はBlog用のUniversal Analyticsに飛ばして、でもmedicalfields.jpのAll pagesの解析もしたいとのことで、これにもタグを飛ばしている。

でも何故か、All Pagesのタグが飛ばないことがある。

モバイルだとより飛んでなさそう

これは多分ブラウザのリクエスト数の制限を受けているからっぽいです。

https://support.google.com/tagmanager/answer/6103683?hl=ja

発火するタグは減らしましょう

 

あと、<!– Google Tag Manager (noscript) –>タグの設置はちゃんと<body>のあとにしましょう

最新の医薬品データベースを取得できるサイトまとめ

医薬品のデータベースには色々な種類がある

例えば個別医薬品コード(YJコード)、薬価基準収載医薬品コード、レセプト電算処理システムコード、JANコード、調剤包装単位コード、販売包装単位コードなど沢山

薬価基準収載医薬品コードと個別医薬品コードの違い

 

国とか一般財団などが提供している、最新情報にアップデートされる(はずの)無料で使える医薬品データベースをまとめました。

 

薬価基準収載医薬品コード(=厚生省12桁コード)

個別医薬品コード(=YJコード)

JANコード(≒販売包装単位コード)

レセプト電算処理システム用コード(1)

医薬品名

Medis一般財団法人 医療情報システム開発センター

 

レセプト電算処理システム用コード(1)

医薬品名

医薬品名(カタカナ)

薬価

薬価マスタ診療報酬情報提供サービス

 

個別医薬品コード(=YJコード、商品を区別できる)

JANコード(≒販売包装単位コード)

調剤包装単位コード(ヒートのバーコード [0] から始まる)

販売包装単位コード(箱のバーコード [1] から始まる)

元梱包装単位コード(多分ダンボールとかのバーコード [2] から始まる)

販売名・調剤包装単位コードファイル一般財団法人医療情報システム開発センター

 

薬価基準収載医薬品コード(=厚生省12桁コード)

成分名

薬価基準収載品目リスト及び後発医薬品に関する情報について厚生労働省

 

※ちなみにJANコードは廃止されたけど、販売包装単位コードから頭文字の「1」を抜いて、チェックディットを計算させて増やせばJANコードに擬似的に復元することはできる。

薬価基準収載医薬品コードと個別医薬品コードの違い

Meids収載の個別医薬品コード(YJコード)薬価基準収載医薬品コードは微妙に違う

 

基本的に、[個別医薬品コード(YJコード)]=[薬価基準収載医薬品コード]で割り当てられているけど、たまに違うコードがある

これは、薬価請求の時に2種類の方法で請求ができる医薬品があるため、その場合は[薬価基準収載医薬品コード]として別に割り当てられているからだ。

 

商品名レセ電算コード」と「統一名レセ電算コード」による請求である

※Medisでは

商品名レセ電算コード=レセプト電算処理システムコード(1)

統一名レセ電算コード=レセプト電算処理システムコード(2)

 

統一名レセ電算コード」による請求は同じ成分の医薬品なら同じ金額になる

そのため、「統一名レセ電算コード」による請求が出来る場合は、他の同じ成分の医薬品と同じコードになる(ちなみに[薬価基準収載医薬品コード]は末尾から2つ目に全部[01]が割り当てられている)

 

例:アマンタジン塩酸塩錠50mg「杏林」

価基準収載医薬品コード:1161001F1018(610461046【統一名レセ電算コード】)

個別医薬品コード:1161001F1140(620008286【商品名レセ電算コード】)

 

アマンタジン塩酸塩錠50mg「ZE」

薬価基準収載医薬品コード:1161001F1018(610461046【統一名レセ電算コード】)

個別医薬品コード:1161001F1115(620117114【商品名レセ電算コード】)

 

参考:シンメトレル錠50mg

薬価基準収載医薬品コード:1161001F1050(統一名レセ電算コードなし)

個別医薬品コード:1161001F1050(611240080【商品名レセ電算コード】)