- ベストアンサー
リモートからiptables設定について
- リモートからiptables設定についての方法を教えてください。
- リモートでサーバーに触れずにiptablesの設定をする方法を教えてください。
- リモートから/sbin/iptables -P INPUT DROPを実行したら接続が切れてしまいます。どうすればリモートからiptablesを設定できますか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
あなたのアドレスが 常に 192.0.0.1 で固定されている前提で う~~んと、何度も書いたり消したりで おかしなことに成っているとまずいので ご苦労ですが 今のiptables.shは 名前を変えて保存し もう一度 http://fedorasrv.com/iptables.shtml から コピーしてください ##確認 #!/bin/bash <=1行目が これで /etc/rc.d/init.d/iptables start <=231行目がこれ <=232行目(最終行)が空行になっていることを確認してください そしたら 以下で書き換え部分も含めて1~38行目までを通しで書きます ------この下の行が1行目----- #!/bin/bash export PATH=$PATH:/sbin/ # ↑この記述により ifconfigやiptablesの前にいちいち/sbin/ と入れないで済みます #---------------------------------------# # 設定開始 # #---------------------------------------# # インタフェース名定義 LAN=eth0 #---------------------------------------# # 設定終了 # #---------------------------------------# # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK # ファイアウォール停止(すべてのルールをクリア) /etc/rc.d/init.d/iptables stop # デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 iptables -P INPUT DROP # 受信はすべて破棄 iptables -P OUTPUT ACCEPT # 送信はすべて許可 iptables -P FORWARD DROP # 通過はすべて破棄 # 自ホストからのアクセスをすべて許可 iptables -A INPUT -i lo -j ACCEPT # 内部からのアクセスをすべて許可 iptables -A INPUT -s $LOCALNET -j ACCEPT iptables -A INPUT -s 192.0.0.1 -j ACCEPT # ↑この行追加 # 内部から行ったアクセスに対する外部からの返答アクセスを許可<=これが38行目になるはず 以上です 38行目から下はいじる必要有りません exitや 入力待ちのは TEST用ですので 本番には必要有りません では ガンバ!!
その他の回答 (8)
- umasikajiro
- ベストアンサー率67% (545/803)
要するに いろいろ書くと混乱するわけですね 了解です。 ではiptables.shの # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` ↓ LOCALNET_MASK=`/sbin/ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` ####こちらにも /sbin/ を入れてください それで 実行してからコマンドラインで # iptables -nL|more -10 <=と打った結果が↓ Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 192.168.0.0/23 0.0.0.0/0 <=この行があなたの環境に合わせて出てくるか確認してください ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED LOG all -f 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `[IPTABLES FR AGMENT] : ' DROP all -f 0.0.0.0/0 0.0.0.0/0 DROP tcp -- !192.168.0.0/23 0.0.0.0/0 multiport dports 135,137,138,139,445 DROP udp -- !192.168.0.0/23 0.0.0.0/0 multiport dports 135,137,138,139,445
お礼
いつもご丁寧にありがとうございます。 #LOCALNET_MASK=`/sbin/ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` でエラーは解消されました。 # sh -x iptables.sh での結果も表示されました。 ただ、 LOCALNET=IPアドレス/255.255.255.224 に #last -i ユーザ名 で出たIPは含まれておりませんでした。 なので、下記のように変更でしょうか? last -i ユーザ名が192.0.0.1だった場合 前略 # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK 192.0.0.1 #追加箇所 exit # ファイアウォール停止(すべてのルールをクリア) 以下略 これで最後だと思います。 P.S ファイヤーウォール構築した場合に、 HP制作ソフト使ってデータDLした場合に、 index.htmlのhtmlファイルが index.htmlと言うディレクトリになってるのですが、 関係はないでしょうか? 違う質問もすいません。。
- umasikajiro
- ベストアンサー率67% (545/803)
>iptables.sh: line 16: ifconfig: command not found 1. まず #!/bin/bash の次の行に export PATH=$PATH:/sbin/ と追記してください 2. #5で書いた exit は未だ外さないでください それでまた sh -x iptables.sh します 今度はアドレス/マスクが出てくるはずです その値を 取り合えずメモして置いてください 3. last との比較 ># last admin で打つと、IPではなくホストが表示される # last -i ユーザー名 <=でどうですか?(お使いのサーバーでは last -d がリンクされているらしい) それで駄目なら 例えば 出てきたホスト名が TEST-PC だったら # ping -n TEST-PC <=と打つとIPアドレスが出ます(そのクライアントPCでエコー遮断していなければですが) なんとかIPアドレスが取れたら その値が 2.で取得した アドレス/マスク の範囲内に収まるか確認します ###取り合えず以上までを確認ください ## オマケ: # いずれにしろ sh スクリプトの書き方や Linuxコマンドを もう少し調べた方が良いかもしれませんね # 参考サイトを列記しておきます pathの設定: http://cisco250.hp.infoseek.co.jp/Linux/path/ LINUXコマンド系の参考サイト: 「Linuxコマンド逆引き大全」 http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230579/ 「Linuxコマンド百科辞典」 http://www.21linux.com/ 「Linuxコマンドcom」 http://xn--linux-op4dtfrgoh.com/ 「@IT Linux Square」 http://www.atmarkit.co.jp/flinux/
- umasikajiro
- ベストアンサー率67% (545/803)
しつこくてすみません。 なんか不安になったので、、 >+ LOCALNET=192.168.1.0/255.255.255.0 <=この行が正しい事を確認してください 判ると思いますが、これはサーバーのIPアドレスが含まれるかではなくて あなたがログインするときのIPアドレスが範囲に含まれるかです。 調べるには 例えば lastコマンドを使います。 例えばあなたのログイン時のユーザー名が tarou だとすると コマンドラインで $ last tarou <=こう打つと tarou pts/1 192.168.1.40 Thu Jun 12 13:15 still logged in tarou pts/0 192.168.0.100 Thu Jun 10 13:06 still logged in こんなのが出ますが 6/12のログインはOKですけども 6/10の方は 192.168.1.0/255.255.255.0 の範囲に含まれませんね そうなると 少なくとも初期状態でiptables.shに記述されているアドレス/マスクの自動取得では カバーできませんし LANのアドレスですから ACCEPT_COUNTRY でも駄目だと思います そういうときは LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK 行に直接数値を入れるか または #4に書いた 参考URL:[iptablesテンプレート] などを見て 追記する必要があると思います
お礼
umasikajiro様 本当に丁寧にありがとうございます。 時間、知識不足なので、 少しずつやってます。。。 幾つか問題があったので記載します。 # last admin で打つと、IPではなくホストが表示されるような形でした・・ # TEST入力待ち Yまたはy入力で次の処理 while [ 1 ]; do /bin/echo -n "Y/N: ";read line case $line in [yY]) break ;; esac done # TEST入力待ちは以上迄 LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK exit #追加t iptables -A INPUT -p tcp -s 210.1.144.0/20 --dport 22 -j ACCEPT の3つ追加して #./iptables.sh すると、 実行出来ないです。 Yで次の処理のと、exit抜くと実行出来ますが、 エラーが出ます。 ./iptables.sh: line 152: iptables: command not found ./iptables.sh: line 156: iptables: command not found ./iptables.sh: line 160: iptables: command not found ./iptables.sh: line 164: iptables: command not found ./iptables.sh: line 169: iptables: command not found ./iptables.sh: line 173: iptables: command not found ./iptables.sh: line 177: iptables: command not found ./iptables.sh: line 181: iptables: command not found ./iptables.sh: line 185: iptables: command not found ./iptables.sh: line 189: iptables: command not found ./iptables.sh: line 193: iptables: command not found ./iptables.sh: line 197: iptables: command not found ./iptables.sh: line 222: iptables: command not found ./iptables.sh: line 223: iptables: command not found ./iptables.sh: line 224: iptables: command not found ./iptables.sh: line 225: iptables: command not found みたいなのがかなり出ます。 iptables -A INPUT -p tcp -s 210.1.144.0/20 --dport 22 -j ACCEPT については、 #iptables -A INPUT -p tcp -s 210.1.144.0/20 --dport 22 -j ACCEPT # iptables -nL>/hoge/tmp/iptest.log ACCEPT tcp -- 210.1.144.0/20 0.0.0.0/0 tcp dpt:22 ともなって、でも接続は維持されてます。 iptables難しいですね。。 初心者ですいません。。。
補足
書く所がややこしくて、 masikajiro様が見る前に3つ位レス残してます。。。 今、iptables.shの iptablesのところを /sbin/iptables に変更して起動したら、 エラーがかなり出ましたが、 最後に全部OKの文字が。。。 #/sbin/iptalbes -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED LOG all -f anywhere anywhere LOG level warning prefix `[IPTABLES FRAGMENT] : ' DROP all -f anywhere anywhere LOG_PINGDEATH icmp -- anywhere anywhere icmp echo-request DROP all -- anywhere 255.255.255.255 DROP all -- anywhere ALL-SYSTEMS.MCAST.NET REJECT tcp -- anywhere anywhere tcp dpt:auth reject-with tcp-reset DROP_COUNTRY all -- anywhere anywhere ACCEPT tcp -- 210.1.144.0/20 anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:domain LOG all -- anywhere anywhere limit: avg 1/sec burst 5 LOG level warning prefix `[IPTABLES INPUT] : ' ~~中略~~ LOG all -- 222.156.0.0/15 anywhere limit: avg 1/sec burst 5 LOG level warning prefix `[IPTABLES DENY_COUNTRY] : ' DROP all -- 222.156.0.0/15 anywhere LOG all -- 222.250.0.0/16 anywhere limit: avg 1/sec burst 5 LOG level warning prefix `[IPTABLES DENY_COUNTRY] : ' DROP all -- 222.250.0.0/16 anywhere LOG all -- 222.251.0.0/17 anywhere limit: avg 1/sec burst 5 LOG level warning prefix `[IPTABLES DENY_COUNTRY] : ' DROP all -- 222.251.0.0/17 anywhere Chain LOG_PINGDEATH (1 references) target prot opt source destination ACCEPT all -- anywhere anywhere limit: avg 1/sec burst 4 LOG all -- anywhere anywhere LOG level warning prefix `[IPTABLES PINGDEATH] : ' DROP all -- anywhere anywhere と出ます。
- umasikajiro
- ベストアンサー率67% (545/803)
またまた わかる範囲で書きます >この時点でSSHから外れてしまって、おかしくならないでしょうか? 1.まず 念のために /etc/sysconfig/iptables を適当なところにコピーしておきます 2.iptables.sh のアドレス取得だけを行うように追記します 前略 LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK exit <=iptables.shの、ここにexit を追加してください # ファイアウォール停止(すべてのルールをクリア) 以下略 3.コマンドラインで # sh -x iptables.sh 結果例: + LAN=eth0 ++ ifconfig eth0 ++ sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d + LOCALNET_MASK=255.255.255.0 ++ netstat -rn ++ grep eth0 ++ cut -f1 '-d ' ++ grep 255.255.255.0 + LOCALNET_ADDR=192.168.1.0 + LOCALNET=192.168.1.0/255.255.255.0 <=この行が正しい事を確認してください + exit
お礼
# sh -x iptables.sh + LAN=eth0 ++ ifconfig eth0 iptables.sh: line 16: ifconfig: command not found ++ sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d + LOCALNET_MASK= ++ netstat -rn ++ grep eth0 ++ grep Usage: grep [OPTION]... PATTERN [FILE]... ++ cut -f1 '-d ' Try `grep --help' for more information. + LOCALNET_ADDR= + LOCALNET=/ + exit でした。 iptablesは /sbin/iptables のパスにありますが。。。 iptables.sh は [root@localhost ~]# vi iptables.sh と~に作ってますが、 環境が問題でしょうか? グローバルIPが100.100.100.100 だったとした場合は、 ※iptables -A INPUT -p tcp -s 210.1.144.0/20 --dport 22 -j ACCEPT の所は iptables -A INPUT -p tcp -s 100.100.100.0/100 --dport 22 -j ACCEPT になります? 宜しくお願い致します。
- umasikajiro
- ベストアンサー率67% (545/803)
#3を書いて直後に見直したら、、 >サーバーが違う場所にあり、 これって LAN内じゃないってことですか? ならば iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY 行で 日本国内からの port22接続は許可されていると思うのですが 念のためクライアントマシンの グローバルアドレスを調べて iptables -A INPUT -p tcp -s 210.1.144.0/20 --dport 22 -j ACCEPT とかで出来ませんかねえ? これで接続が維持できたら 確認します。量が多すぎて見づらいのでログに落とします # iptables -nL>/hoge/tmp/iptest.log ACCEPT tcp -- 210.1.144.0/20 0.0.0.0/0 tcp dpt:22 と成っている行が有ればOKだと思います。 [iptablesテンプレート] http://www.atmarkit.co.jp/flinux/rensai/iptables01/iptables01b.html 「日本のIPアドレス」 http://www.cgis.biz/tools/access.php
- umasikajiro
- ベストアンサー率67% (545/803)
失礼いたしました。さすがに#1のは無かったですね。わかる範囲で書いてみます ・うちのはFC5ですが そのページの通りに設定して全然問題なく作動しています ・切断されると言う事は iptables -P INPUT DROP は機能しているが 許可する条件 or LANのIPアドレス取得のどちらかがおかしいのではないかと思います iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 行の下に以下の10行を追加してください これで入力待ちの時に Y または yを入れると続行します # TEST入力待ち Yまたはy入力で次の処理 while [ 1 ]; do /bin/echo -n "Y/N: ";read line case $line in [yY]) break ;; esac done # TEST入力待ちは以上迄 (あまりスマートじゃないけど ^^;) 追加したら # sh -x ./iptables.sh <=と打ってください ####入力待ちまでのうちでの実行結果は [hoge@hoge hogege]# sh -x iptables.sh + LAN=eth0 ++ ifconfig eth0 ++ sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d + LOCALNET_MASK=255.255.255.0 ++ netstat -rn ++ grep eth0 ++ grep 255.255.255.0 ++ cut -f1 '-d ' + LOCALNET_ADDR=192.168.1.0 + LOCALNET=192.168.1.0/255.255.255.0 + /etc/rc.d/init.d/iptables stop ファイアウォールルールを適用中: [ OK ] チェインポリシーを ACCEPT に設定中filter [ OK ] iptables モジュールを取り外し中 [ OK ] + iptables -P INPUT DROP + iptables -P OUTPUT ACCEPT + iptables -P FORWARD DROP + iptables -A INPUT -i lo -j ACCEPT + iptables -A INPUT -s 192.168.1.0/255.255.255.0 -j ACCEPT + iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT + '[' 1 ']' + /bin/echo -n 'Y/N: ' Y/N: + read line <=ここで入力待ち 上のは 192.168.1.1~192.168.1.254までのLANの場合です #### それでも駄目なら もっと詳しい人の回答を待ちましょう (^^;) ### 或いは http://fedorasrv.com/patio/patio.cgi <=質問掲示板へ
お礼
お返事、ご丁寧にありがとうございます。 遅くなりました・・・ 少し立て込んでて、 まだ試せてないのですが、 待たせてしまってるのでレスだけ先に返信しておきます。 外部にあって触れないと言うのは、 専用サーバーで、サーバーの管理はデータセンターにあり、入局が出来ないタイプの物で、SSHのみでファイヤーウォール構築しないとダメな環境と言う意味です。 まだやってないのですが、.sh内に + iptables -P INPUT DROP と表記あるは、この時点でSSHから外れてしまって、 おかしくならないでしょうか? 初心者ですいません。。。
- ops
- ベストアンサー率52% (13/25)
こんばんわ、 /sbin/iptables -P INPUT DROP をすることで、一切リモートからの受付が拒絶されてしまいます。 参考になるURLを載せておきます。 sshぐらいは明けておき、/etc/host.allowのTCPラッパーで制御してみてはどうでしょうか。 ========================= From RHCE Current
- umasikajiro
- ベストアンサー率67% (545/803)
私が状況を勘違いしているのかもしれませんが、、 http://fedorasrv.com/iptables.shtml に書いてあるのは iptables.sh と言うfileに記述する内容です ([root@fedora ~]# chmod 700 iptables.sh 行の上迄) コマンドとして /sbin/iptables -P INPUT DROP と打つのでは有りませんよ その下の行の [root@fedora ~]# vi iptables_functions は iptables_functions と言う名前のfileの内容です ##### このページの作者さんはコマンドラインの画面そのものに説明を加えていますので [root@fedora ~]# ←行頭がこれで始まる行はコマンドラインでの入力 [root@fedora ~]# vi /hoge/hoge.sh ← vi コマンドで/hoge/hoge.sh と言うfileを編集 viの付く行から下は そのfileの編集内容 と言う事なのですが、、、
補足
返事遅くなりました、すいません。。。 お返事ありがとうございます。 fileはやってみたのですが、 どこかおかしいのか分からないですが、 接続が切れてしまいますので。。。 iptablesでfileに記載するような事をやって行こうと思っても、 DROPの時点でダメなので、何か良い方法はないですか? との質問でした・・ ちょっと分かりづらい質問の方法で失礼しました。 ちなみに。。。 [root@fedora ~]# vi iptables.shでfile作成 内容は下記。 #!/bin/bash ~略~ # ファイアウォール起動 /etc/rc.d/init.d/iptables start --------------------------------- までのfile作成で権限付けて、 [root@fedora ~]# vi iptables_functions #ファイル作成 # IPアドレスリスト取得関数定義 IPLISTGET(){ ~略~ # 最新版IPアドレスリストを /tmpへバックアップする /bin/cp cidr.txt /tmp/cidr.txt } --------- 作成。 [root@fedora ~]# vi /etc/cron.daily/iplist_check.sh ←作成 #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ~略~ else rm -f IPLIST.new fi ------ まで作成して権限つける。 [root@fedora ~]# ./iptables.sh を実行すると、エラーがひたすら出て、 SSHの接続も不可能になります。 全てコピーペーストでやりました。 saveしてないので、リブートで直りますが。。。
お礼
上記で解決致しました。 umasikajiro様 長々お付き合い頂きまして、 本当にありがとうございました。 もう少し色々と勉強して、 知識を高めていく努力します。 ありがとうございました!