- - PR -
TFTP通信のソースポートの範囲を指定したい
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-02-13 15:33
keiと申します。
TFTPを使ってファイルの取得を行なう必要があり、色々と試して いるのですが、TFTPを行なうクライアント側のポート番号を指定 した範囲(1031〜2000)に設定し、ファイル取得を行なうことは 可能でしょうか?理由は、基幹ネットワーク側に制約があるため です。 何も指定していない現状では、「32829」が自動的に割り振られて いるようです。(毎回この近辺の数値になっています。) 現状のTFTPコマンドのログ ----------------------------------------------------------- XX.XX.22.13:クライアント側 XX.XX.22.11:TFTPサーバ側 19:47:08.921198 IP XX.XX.22.13.32829 > XX.XX.22.11.tftp: 37 RRQ "hoge/hogehoge.dat" octet 19:47:08.925181 IP XX.XX.22.11.43974 > XX.XX.22.13.32829: UDP, length 516 19:47:08.925243 IP XX.XX.22.13.32829 > XX.XX.22.11.43974: UDP, length 4 19:47:08.925795 IP XX.XX.22.11.43974 > XX.XX.22.13.32829: UDP, length 516 19:47:08.925824 IP XX.XX.22.13.32829 > XX.XX.22.11.43974: UDP, length 4 19:47:08.926140 IP XX.XX.22.11.43974 > XX.XX.22.13.32829: UDP, length 516 19:47:08.926171 IP XX.XX.22.13.32829 > XX.XX.22.11.43974: UDP, length 4 ・ ・ ・ ----------------------------------------------------------- 上記のクライアント側のポート「32829」を「1031〜2000」の範囲に指定して TFTP通信させたいです。 どなたかご教授願えますでしょうか。 | ||||||||||||
|
投稿日時: 2008-02-13 22:14
おそらく普通にANYポートを使っているだけで、
かつ、接続元ポートを固定化するオプションはtftpには無いようなので、 1)ソースを改変する 2)net.ipv4.ip_local_port_range を変更する というような方法になると思います。 2)は他にも多々影響が出るとは思いますが… | ||||||||||||
|
投稿日時: 2008-02-13 22:49
こんばんは。
他には、 1') tftpクライアントを自作する 3) UDP通信を中継し、あたかも限定された範囲の接続元ポートを使用したtftp通信を行うかに振舞う、UDPプロキシを作成する という手もありそうです。 NAT ( Linux の netfilter/iptables ) が使えれば良いのですが、残念ながら無理そうです。 初っ端の通信と、以降の通信で使われるサーバ側ポート番号が異なることで、カーネルが接続状況の追跡を行えないためです。 ※ ftp であれば、アプリケーションレベルで追跡するヘルパーモジュールがありますが… 追記: 実は、tftp_conntrack という tftp通信追跡用のヘルパーモジュールもあるようです…。Googleで若干検索に引っかかります。 ただ、情報が少ないため、なんとも言えませんが。 [ メッセージ編集済み 編集者: angel 編集日時 2008-02-13 22:53 ] | ||||||||||||
|
投稿日時: 2008-02-14 02:27
少し訂正。
手元のlinuxマシンを見たところ、tftpのヘルパーモジュールがちゃんと入っていました。 ( FedoraCore1 kernel2.4 ) ip_conntrack_tftp.o と ip_nat_tftp.o とがあります。 なので、tftpクライアント実行側でこれを modprobe して、SNATでソースポートを変換してあげればなんとかなりそうに思います。 | ||||||||||||
|
投稿日時: 2008-02-15 09:52
angel様、F/A様
ご回答ありがとうございました。 頂きましたアドバイスを元に、色々と試行錯誤してみたいと思います。 今後とも宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2008-02-15 10:38
angel様
「SNATでソースポートを変換する」部分がよくわからないため、具体的な手法を教えて 頂けると嬉しいです。 OSは、Redhat Enterprize ES 4を使っています。 ip_conntrack_tftpをfind検索したら、以下の結果が出ています。 これらの中身については、手を加える必要はないという理解で宜しいでしょうか?
あと、modprobe ip_conntrack_tftp実行後の状態を貼りました。 この後、どうすればポート番号をコントロール出来るのでしょうか。
---------------------------------------------------------------------------- よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-02-16 14:10
こんにちは。
前に
使い方は manページ等で調べてみてください。 今回の場合、クライアント機上で、 ・tftp通信のソースポートを1031〜2000の範囲に変換する ( SourceNAT:送信元変換 ) ということになるなので、対象は natテーブルの POSTROUTING チェインになるでしょう。 設定コマンド例としては、 # iptables \ -t nat \ … natテーブルが対象 -A POSTROUTING \ … POSTROUTINGチェインにルール追加 -p udp \ … UDP通信が対象 --dport 69 \ … tftp(69)への通信が対象 -j SNAT \ … SNATを行う --to-source 自IPアドレス:1031-2000 … 変換後の送信元情報の指定 といったところでしょうか。 ※で、ヘルパーモジュールをロードしている状態なら、tftp通信でポート番号が変わる所まで追跡してNATしてくれる、と考えているわけです。 | ||||||||||||
|
投稿日時: 2008-02-20 14:41
angel様
iptables の使い方をご教授いただき、ありがとうございます。 頂きました情報を元に設定したのですが、TFTP通信を成功させることが出来ませんでした。 状況は以下の通りです。 UDPポートフィルターのかかっていないサーバへのアクセスログ(TFTP通信成功する方) 2584バイトのデータ(test.dat)取得が成功する。 サーバ:XXX.XXX.XXX.173 クライアント:hogehoge.jp
UDPポートフィルターのかかっているサーバへのアクセスログ(TFTP通信失敗する方) 最初の512バイトのみ取得成功する。(クライアントからのACKがサーバに届かないため、サーバからは何度も先頭の512バイト送信が繰り返されて、最後はタイムアウト終了する。) サーバ:XXX.XXX.XXX.219 クライアント:hogehoge.jp
modprobe実行 >/sbin/modprobe ip_conntrack_tftp iptables設定 >/sbin/iptables -t nat -A POSTROUTING -p udp --dport 69 -j SNAT --to-source XXX.XXX.XXX.XXX:1031-2000 再度、サーバ:XXX.XXX.XXX.219へアクセスした時のログ
新たに、icmp 552というパケットがクライアントから送信され、それがサーバに届いていないというエラー内容に変わっています。 UDPポートフィルターのかかっているサーバ側の設定情報(抜粋) access-list 141 permit udp any eq domain any access-list 141 permit udp any eq ntp any access-list 141 permit icmp any any access-list 141 permit udp any eq snmp any access-list 141 permit udp any eq snmptrap any access-list 141 permit udp any eq tftp any access-list 141 permit udp any any eq tftp access-list 141 permit udp any range 1031 2000 any 以上のような状態です。 なにか設定等が誤っていますでしょうか。 |
1