- PR -

DHCPサーバでの設定の上書き

投稿者投稿内容
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2004-07-31 17:29
こんにちわ.

ちょっと待ち時間に手元(実は構築作業中)の Linux で検証してみちゃいました.
※作業員さんゴメンナサイ.
で,/etc/sysconfig/network はまったく無視されました.が,他に方法は見つけてみました.ただし,RedHat Enterprise Linux なのでどこまで皆さんの環境に match するか判りませんのでそのつもりで読んでください.

結論から言うと,

/etc/sysconfig/network-script/ifup.eth0

という file に route command が書かれていると,/etc/sysconfig/network が流れる際に
読んでくれるようです.ここに

route del default
route add default gw "変更後の ip address"

と書いてやると,script が流れた後の default gateway は "変更後" の方になってました.近場に訊いたところ,/etc/sysconfig/network-script/route-eth0 に書けば良いらしい話もありましたが,こちらだと「追加は出来る」ようでした.単に「削除ができる」やり方が判らなかっただけですが...

断線後の回復や rease 待ちの検証などはしてませんが,とりあえずご参考までに.
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-07-31 19:39
おはようございます^^; コメントつけた後、気がついたらダウンして寝ておりました。起きたら夜なんですが…(苦笑)

# またコメントできてうれしく思います(^^)

引用:

kazさんの書き込み (2004-07-31 00:51) より:
/etc/rc.local は「起動時に実行」な内容ですよね?/etc/init.d/dhcpcd restart したり,/etc/init.d/network したり,あるいは DHCP client として release -> rease したらどうなるのでしょう?default gateway が over-write されたりしないのでしょうか?



dhcpcdの動作について簡単にテストしました。まず、最初に…

  /etc/dhcpc/dhcpcd-<interface>.exe
   IP アドレスの変更を検出した時に dhcpcd が 実行しようとするファイル。

…は、存在しないようです^^; どうやらVineのマニュアルが間違っているようですね^^;;;;; 実際、ソースも確認したのですが、やっぱりなさげでした(苦笑) 代わりに、「-c」オプションと「/etc/dhcpcd.exe」はソース上にて健在で、こちらはどちらも動作することを確認しました。

次に、「dhcpcd-<interface>.info」ファイルの検証をしたのですが、これはどうやっても「gateway」に反映できませんでした。

具体的には…

 1.renew(dhcpcd -n)
  → Default Gateway変わらず

 2.renew(dhcpcd -n) ※Default Gatewayを削除して実行
  → Default Gateway追加されず

 3.release → rease(dhcpcd -k, dhcpcd)
  → 「.info」ファイルがdhcpサーバの情報で更新されます^^;

簡単に実現するなら「/etc/dhcpcd.exe」を作ってしまうのが手っ取り早いかと。ただし、NIC2つでDHCPとか利用すると問題が出るかも知れません^^; それと、ifdown時にも実行されるのが気味が悪いですね。他には推奨されないオプション「-c」を利用する手もあります。この場合は「/etc/sysconfig/network-scripts/ifcfg-eth0」に「DHCPCDARGS」を追加して、ifupを修正する必要があります。(VineのifupはDHCPCDのコマンドパラメータを受け渡すときのスクリプト処理にバグがあるようで、何故か「DHCP_HOSTNAME」でパラメータを塗りつぶしてしまいます^^; なので、以下の方法で修正しておかないとDHCPCDにパラメータを渡す処理が必要な場合うまく動作しません)dhcpcdによってntp.confを書き換えられて困っている人にも、この修正はおすすめします。

↓ifcfg-eth0(「-N」はntp.confの非書き換え)
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
DHCPCDARGS="-N -c /etc/dhcpc/dhcpcd-eth0.exe"


↓ifup(だいたい、150行目あたり)
if [ -n "${DYNCONFIG}" ]; then
  PUMPARGS=$PUMPARGS
  DHCPCDARGS="$DHCPCDARGS -n"
  if [ -n "${DHCP_HOSTNAME}" ]; then
   PUMPARGS="-h ${DHCP_HOSTNAME}"
# Modified Youyu 07/31 2004
    #DHCPCDARGS="-h ${DHCP_HOSTNAME}"
    DHCPCDARGS="${DHCPCDARGS} -h ${DHCP_HOSTNAME}"
# Modified Youyu 07/31 2004

  fi
  if need_hostname; then
    PUMPARGS="${PUMPARGS} --lookup-hostname"
    DHCPCDARGS="${DHCPCDARGS} -H"
  fi

↓/etc/dhcpc/dhcpcd-eth0.exe
#!/bin/sh
/sbin/route del default > /dev/null
/sbin/route add default gw xxx.xxx.xxx.xxx metric 1 > /dev/null

#  タグのミス修正と、「/etc/dhcpc/dhcpcd-eth0.exe」を追加
## kaz様のご指摘による「#!/bin/sh」を追加


[ メッセージ編集済み 編集者: 水無月 遊々 編集日時 2004-08-01 02:08 ]
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2004-08-01 00:55
こんばんわ.

なんとなく夜明かし体勢だったりします...
また待ち時間があったので,ことのついでに dhclient を rpm -e して RHEL に dhcpcd を導入してみました.turbolinux の SRPM を rebuild してみました.

引用:

水無月 遊々さんの書き込み (2004-07-31 19:39) より:

  /etc/dhcpc/dhcpcd-<interface>.exe
   IP アドレスの変更を検出した時に dhcpcd が 実行しようとするファイル。

…は、存在しないようです^^; どうやらVineのマニュアルが間違っているようですね^^;;;;; 実際、ソースも確認したのですが、やっぱりなさげでした(苦笑) 代わりに、「-c」オプションと「/etc/dhcpcd.exe」はソース上にて健在で、こちらはどちらも動作することを確認しました。


素のままでは /etc/dhcpcd.exe は読まれませんでした.
で,
引用:

DHCPCDARGS="-N -c /etc/dhcpc/dhcpcd-eth0.exe"


これで読んでくれるようでした.明示的に指定してやったほうが適切かもしれませんね.
ただ,
引用:

↓/etc/dhcpc/dhcpcd-eth0.exe
/sbin/route del default > /dev/null
/sbin/route add default gw xxx.xxx.xxx.xxx metric 1 > /dev/null


#!/bin/sh
は書いてあげたほうが良いかもです.

以上,ご参考までに.
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-08-01 02:07
こんばんは。

引用:

kazさんの書き込み (2004-08-01 00:55) より:
なんとなく夜明かし体勢だったりします...



 お疲れさまです。なんだか大変そうですが、お体には気をつけてくださいまし。

引用:

素のままでは /etc/dhcpcd.exe は読まれませんでした.



 あれ? パッケージによって違うんですかね^^; Vineですと、以下の部分で呼ばれています。ちなみにバージョンは「1.3.21-pl2」です。

↓dhcpcd.h(26行目から)
#ifndef PACKAGE
#define PACKAGE "dhcpcd"
#endif
#define PROGRAM_NAME PACKAGE


↓pathnames.h(29行目から)
#define PID_FILE_PATH ""_PATH_VARRUN""PROGRAM_NAME"-%s.pid"
#define DHCP_CACHE_FILE "/etc/dhcpc/"PROGRAM_NAME"-%s.cache"
#define DHCP_HOSTINFO "/etc/dhcpc/"PROGRAM_NAME"-%s.info"
#define EXEC_ON_CHANGE "/etc/dhcpc/"PROGRAM_NAME".exe"
#define RESOLV_CONF "/etc/resolv.conf"
#define NIS_CONF "/etc/yp.conf"
#define NTP_CONF "/etc/ntp.conf"


↓client.c(1337行目から)
/*****************************************************************************/
void execute_on_change(prm)
char *prm;
{
 if ( fork() == 0 )
  {
   char *argc[6],ipaddrstr[16];
   snprintf(ipaddrstr,sizeof(ipaddrstr),"%u.%u.%u.%u",
   ((unsigned char *)&DhcpIface.ciaddr)[0],
   ((unsigned char *)&DhcpIface.ciaddr)[1],
   ((unsigned char *)&DhcpIface.ciaddr)[2],
   ((unsigned char *)&DhcpIface.ciaddr)[3]);
   argc[0]=PROGRAM_NAME;
   argc[1]=IfName;
   argc[2]=prm;
   argc[3]=ipaddrstr;
   if ( DebugFlag )
    argc[4]="-d";
   else
    argc[4]=NULL;
   argc[5]=NULL;
   if ( execve(EXEC_ON_CHANGE,argc,ProgramEnviron) && errno != ENOENT )
    syslog(LOG_ERR,"error executing \""EXEC_ON_CHANGE" %s %s %s\": %m\n",IfName,prm,ipaddrstr);
   exit(0);
  }
}


引用:

#!/bin/sh
は書いてあげたほうが良いかもです.



 ご指摘ありがとうございます。元文章に追加いたしました。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2004-08-01 03:11
引用:

水無月 遊々さんの書き込み (2004-08-01 02:07) より:

引用:

素のままでは /etc/dhcpcd.exe は読まれませんでした.



 あれ? パッケージによって違うんですかね^^; Vineですと、以下の部分で呼ばれています。ちなみにバージョンは「1.3.21-pl2」です。


こちらでは 1.3.22-pl4 でした.
で,SRPM を開いてみました.
dhcpcd.h は変りありませんでした.

引用:

↓pathnames.h(29行目から)
#define PID_FILE_PATH ""_PATH_VARRUN""PROGRAM_NAME"-%s.pid"
#define DHCP_CACHE_FILE "/etc/dhcpc/"PROGRAM_NAME"-%s.cache"
#define DHCP_HOSTINFO "/etc/dhcpc/"PROGRAM_NAME"-%s.info"
#define EXEC_ON_CHANGE "/etc/dhcpc/"PROGRAM_NAME".exe"
#define RESOLV_CONF "/etc/resolv.conf"
#define NIS_CONF "/etc/yp.conf"
#define NTP_CONF "/etc/ntp.conf"


同じ場所なんですけど...

#define PID_FILE_PATH "%s"PROGRAM_NAME"-%s.pid"
#define DHCP_CACHE_FILE "%s"PROGRAM_NAME"-%s.cache"
#define DHCP_HOSTINFO "%s"PROGRAM_NAME"-%s.info"
#define EXEC_ON_CHANGE "%s"PROGRAM_NAME".exe"

#ifdef EMBED
#define CONFIG_DIR "/etc/config/dhcpc"
#define RESOLV_CONF "/etc/config/resolv.conf"
#define NIS_CONF "/etc/config/yp.conf"
#define NTP_CONF "/etc/config/ntp.conf"

distribution の違いが現れてますね.これでは動かなくて当然です.
client.c も随分違っているようです.patch が中ってました.
何も考えずにとりあえず rpmbuild --rebuild しただけだったので,
その辺は全然無調整でした.

以上,ご報告まで.
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-08-01 22:16
引用:

kazさんの書き込み (2004-08-01 03:11) より:
#define PID_FILE_PATH "%s"PROGRAM_NAME"-%s.pid"
#define DHCP_CACHE_FILE "%s"PROGRAM_NAME"-%s.cache"
#define DHCP_HOSTINFO "%s"PROGRAM_NAME"-%s.info"
#define EXEC_ON_CHANGE "%s"PROGRAM_NAME".exe"

#ifdef EMBED
#define CONFIG_DIR "/etc/config/dhcpc"
#define RESOLV_CONF "/etc/config/resolv.conf"
#define NIS_CONF "/etc/config/yp.conf"
#define NTP_CONF "/etc/config/ntp.conf"



 わざわざお調べいただきありがとうございます。ヘッダを見る限りですが、Turbo Linuxのほうはプログラム内部でPathが展開されているようですね。

複数NICを考慮すると、「/etc/dhcpc/dhcpcd-<interface>.exe 」が自動実行される…というのが、ベストのような気がしますね。「-c」オプションは推奨されないようですし^^; パッチを作ろうかなぁ…と思ったんですが、あまり必要とされなさそうなので止めました^^;

お忙しい中、ご報告ありがとうございました。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-08-01 23:56
全くの脱線なんですが...

引用:

   argc[0]=PROGRAM_NAME;
   argc[1]=IfName;
   argc[2]=prm;
   argc[3]=ipaddrstr;
   if ( DebugFlag )
    argc[4]="-d";
   else
    argc[4]=NULL;
   argc[5]=NULL;
   if ( execve(EXEC_ON_CHANGE,argc,ProgramEnviron) && errno != ENOENT )



なんじゃこりゃあ!
って感じですね。
そりゃまあ argc と書いても間違いじゃないですが、execve には
argv だろー、とゆーことで。
こういうしょーもないところで世間の習慣に反したことをすると、
混乱を招くとか可読性を損なうとか、ロクなことがないと思うですが...
# これひとつだけならたいした問題でもないですが、こういうのを見ると
# 一事が万事この調子なんじゃないかと疑ってしまうもので。
未記入
会議室デビュー日: 2004/07/21
投稿数: 7
投稿日時: 2004-08-02 17:52
皆さん、こんにちは。
水無月遊々さんの方法で当初の目的は果たせました。
ありがとうございます。

 # その後の議論にはついていけてません

スキルアップ/キャリアアップ(JOB@IT)