Windows의 기본 VPN설정으로 Netplix접속시 주의사항

목적 외국에서 한국 Nexplix를 보고 싶다. 하지만 유료 VPN은 별로 사용하고 싶지 않다. 수시로 접속 거부를 당하면서 요금을 지불하고 싶지는 않다. 해결책 부모님 댁에 VPN서버를 지원하는 무선공유기를 한대 설치해 드리고 나는 외국에서 VPN으로 접속하여 Nexplix를 감상한다! 상황 공유기에 설정한 VPN에 iPad, Macbook으로 접속하면 문제 없이 한국 Netplix로 접속되는것을 확인했다. Windows11에서는 기본 VPN으로 iptime의 VPN에 접속하면 일본 Netplix로 접속 된다. 원인 처음에는 VPN의 Split Tunneling 문제가 아닐까 싶었다. Windows의 VPN설정에서는 Split Tunneling설정이 보이지 않았으므로 Power Shell에서 확인해 보았지만 Split Tunneling은 설정되어 있지 않았다.  결론부터 말하면 원인은 DNS서버였다. 이유는 모르겠지만 MacBook에서는 VPN접속시, DNS서버도 VPN서버의 DNS가 자동으로 설정되었는데 Windows11에서는 DNS서버가 변경되지 않아 한국 지역으로 인식되지 않았던 것으로 추측. Solution Windows11의 VPN접속 설정에서 접속시의 DNS서버를 한국의 공유기 IP로 지정을 해주었다. 그리고 IPv6이용설정을 해제하여 IPv4만 이용하도록 설정하니 문제 없이 접속되었다. 다음 문제 미니PC를 한대 구매하여 모든 설정을 마쳤지만 매번 키보드/마우스로 조작하는게 귀찮아 Remote Desktop으로 접속하는 것을 생각했다. 미니PC에 접속할때는 iPad를 이용할 계획인데 현재 찾아본 바로는 Console접속을 지원하는 Application이 없는 듯 하다. RemoteDesktop으로 접속하면 현재 TV에 연결해 놓은 세션은 꺼져버리니 Console로 접속가능한 어플리케이션이 필요하다. TeamView를 이용하니 어느정도 문제가 해결되긴 했지만 여기저기 조그마한 문제점들이 있어 고민중.

phpでAWSのstatusページから異常を検知してchatworkへ通知する

 Amazonは「http://status.aws.amazon.com」からAWSのサービス状況を確認できるページを提供している。ブラウザでアクセスすると各リージョンのサービス簡単に確認できる。そして、RSSにも対応しているのでRSSフィーダーを使ってサービスに異常が発生した場合、通知してくれる。

 

今回はphpを使ってRSSフィーダーを定期的にチェックし、新しいアイテムがフィーダーされたらそれを確認する仕組みを作ってみた。たまにしか起きないけど1回起きたら大きい影響を与えるので定期的に確認した方が絶対いい。

 

確認対象サービスはリージョンと関係ないグローバルサービスとリージョンに装束されるサービので2つに分けた。別に1つにしてもいいけど、RSSフィーダーのURLが微妙に違うので分けただけ。

 

$awspub = array (
  "cloudfront", "route53", "route53domainregistration", \
  "import-export", "management-console", "marketplace", \
  "awswaf"
);
 
$awsreg = array (
  "apigateway", "cloudwatch", "dynamodb", "ecr", "ecs", "ec2", \
  "elb", "emr", "elasticache", "glacier","kinesis", "rds", \
  "route53", "sns", "sqs", "s3", "vpc", "autoscaling", \
  "certificatemanager","cloudformation", "cloudtrail", "codedeploy", \
  "directconnect", "elasticbeanstalk", "iam","internetconnectivity", \
  "kms", "lambda", "opsworks", "state", "storagegateway"
);

その後は時間を変換してくれる関数を作った。status.aws.amazon.comのページはPSTかPDTで表示されている。通知してくれるならやさしくちゃんとJSTへ変換しよう。変換した日付をそのまま出力することもありだけどこの後時間の演算が必要いになったので結局 timestampへ変換してその値を返すことにした。


function dateToJST($date) {
 
  $newdate=DateTime::createFromFormat("D, d M Y H:i:s T", $date);
  $timezone=date_format($newdate, "T");
  if      ($timezone == "PST") { $adjuster="+17 hour"; }
  else if ($timezone == "PDT") { $adjuster="+16 hour"; }
 
  return strtotime($adjuster, strtotime(date_format($newdate, "Y-m-d H:i:s")));
}

 

後は関数かした取得コードを実行するだけ。引数としてグローバル(glb)か、リージョン(reg)なのかを教えてあげる必要がある。ここでは通知先をchatworkの板にしてある。chatworkのAPIを利用して指定の板へメッセージを書き出すことにした。以下にフールコードを残す。


#!/usr/bin/php
<?php
$workdir="/tmp/awsstatus";
$flgfile="$workdir/chk_aws_status.flg";
$interval=60*15; #15m with crontab
$now=time();
$TOKN="xxxxxxxxxxxxxxxxx"; ⇒ chatworkのapi token key
$CWEP="https://api.chatwork.com/v2/rooms";
$RMID="xxxxxxxx"; # chatworkの通知先板番号
 
if (file_get_contents($flgfile) == 1) {
  echo "stop script excute by flag file '$flgfile'\n\n";
  exit;
}
 
$awspub = array (
  "cloudfront", "route53", "route53domainregistration", \
  "import-export", "management-console", "marketplace", \
  "awswaf"
);
 
$awsreg = array (
  "apigateway", "cloudwatch", "dynamodb", "ecr", "ecs", "ec2", \
  "elb", "emr", "elasticache", "glacier","kinesis", "rds", \
  "route53", "sns", "sqs", "s3", "vpc", "autoscaling", \
  "certificatemanager","cloudformation", "cloudtrail", "codedeploy", \
  "directconnect", "elasticbeanstalk", "iam","internetconnectivity", \
  "kms", "lambda", "opsworks", "state", "storagegateway"
);
 
chk_status($awsreg, "reg");
chk_status($awspub, "glb");
 
function chk_status($arrsrv, $div) {
  global $interval;
  global $now;
  global $TOKN;
  global $CWEP;
  global $RMID;
 
  $cntarr=count($arrsrv);
  for ($i=0; $i<$cntarr; $i++) {
    $key=$arrsrv[$i];
    $rssurl="http://status.aws.amazon.com/rss/${key}";
    if ($div=="reg") { $rssurl.="-ap-northeast-1"; }
    $rssurl.=".rss";
    $xml=simplexml_load_string(file_get_contents($rssurl));
    $servicename=$xml->channel->title[0];
    $lastupdated=dateToJST($xml->channel->updated);
 
    echo "Service Name: $servicename\n";
    echo "Last Updated: ".date("Y/m/d H:i:s", $lastupdated)." JST\n";
 
    $cntticket=count($xml->channel->item);
    echo "Count of Feeder's Ticket: $cntticket\n";
    if ($cntticket > 0) {
      for ($j=0; $j<$cntticket; $j++) {
        $ticket['title']=$xml->channel->item[$j]->title;
        $ticket['date']=dateToJST($xml->channel->item[$j]->pubDate);
        $ticket['desc']=$xml->channel->item[$j]->description;
        echo "Ticket Number: $j\n";
        echo "Ticket Title: $ticket[title]\n";
        echo "Ticket Date: ".date("Y/m/d H:i:s", $ticket['date'])." JST\n";
 
        if (($now - $ticket['date']) < $interval) {
          $message ="[info][title]AWSのサービス状況に変更が発生しました。[/title]";
          $message.="◆[".date("Y/m/d H:i:s", $ticket['date'])."] $servicename\n";
          $message.="◆Title : $ticket[title]\n";
          $message.="◆Description\n$ticket[desc]\n";
          $message.="http://status.aws.amazon.com\n";
          $message.="[/info]";
          exec ("/usr/bin/curl -X POST -H \"X-ChatWorkToken: $TOKN\" -d \"body=$message\" \"$CWEP/$RMID/messages\"");
          echo "$message\n";;
          $message="";
        }
      }
    }
  }
}
 
function dateToJST($date) {
  $newdate=DateTime::createFromFormat("D, d M Y H:i:s T", $date);
  $timezone=date_format($newdate, "T");
  if      ($timezone == "PST") { $adjuster="+17 hour"; }
  else if ($timezone == "PDT") { $adjuster="+16 hour"; }
 
  return strtotime($adjuster, strtotime(date_format($newdate, "Y-m-d H:i:s")));
}
?>
  • 途中にはコマンドラインで実行した際のdebug用としてechoで情報を出力するコードも入っている。
  • Intervalは適当に。しかし、cronによる実行間隔とあわせておかないとチェックには漏れが発生するので注意。

댓글

이 블로그의 인기 게시물

CISCO 2960s 초기화 후 기본 설정

curl 명령어 옵션

맥북 카라비너 영어/한글/일본어 전환하기