日時:NATの背後にあるサーバーからルーターの白いIPアドレスを見つける

こんにちは、Habr。



QAセクションの質問に答えられないため、 この質問への回答を記載した小さな投稿をすることにしました

私の解決策は質問よりも幾分広範であり、他の誰かに役立つことを願っています。



少しの背景。

あるとき、彼は小さな組織で訪問管理者としての仕事を得ました。 インターネットは、ADSLを介して動的ホワイトIPに接続された1台のコンピューター(ゲートウェイと呼びます)を介して配布されました。



私は常にオフィスにいなかったので、軽微な問題を迅速に解決するには、組織のローカルネットワークへのリモートアクセスが必要でした。 Windowsゲートウェイを削除して(Windows XPとKerio Winroute Firewallがあった)、CentOS 6をインストールした後、ゲートウェイに接続する可能性が常にあるのではないかと考えました。



ダイナミックDNSサービス(ホームルーター上)を使用することで既に良い経験があったため、dyndns.orgで別のアカウントが開かれました。

次に、 inadynパッケージがゲートウェイにインストールされました(dyndns.org自体が推奨するパッケージの1つとして)。



その後、2つのbashスクリプトが作成されました。 両方ともクラウンで実行され、最初は5分ごと、2番目は毎週実行されます。 これは次の理由で行われました。

5分ごとに未変更のIPをサーバーに送信すると、一定回数の試行の後、dyndns.orgは単純に偶数のアカウントをブロックし、アカウントに移動するだけで再びロックを解除できます。 そのため、dyndns.orgにIPを送信する前の最初のスクリプトは、現在の実際のIPがドメイン名のdyndns.orgサービスによって発行されたものと異なるかどうかを最初にチェックします。

dyndns.orgサービスがこのアカウントを忘れないように、2番目のスクリプトが必要です。 繰り返しますが、無料モードでは、dyndns.orgサービスに長時間連絡しないと、アカウントは再びブロックされます。 したがって、2番目のスクリプトは、IPが変更されていなくても、常にIPを送信します。



実際には、スクリプト自体です。

最初のipupdate:

#!/bin/sh logger -t ipupdate "UPDATING IP START" # HOSTNAME is your DynDNS hostname HOST2=my-remote-server.dyndns.org HOST3=my-remote-server-other.dyndns.org # NSLOOKUP is the current DNS entry for your DynDNS hostname OLD_IP2=`/usr/bin/nslookup -sil $HOST2 | tail -2 | head -1 | cut -d" " -f2 | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` if [ "$OLD_IP2" = "" ] ; then logger -t ipupdate "Not entry IP for $HOST2. Second empty..." OLD_IP2=`ping $HOST2 -c 1 | head -1 | cut -d" " -f3 | sed 's/(//' | sed 's/)//' | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` fi if [ "$OLD_IP2" = "" ] ; then logger -t ipupdate "Not entry IP for $HOST2. Second empty: FAILED" fi OLD_IP3=`/usr/bin/nslookup -sil $HOST3 | tail -2 | head -1 | cut -d" " -f2 | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` if [ "$OLD_IP3" = "" ] ; then logger -t ipupdate "Not entry IP for $HOST3. Second empty..." OLD_IP3=`ping $HOST3 -c 1 | head -1 | cut -d" " -f3 | sed 's/(//' | sed 's/)//' | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` fi if [ "$OLD_IP3" = "" ] ; then logger -t ipupdate "Not entry IP for $HOST1. Second empty: FAILED." fi if [ "$OLD_IP2" = "" ] && [ "$OLD_IP3" = "" ] ; then logger -t ipupdate "CHECKING INTENAL IP FAILED" logger -t ipupdate "EXIT" exit fi # Services for check external ip CHECK_IP0='ifconfig.me/ip' CHECK_IP1='http://checkip.dyndns.com' CHECK_IP2='http://2ip.ru' CHECK_IP3='http://www.netins.net/dialup/tools/my_ip.shtml' logger -t ipupdate "$HOST2 has IP: $OLD_IP2" logger -t ipupdate "$HOST3 has IP: $OLD_IP3" logger -t ipupdate "Check external IP throw $CHECK_IP0" CURRENT_IP=`/usr/bin/curl $CHECK_IP0 | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` if [ "$CURRENT_IP" = "" ]; then logger -t ipupdate "Checking external IP throw $CHECK_IP0 FAILED" logger -t ipupdate "Check external IP throw $CHECK_IP2" CURRENT_IP=`/usr/bin/lynx -dump $CHECK_IP1 | awk '/Current IP Address:/ { print $4; }' | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` fi if [ "$CURRENT_IP" = "" ]; then logger -t ipupdate "Checking external IP throw $CHECK_IP1 FAILED" logger -t ipupdate "Check external IP throw $CHECK_IP2" CURRENT_IP=`/usr/bin/lynx -dump $CHECK_IP2 | awk '/ IP :/ { print $4; }' | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` fi if [ "$CURRENT_IP" = "" ]; then logger -t ipupdate "Checking external IP throw $CHECK_IP2 FAILED" logger -t ipupdate "Check external IP throw $CHECK_IP3" CURRENT_IP=`/usr/bin/lynx -dump $CHECK_IP3 | grep -A2 "Your current IP Address is:" | tail -n1 | tr -d ' '|sed '/^$/d'| sed 's/^ *//g' | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` fi if [ "$CURRENT_IP" = "unknown" ] || [ "$CURRENT_IP" = "" ] ; then logger -t ipupdate "Checking external IP throw $CHECK_IP3 FAILED" logger -t ipupdate "CHECKING EXTERNAL IP FAILED" logger -t ipupdate "EXIT" exit fi logger -t ipupdate "Real IP: $CURRENT_IP" if [ "$OLD_IP2" != "$CURRENT_IP" ] || [ "$OLD_IP3" != "$CURRENT_IP" ] ; then logger -t ipupdate "IP need to update" if [ "$OLD_IP2" != "$CURRENT_IP" ] ; then inadyn --input_file /etc/inadyn/remote1.conf fi if [ "$OLD_IP3" != "$CURRENT_IP" ] ; then inadyn --input_file /etc/inadyn/remote2.conf fi logger -t ipupdate "sleeping for 30 sec" sleep 30 logger -t ipupdate "daemon for updating has stoped" killall inadyn # Flush local DNS cache of $HOSTNAME /sbin/service named restart else logger -t ipupdate "Current IP is actual" fi logger -t ipupdate "UPDATING IP FINISHED" exit
      
      





my-remote-server.dyndns.orgとmy-remote-server-other.dyndns.orgは、異なるアカウントからのエイリアスの例です。 2つ以上のDNS名が必要なので、2つのアカウントを登録しました。 IPアドレスの確認は、すべてのDNS名に適用されます。

remote1.confおよびremote2.conf-dyndns.orgの異なるアカウントの構成。

ロガー-フレーズを標準ログに書き込みます。削除できます-作業には影響しません



2番目のipupdWeek:

 #!/bin/sh logger -t ipupdWeek "WEEK UPDATING IP START" # script name of updating IP script='ipupdate' # check for running of script of update IP scriptRunning=`/bin/ps aux | grep $script | grep -v 'grep'` if [ "$scriptRunning" = "" ]; then logger -t ipupdWeek "Script of updating IP IS NOT running" echo "Not running" else logger -t ipupdWeek "Script of updating IP IS RUNNING, killall it" killall $script fi logger -t ipupdWeek "Start inadyn to update all IP" inadyn --input_file /etc/inadyn/remote1.conf inadyn --input_file /etc/inadyn/remote2.conf logger -t ipupdWeek "Sleeping 10 sec" sleep 10 logger -t ipupdWeek "Stop inadyn" killall inadyn logger -t ipupdWeek "WEEK UPDATING IP STOP" exit
      
      





ここではすべてが明確だと思います。



最小限の変更(現在のIPを確認するためのサービスを追加)が行われたこれら2つのスクリプトは、2年以上機能しています。 電気とインターネットの中断はひどいものではありません-5分間インターネット接続を設定した後(王冠で変更可能)、再びリモートで接続できるようになります。



PS何かオリジナルなふりをするつもりはありませんが、一度これらのスクリプトに時間を費やす必要があったので、この投稿がこの時間を節約するのに役立つことを願っています。



PPSこのすべてをまったく気にしないために-モデムをルーターモードにし(それ自体でポート転送)、モデム自体にdyndnsを構成します。

その瞬間、これがすべて完了したとき、モデムはルーターモードで動作しなくなりました。 今では新しいモデムを使用しています-「動作する-神のために触れないでください」(c)ので、私はまだ何も変更する理由がありません。



All Articles