プログラム内でiptablesを実行時にすぐに適用されない

前提と問題点

複数の仮想マシンで仮想ネットワークを作成し、webサーバマシンにて以下のプログラムを実行し、クライアントからwebサーバマシンにhttperfでアクセスする。ルーティングテーブルはメイン=rt1,rt2の二つあり、クライアントからwebサーバまでの経路は一本道だが、webサーバからクライアントまでの経路はrt1,rt2の二つの経路がある。
本来はrt1を参照するが、プログラムを実行している間に送信されるパケットはrt2を参照したい。
しかし、実際にプログラムを動かすと一つ目のコネクション
のパケットはrt1を参照して、二つ目以降のコネクションのパケットはrt2を参照する。

実現したいこと

該当のソースコード

perl

#!/usr/bin/perl -sw $count = 0;$debug = 1; #ループ回数が指定されていないときは10回とする。unless ($n) { $n = 10;} # コマンドの出力をパイプでファイルハンドルへ渡す$pid = open (PKT, "tcpdump -l -i eth3 -tt -nn '((host 192.168.X.XX) and (tcp) and (src port 80) and (tcp[tcpflags] & (tcp-syn|tcp-fin) != 0))'|"); # ファイルハンドルからtcpdumpの結果を読み込むwhile (<PKT>) { # 時刻(秒)を$1,送信先アドレスを $2,送信先ポートを$3,フラグ[S]or[S.]を$4,シーケンス番号を$5とする if (/^(\d+\.\d+).*> (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).(\d+).*(Flags \[S\.?\]).*seq (\d+)/) { print "---------flag[S]------------\n"; if($debug == 1){ print "\$_ = $_\n"; print "match[S] = $&\n"; } #マークは2とする。ip rule によってマーク2はルーティングテーブルrt2を参照する。 $mark = 2; print "\$count = $count and \$mark = $mark\n"; # iptablesでマークをつける。rt2にルーティングされるようになる(はず) $cmd = "iptables -A PREROUTING -i eth3 -p tcp -t mangle -j MARK --set-mark $mark "; if ($debug == 1) { print "\$cmd = $cmd\n"; } system $cmd; $cmd_3 = "iptables -tmangle -L"; system $cmd_3; # $cmd_restart = "service iptables restart"; # system $cmd_restart; #フラグが[F]or[F.]の場合 } elsif (/^(\d+\.\d+).*> (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).(\d+).*(Flags \[F\.?\]).*seq (\d+)/) { print "---------------flag[F]---------------\n"; if($debug == 1) { print "\$_ = $_\n"; print "match[F] = $&\n"; } $count++; #n回読み込んだら終了させる。 if ($count == $n) { last; } }} #マーク付けした内容を全て削除する$cmd_2 = "iptables -F PREROUTING -t mangle";system $cmd_2; #クローズする前にプロセスを終了させる。kill(15,$pid);#使ったらちゃんと閉じるclose (PKT);

試したこと

  • 手動でiptables を設定してマーク付け=ルーティングの変更ができるか

-> できた。予め設定しておく分にはできて、プログラム内のwhileループ内で行おうとするとすぐに適用されなかった。

  • whileより前にiptablesを行うsystemコマンドをかく

-> この方法はできるし、解決にはなりますが、今後の目的のためipttablesは「SYNパケットを読み込んでから、対応したFINパケットを読み込むまでの間」に実行する必要があります。

お願い

説明で不十分な点や不明な点が多いとは思いますが、聞いていただければ捕捉しますのでご協力お願いします。

コメントを投稿

0 コメント