• ベストアンサー

外部コマンドに変数を使うにはどうしたらよいのでしょうか

perlで書いたCGIでアクセスしてきたマシンのIPを取得 $user_ip = $ENV{'SERVER_ADDR}; 外部コマンドでiptableの設定を行うようにしたいのですが、以下のようにコマンドに変数($user_ip)を指定することができません。 system ("iptables -t nat -A PREROUTING -d $user_ip -i eth0 -j DNAT --to 192.168.0.10") どなたか解決策をお願いします。

  • bob33
  • お礼率50% (5/10)
  • Perl
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

Programming Perlによれば $user_ip=$ENV{'SERVER_ADDR}; のあとで、 強引に汚染を取り除いたことにするには if ($user_ip =~ /(.+)/){ $user_ip = $1; } とします。 本当に取り除くには if ($user_ip =~ /^([-\@\w.]+)/){ $user_ip = $1; }else{ 汚染されたデータの為、以降の処理停止 } とします。 実際にやったことはないので、自信なしです。

bob33
質問者

お礼

無事に実行できましたありがとうございました

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

$cmd = "iptables -t nat -A PREROUTING -d $user_ip -i eth0 -j DNAT --to 192.168.0.10"; system($cmd); として下さい。

bob33
質問者

お礼

すばやいレスいただきまして、ありがとうございます。今現在、実行環境がありませんので、2,3日中に改めてお礼を書かせていただきます。

bob33
質問者

補足

実行してみたのですが、「Insecure dependency in system while running setuid at /usr/local/apache2.0.52/cgi-bin/test.cgi」とエラーが出てしまいます。(エラーではsystem($cmd)が書かれた行番号が表示される) おそらく$cmd = "iptabels ~ "; で指定した$user_ipが汚染データと判断され、エラーが出ているのではないかと思います。 汚染データと判断されないために回避する方法はあるのでしょうか。よろしくお願いします。 ------------------------------------------------- 汚染検出用モードで動かし #!/usr/bin/perl -T 環境変数PATH設定はしています $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin'; $ENV{'IFS'} = '' if $ENV{'IFS'} ne ''; $path = $ENV{'PATH'}; delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; $user_ip = $ENV{'HTTP_HOST'}; 環境変数を$user_ipに入れる前または後でエラー回避の ためにやることはあるのでしょうか

関連するQ&A

  • iptablesを使ってルーターを作りたい

    今、iptablesを使ってルーターを作りたいと思っています。 グローバルIPは複数利用できます。 ルーターに使うLinux(CentOS4.3) eth0:192.168.100.1 ⇒ LAN内 eth1:210.*.*.1 ⇒ インターネット という感じになっています 上記ルーターには、外部からグローバルIPでアクセスできるようになっています。 現在、 iptables -t nat -A POSTROUTING -s 192.168.100.0/255.255.255.0 -o eth1 -j MASQUERADE とやり、LAN内からインターネットにはつなげるようになっています。 グローバルIP 210.*.*.2 で外部からアクセスがあった時に プライベートIP 192.168.100.2 にすべて中継する設定をしたいとおもっています。 iptables -t nat -A PREROUTING -d 210.*.*.2 -p tcp --dport 80 -j DNAT --to 192.168.100.2 とやってみたのですが、外部からはアクセスすることはできませんでした。 どなたか、教えてもらえると助かります。

  • iptablesを使用してのDNSゾーン転送の設定。

    今後Linuxをルーターとしてサーバー公開を目指しています。 グローバルIP=10.10.10.10(ルーターインターフェース=eth0) プライベートIP=192.168.0.1(ルーターインターフェースeth1) PrimaryDNS=10.10.10.10:53をプライベートIPに変換=192.168.0.2:53 セカンダリDNS=20.20.20.20 Linuxルータはiptablesのみ動作。 primaryDNSサーバーはwindows2000を使用しています。 iptablesにより、Preroutingを使用して10.10.10.10:53→192.168.0.2:53の変換。 POSTROUTINGにより192.168.0.2→10.10.10.10:53へ変換と設定しています。 # iptables -t nat -A PREROUTING -p tcp -d 10.10.10.10 -dport53 -j DNAT -to-destinalion 192.168.1.20:53 # iptables -t nat -A POSTROUTING -p tcp -s 10.10.10.10 -sport53 -j SNAT -to-source 192.168.1.20:53 # iptables -t nat -A PREROUTING -p udp -d 10.10.10.10 -dport53 -j DNAT -to-destinalion 192.168.1.20:53 # iptables -t nat -A POSTROUTING -p udp -s 10.10.10.10 -sport53 -j SNAT -to-source 192.168.1.20:53 そこで質問なのですが、この際Win2000でゾーン転送のセカンダリDNSの宛先アドレスはどうしたらよろしいのでしょうか? その際、iptablesの記述も教えてください。 一応、 # iptables -A FORWARD -p tcp -dport53 -j ACCEPT # iptables -A FORWARD -p udp -dport53 -j ACCEPT 53ポートのtcp,udpを許可しています。

  • iptablesでアドレス変換したい

    初心者です。 iptablesの勉強中ですが、アドレスの変換がうまくできず行き詰っています。 下図のように Mannaka をはさんで隔離された実験環境をつくりました。ここでやりたいことは、とにかくどんなアクセスやプロセスでもいいので、Mannaka をはさんで 192.168.10.10 <--> 192.168.20.100 192.168.10.20 <--> 192.168.20.200 というアドレス変換を実現したいということです。実験なのでセキュリティは度外視し、とにかくつながることを優先しています。Server1とServer2ではWebサーバーが動いていて、Apacheのインストールページが表示されます。 (192.168.20.100) Server1――          |          |―(eth1)Mannaka(eth0)―――PCs(192.168.10.X)          | (eth0=192.168.10.10)Mannaka IP Server2――  (eth1=192.168.20.10)Mannaka IP (192.168.20.200)          ---            (eth0:1=192.168.10.100)Server1 IP            (eth0:2=192.168.10.200)Server2 IP iptablesの設定は下記のようにしました。 ---------- ---------- #!/bin/sh service iptables restart echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -A FORWARD -d 192.168.10.10 -s 0.0.0.0 -j ACCEPT iptables -A FORWARD -d 0.0.0.0 -s 192.168.10.10 -j ACCEPT iptables -A FORWARD -d 192.168.10.20 -s 0.0.0.0 -j ACCEPT iptables -A FORWARD -d 0.0.0.0 -s 192.168.10.20 -j ACCEPT iptables -t nat -A PREROUTING -d 192.168.10.10 -j DNAT --to 192.168.20.100 iptables -t nat -A PREROUTING -d 192.168.10.20 -j DNAT --to 192.168.20.200 iptables -t nat -A POSTROUTING -s 192.168.20.100 -j SNAT --to 192.168.10.10 iptables -t nat -A POSTROUTING -s 192.168.20.200 -j SNAT --to 192.168.10.20 ---------- ---------- 意図としては、 192.168.10.10へのアクセスがServer1(実IP192.168.20.100)、 192.168.10.20へのアクセスがServer2(実IP192.168.20.200) へと割り振られ、同じく Server1(実IP192.168.20.100)からのアクセスが192.168.10.10、 Server2(実IP192.168.20.200)からのアクセスが192.168.10.20 へと割り振られる、ということなのですが、スクリプトを実行してもeth0側のPCからeth1側のサーバーにアクセスできません。eth1側からeth0側へのアクセスもできません。192.168.20.0内部でのPing送受信やWebサイト閲覧は自由にできますが、eth0側のPCから192.168.10.10と192.168.10.20にPingを送っても、Mannakaサーバーが応答してしまい意図した動きにはなっていません。Server1とServer2のWebサイトも閲覧できません。 環境は、Mannaka, Server1, Server2 がCentOS6、その他のPCはWindows7です。 これがなぜ意図したとおりに動かないのか、そしてどうすれば動くようになるのかをご教示いただけないでしょうか。 よろしくお願いします。

  • iptables ポートフォワーディングについて

    ポートフォワーディングの設定を行いたくて試しにやっているのですが、 うまくいかないので教えていただけないでしょうか。 WinXPクライアント(192.168.1.22) | Linuxルーター(eth0=192.168.1.40, eth1=192.168.2.41)起動しているサーバーはssh,telnet,ftp,http,postgresです。 | LinuxWebサーバー(eth0=192.168.2.81 port=80)起動しているサーバーはssh,telnet,ftp,http,postgres,cvspserverです。 WinXPクライアントからLinuxWebサーバーにアクセスしたいのですが、以下のように設定しても WinXPクライアントのブラウザには「サーバーが見つかりません」と表示されてしまいます。 他に追記すべき設定、お気づき等ございましたら教えてください。よろしくお願いします。 Linuxルーターのiptables設定内容(service iptables stopを行った後、以下を設定しております) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.81:80 iptables -A FORWARD -d 192.168.2.81 -p tcp --dport 80 -j ACCEPT ------------------------------------------------------------- 上記設定後iptables -Lとしてみたら以下のように表示されました。 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere 192.168.2.81 tcp dpt:http Chain OUTPUT (policy ACCEPT) target prot opt source destination さらにservice iptables saveをして cat /etc/sysconfig/iptablesとしてみたところ以下のように表示されました。 # Generated by iptables-save v1.3.5 on Sat Jan 30 11:46:10 2010 *nat :PREROUTING ACCEPT [2:280] :POSTROUTING ACCEPT [2:115] :OUTPUT ACCEPT [2:115] -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.81:80 COMMIT # Completed on Sat Jan 30 11:46:10 2010 # Generated by iptables-save v1.3.5 on Sat Jan 30 11:46:10 2010 *filter :INPUT ACCEPT [148:9894] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [169:16447] -A FORWARD -d 192.168.2.81 -p tcp -m tcp --dport 80 -j ACCEPT COMMIT # Completed on Sat Jan 30 11:46:10 2010 ------------------------------------------------------------- ちなみに以下のように設定してWinXPクライアントからsshで192.168.1.40の10000ポートに接続すると接続できました。 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10000 -j DNAT --to 192.168.2.41:22 ------------------------------------------------------------- 以下のように設定してWinXPクライアントから「telnet 192.168.1.40 10000」コマンドを発行してみるとしていない 時と比べて「接続中: 192.168.1.40...」となっている時間が長いので何かしら影響しているのかなと思います。 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10000 -j DNAT --to 192.168.2.81:23

  • Fedora6でポートフォワードできなくなった

    Fedora4でできていたポートフォワードの設定がFedora6で できなくなってしまいました。 以下のような環境です。 PC1 Eth0:グローバルIP Eth1:192.168.10.254 PC2 Eth0:192.168.10.253 PC2でApacheを起動して、PC1の80番ポートをPC2にフォワード したいのです。 そこで以下のようなIptablesを設定しました。 iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.10.253 しかし、PC1のグローバルIPアドレスにブラウザからアクセスしても 一向に表示されません。 PC2でtcpdumpを使って80番ポートを監視しながら確認したのですが、 パケットは観測されませんでした。 [pc2]$ sudo tcpdump port 80 fc4のときはこのようなトラブルに遭遇しなかったのですが、 なにかやり方が変わったのでしょうか? お助けください。

  • iptablesでポートフォアワードがうまくいかない。

    お世話になります。下記の通りiptablesでフィルターとNATの定義をしました。 しかし、内部からネットへの接続は可能ですが、外部からWebサーバーにあるHPが見れない指摘を受け、その原因を調べています。 不備な点、ご指導賜りたく存じます。 eth0:1.2.3.4 ---------- | Linux | ----------- eth1:192.168.0.101   | websever:192.168.0.100 cla:192.168.0.102~ modprobe iptable_nat modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables -F iptables -t nat -F iptables -t mangle -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j ACCEPT iptables -A OUTPUT -o eth1 -d 192.168.0.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT iptables -A OUTPUT -p tcp --dport 80 -s 1.2.3.4 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -d 1.2.3.4 -j ACCEPT iptables -A OUTPUT -p tcp --dport 53 -s 1.2.3.4 -j ACCEPT iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -i eth0 --dport 80 -j DNAT --to 192.168.0.100:80 iptables -A FORWARD -i eth1 -o eth0 -s 192.168.0.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4 iptables -t nat -A POSTROUTING -s 192.168.0.102/32 -o eth0 -j MASQUERADE

  • iptablesでFTPのパッシブモード通信許可

    こんにちは。 iptablesの学習でテスト用のFWサーバーと2台のWebサーバーをつくりました。 いまはForwardでアクセスごとに転送先を振り分ける実験をしています。 FTPのForward設定でわからないことがあるので質問させてください。 やりたいこと: ip_conntrack_ftpを組み込めばiptablesにいちいちパッシブ通信の使用ポートすべてを指定しなくても、モジュールが自動で制御してくれるという情報をネットで見かけ、それをやってみようと考えています。ところがどうがんばってもFTPのパッシブモードがつながりません。FTP以外のサービス、たとえばDNS, NTP, HTTP等のForwardは問題なく行えています。 環境: FWサーバー → CentOS6 iptablesで外部からのアクセスをブロックしたり、振り分けたり。 WEBサーバー → CentOS6 apacheとvsftpdでWebサーバーを構成。iptables無効です。 ルーター → 業務用ですがファイアウォール等はすべて無効になっています。 111.222.333.0はグローバルIPアドレスです。 192.168.1.0はローカルIPアドレスです。                              -eth0(WEB_SERVER1)                              | 192.168.1.2(→111.222.333.2) (ONU)-(ROUTER)-eth0(FW_SERVER)eth1----|        111.222.333.1(eth0)          |        111.222.333.2(eth0:1)         -eth0(WEB_SERVER2)        111.222.333.3(eth0:2)          192.168.1.3(→111.222.333.3)        192.168.1.1(eth1) FWサーバーのiptable設定: net.ipv4.ip_forward = 1 ip_conntrack_ftpモジュール有効 ip_nat_ftpモジュール有効 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP . .(一部省略) . # HTTP iptables -A FORWARD -p tcp -i eth0 -o eth1 -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp -i eth1 -o eth0 -m multiport --sport 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT # FTP(ここをどうしたらいいのかわからない) iptables -A FORWARD -p tcp --dport 21 -j ACCEPT iptables -A FORWARD -p tcp --sport 21 -j ACCEPT # Webserver1 iptables -t nat -A PREROUTING -i eth0 -d 111.222.333.2 -j DNAT --to-destination 192.168.1.2 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.2 -j SNAT --to-source 111.222.333.2 # Webserver2 iptables -t nat -A PREROUTING -i eth0 -d 111.222.333.3 -j DNAT --to-destination 192.168.1.3 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.3 -j SNAT --to-source 111.222.333.3 上記設定でFTPのForward部分をmultiportにしてポート20を入れたり除いたり、NEWやESTABLISHEDやRELATEDを入れたり消したり、いろいろ試行錯誤していますがFilezillaで下のようなエラーがでます。 PASV レスポンス: 227 Entering Passive Mode (111,222,333,2,92,226). コマンド: LIST エラー: 接続タイムアウト エラー: ディレクトリ一覧表示の取り出しに失敗しました 説明が長くて恐縮ですがよろしくお願いします。 <(_ _)>

  • CGIの時間の環境変数

    ちょっとタイトルがあっているのか、イマイチ心配なのですが(汗) フォームのCGIを作っています。 登録情報がメールで届くようにしています。 ホスト名とかIPアドレス、ユーザーエージェントは下記でできました。 $host = gethostbyaddr(pack("C4", split(/\./, $ENV{'REMOTE_ADDR'})), 2); $addr = $ENV{'REMOTE_ADDR'}; $HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}; フォームに登録してくれた曜日とか時間を取るやり方がわかりません。 どなたかお知恵をお貸しください m(__)m

  • ポートフォワードについて

    よろしくお願いいたします。 Linux上で2枚のLANカードでルーターを構築中です。 環境は、 eth0:インターネットへ(外へ) eth1:ローカルネット(内へ) 接続しています。 設定したiptables(ポートフォワードの部分)は、以下のとおりです。 iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.2:80 iptables -A FORWARD -i eth0 -p tcp --dport http -j ACCEPT iptables -A FORWARD -o eth0 -p tcp --sport http -j ACCEPT 実際外部から内部のwebサーバーにつながるのですが、 ルータ上から、ルータに割り当てられたグローバルIPアドレスで、 内部webサーバのホームページを見ようとすると見れません。 何か他に設定しないといけないのでしょうか?

  • iptableコマンドを複数記載したスクリプトを実行したいです。

    Linuxのコマンドについてお聞きしたいです。 iptableコマンドを複数記載したスクリプトを作成し、そのスクリプトを実行することによってパケットフィルタリングの設定をしようと思っています。 Windowsで下記のようなファイルを作成しました。 #!/bin/sh iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE iptables -P INPUT DROP iptables -P FORWARD DROP iptables -A FORWARD -i eth1 -s 192.168.0.0/24 -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i eth0 -d 210.98.76.54 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -i eth1 -d 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i eth0 -d 202.228.202.2 -p udp --sport 53 --dport 1024:65535 -j ACCEPT iptables -A INPUT -j LOG --log-prefix "### INPUT ###" iptables -A FORWARD -j LOG --log-prefix "### FORWARD ###" これをLinuxの/rootに作成したbinフォルダにフロッピーでコピーしました。 ファイル名をfilterにしたので、[root@linux root]# filter とし、Enterとし、 スクリプトを実行して設定を反映させようとしました。 しかし、: bad interpreter: そのようなファイルやディレクトリはありません と出てしまいます。 何が足りないのでしょうか?

専門家に質問してみよう