投稿日:2003年03月08日 作成鷹の巣

No.8830 iptablesのルールを定期的に一部だけを自動変更する方法は?



iptablesのルールを定期的に一部だけを自動変更する方法は?

No.8830 投稿時間:2003年03月08日(Sat) 23:10 投稿者名:さすらいのGさん URL:

ふと思い立ってiptablesのフィルター関係と、穴あけを見直していたんですが、
chainとtableで悩んでしまって深みにはまりつつあります。

iptablesのルールを定期的にcrondで書き換えたいのですが、全部書き換えるのでは
脳が無いので、一部だけを変更するには、filterはできたのですが、-t natの部分で
悩んでいます。

filterは自分で、iptables -N hoge とチェイン名を作ってあげれば、そのチェインを
フラッシュすれば問題なかったのですが、-t nat -A PREROUTING の部分はどのように
するのがベターなのでしょうか?

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 7008 -j DNAT --to-destination 192.168.0.x
このような固定の場合はそのまま使いたくて、-s でソースの指定をするようなもの、DDNSの正引き結果は随時
反映させるためには、一部の-t nat部分を消したり追加したりする必要があります。

単純に、-t natの部分を違う名前にしようかと思ったのですが、このnat部分はテーブルで自分で作成したり
することができないようなのです。何か良いアイデアはありますでしょうか?


自己レスですが、フィルターの方を定期的に変更するようにしてみました。

No.8845 投稿時間:2003年03月10日(Mon) 10:46 投稿者名:さすらいのGさん URL:

NATテーブルだと、chain名が付けられないので、INPUTフィルターのchainの方に名前を付けて
こちらを定期的に更新するようにしてみました。natテーブルの方は通過したパケットだけが
リダイレクトされるだけなので、こちらは1行だけの記述になりました。
まだ、細かい動作検証を行っていませんが、もしかしたら、通信中にINPUTフィルターの再定義
を行ったときに通信が切れたりしないか確認してみます。


「通過したパケットだけがリダイレクトされる」というのは逆ではないでしょうか?

No.8868 投稿時間:2003年03月10日(Mon) 23:50 投稿者名:かつ URL:http://www.kkoba.com/

さすらいのGさん、こんばんは。

> INPUTフィルターのchainの方に名前を付けて
> こちらを定期的に更新するようにしてみました。
> natテーブルの方は通過したパケットだけが
> リダイレクトされるだけなので、こちらは1行だけの
> 記述になりました。
natテーブルのPREROUTINGを通った後、パケットの宛先によってfilterテーブルのINPUTまたはFORWARDを
通るので、「通過したパケットだけがリダイレクトされる」というのは逆ではないでしょうか?

あと、natのPREROUTINGでリダイレクトしているということは、INPUTではなくFORWARDを通るのが
普通だと思うんだけど...


filter関係は、PREROUTINGより優先順位が後なのでしょうか?

No.8872 投稿時間:2003年03月11日(Tue) 11:00 投稿者名:さすらいのGさん URL:

> natテーブルのPREROUTINGを通った後、パケットの宛先によってfilterテーブルのINPUTまたはFORWARDを
> 通るので、「通過したパケットだけがリダイレクトされる」というのは逆ではないでしょうか?
> あと、natのPREROUTINGでリダイレクトしているということは、INPUTではなくFORWARDを通るのが
> 普通だと思うんだけど...

iptablesの詳細な動作がよく分かっていませんで…
確かに、INPUTではなくFORWARDですね。
filter関係は、PREROUTINGより優先順位が後なのでしょうか?
FORWARDのデフォルトポリシーが、ACCEPTだったので、これをDENYにして再確認てみます。


iptablesのパケットの流れ

No.8874 投稿時間:2003年03月11日(Tue) 17:41 投稿者名:かつ URL:http://www.kkoba.com/

さすらいのGさん、こんにちは。

> iptablesの詳細な動作がよく分かっていませんで…
> 確かに、INPUTではなくFORWARDですね。
> filter関係は、PREROUTINGより優先順位が後なのでしょうか?
作りたての私のページですが、パケットの流れは参考になると思います。
http://www.kkoba.com/linuxrouter/iptables.shtml

iptablesの設定の方は、まだまだ不安なので参考程度にして下さい。


参考に作り替えてみます。

No.8879 投稿時間:2003年03月11日(Tue) 20:59 投稿者名:さすらいのGさん URL:

> さすらいのGさん、こんにちは。
> iptablesの設定の方は、まだまだ不安なので参考程度にして下さい。

大変参考になります。自分のshell scriptだと、ほとんど直に書いてあるので、直すのも大変です。
これを参考に作り替えてみて、またお尋ねすると思いますが、よろしくお願いします。


# FTP port mode <--- 17
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 21 -j DNAT --to $FTP_SERVER
iptables -A FORWARD -i ppp0 -d $HTTP_SERVER -p tcp --dport 21 -m state --state NEW -j ACCEPT
# FTP pasv mode <--- 18
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 4000:4029 -j DNAT --to $FTP_SERVER
iptables -A FORWARD -i ppp0 -d $HTTP_SERVER -p tcp --dport 4000:4029 -m state --state NEW -j ACCEPT

この部分で質問なのですが、各2行目の、$HTTP_SERVERは実際には、$FTP_SERVERと同一のマシンなので問題ないみたいで
すが、正しくは、各2行目も$FTP_SERVERにする方が好ましいんですよね?

おそらく私のやりたいことをこの延長線上で考えると、各2行目に-sオプションがたくさん付き、設定分だけ行数が必要に
なると思うのです。
#例えば、PORTモードの設定時の2行目からがこんな感じかな。/32は省略で書きました。/255.255.255.255
iptables -A FORWARD -i ppp0 -s hoge1.ddns.com/32 -d $FTP_SERVER -p tcp --dport 20:21 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ppp0 -s hoge2.ddns.com/32 -d $FTP_SERVER -p tcp --dport 20:21 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ppp0 -s hoge3.ddns.com/32 -d $FTP_SERVER -p tcp --dport 20:21 -m state --state NEW -j ACCEPT

でもって、当然ddnsですので、この部分を5分とか10分おきに再定義しないといけないと思い。chain名を付けようと
考えていたわけです。でも、なんかよく調べるほど混乱してきてしまって・・・


もうちょっと単純に考えてみました。

No.8881 投稿時間:2003年03月11日(Tue) 21:24 投稿者名:さすらいのGさん URL:

HPを参考に考えてみたのですが、あるポートを送信元を基準にフィルターをかけLAN内のサーバにフォワードする場合
chain名を付けるとこうなるのかな?

#!/bin/sh
SERVER='192.168.0.2'
iptables -F
iptables -P FORWARD DROP

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination $SERVER
iptables -N ddns
iptables -A ddns -s hoge1.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
iptables -A ddns -s hoge2.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
iptables -A ddns -s hoge3.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
iptables -A FORWARD -i ppp0 -p tcp --dport 80 -j ddns

こんな感じで、とりあえずこのシェルスクリプトを実行した瞬間に正引きしたIPからのみ、80番のフォワードが
可能になるのかな?

で、crondあたりで、以下のスクリプトを実行させれば、ddns部分のフィルターだけが置き換わるのかしら?
#!/bin/sh
iptables -X ddns
iptables -N ddns
iptables -A ddns -s hoge1.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
iptables -A ddns -s hoge2.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
iptables -A ddns -s hoge3.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER

このスクリプトだと、名前の削除だけで、テーブルの方を消さないと駄目なのかな?
/proc/net/ip_tables_name
の中身は、natとfilterしかないんですが、テーブル内の指定したルールだけを削除しないと駄目なのかな。
奥が深いです^^;


色々やってみて、都度iptables -Lで確認すれば良いのではないでしょうか?

No.8883 投稿時間:2003年03月11日(Tue) 21:53 投稿者名:かつ URL:http://www.kkoba.com/

さすらいのGさん、こんばんは。
ちょうど書き込んだ時に、新しいレスがついていました。

> #!/bin/sh
> SERVER='192.168.0.2'
> iptables -F
> iptables -P FORWARD DROP
>
> iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination $SERVER
> iptables -N ddns
> iptables -A ddns -s hoge1.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
> iptables -A ddns -s hoge2.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
> iptables -A ddns -s hoge3.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
> iptables -A FORWARD -i ppp0 -p tcp --dport 80 -j ddns
>
> こんな感じで、とりあえずこのシェルスクリプトを実行した瞬間に正引きしたIPからのみ、80番のフォワードが
> 可能になるのかな?
>
> で、crondあたりで、以下のスクリプトを実行させれば、ddns部分のフィルターだけが置き換わるのかしら?
> #!/bin/sh
> iptables -X ddns
> iptables -N ddns
> iptables -A ddns -s hoge1.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
> iptables -A ddns -s hoge2.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
> iptables -A ddns -s hoge3.ddns.com/255.255.255.255 -p tcp --dport 80 -j DNAT --to-destination $SERVER
>
> このスクリプトだと、名前の削除だけで、テーブルの方を消さないと駄目なのかな?
> /proc/net/ip_tables_name
> の中身は、natとfilterしかないんですが、テーブル内の指定したルールだけを削除しないと駄目なのかな。
> 奥が深いです^^;
ip_tables_namesは、テーブルの名前でチェイン名ではないので、ここには自分で作ったチェインは表示され
ないです。

あと、自分で定義したチェインが-jで他から使われている場合、削除できないはずです。
iptables -X ddnsでチェインを削除ではなくて、iptables -F ddnsでチェインのフラッシュをすれば、
この考え方でできるかも知れないです。

ここまで来たら色々やってみて、都度iptables -Lで確認すれば良いのではないでしょうか?
結果、ぜひこの掲示板に書いてください。


がんばってみます。

No.8888 投稿時間:2003年03月11日(Tue) 23:11 投稿者名:さすらいのGさん URL:

> ip_tables_namesは、テーブルの名前でチェイン名ではないので、ここには自分で作ったチェインは表示され
> ないです。
>
> あと、自分で定義したチェインが-jで他から使われている場合、削除できないはずです。
> iptables -X ddnsでチェインを削除ではなくて、iptables -F ddnsでチェインのフラッシュをすれば、
> この考え方でできるかも知れないです。
>
> ここまで来たら色々やってみて、都度iptables -Lで確認すれば良いのではないでしょうか?
> 結果、ぜひこの掲示板に書いてください。

がんばってみます。できるだけ、再利用が可能な形で結果も報告したいと思います。
FTPサーバ(本来は目的はこっち)の方でIP制御をしてもいいのですが、DDNSに対応しているものが
なかなか無くて(ユーザ毎にIP制御できるけど、ddnsは未対応)、自分の使おうとしている雷電で解決
できるかもチェックしてみます。

以前は、FTPサーバをポート全開でユーザ認証だけでやってたんですが、ポートスキャンが多くて
ルータに、safetp serverを入れて、これをtcpserverで動かしていたんですが、safetpを使わずに
ルータで制御できないものか試行していたところだったんです。

iptablesも自分では結構分かったつもりでいたんですが、今回はいい勉強になりました。
とりあえず、自分でできるところまではやってみます。

また、アドバイスをお願いしますね^^


途中経過報告

No.8901 投稿時間:2003年03月12日(Wed) 12:29 投稿者名:さすらいのGさん URL:

自分で付けたchainのフラッシュは綺麗に動いているみたいです。
ちょっと質問なのですが、デフォルトポリシーでDROPに設定したものは、PREROUTING行が設定されていても
ACCEPT行が無ければ、パケットは破棄されるんですよね?

iptables -P FORWARD DROP
iptables -N test
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2
iptables -A test -s hoge.dns.org/255.255.255.255 -p tcp --dport 80 -j test

この状態では、hoge.dns.orgからのみ、80番を転送するという状態です。
このあとに、
iptables -F test
を実行すると、iptalbes -L で確認したところ当然、hoge.dns.orgの設定だけが消えます。
パケットの流れ的には、PREROUTINGを通過したあと、ACCEPT行が無ければ、DROPされると
いう認識であっていますでしょうか?


訂正

No.8905 投稿時間:2003年03月12日(Wed) 16:09 投稿者名:さすらいのGさん URL:

> iptables -P FORWARD DROP
> iptables -N test
> iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2
> iptables -A test -s hoge.dns.org/255.255.255.255 -p tcp --dport 80 -j ACCEPT
> iptables -A FORWARD -i ppp0 -p tcp --dport 80 -j test

1行足りなかったのと、-j ACCEPT部分を間違えていました。


格闘の毎日…

No.8931 投稿時間:2003年03月13日(Thu) 14:34 投稿者名:さすらいのGさん URL:

iptables -P FORWARD DROP
となっているにも関わらず、フィルターの手前で、PREROUTINGで拾っちゃうみたいで、
PREROUTING設定行は全てフォワードされちゃってるみたいなんですが、PREROUTINGの
対象となったものは、そのあと、FORWARDのフィルター通るんですよね?
フィルターに、ACCEPT項目が無ければ全てパケット廃棄かと思ってたんですが・・・


どうやってもできないので、力技で無理矢理・・・

No.8942 投稿時間:2003年03月13日(Thu) 19:13 投稿者名:さすらいのGさん URL:

どうしても、PREROUTING行があると、FORWARDのフィルターより優先度が高いため?いくらフィルター
かけても素通りしてしまいます。たぶん、やり方が悪いのだと思うのですが・・・

結局、無理矢理PREROUTING行でフィルターかけることにしました。
起動時のiptables設定では、固定のPREROUTINGに必要なものだけ記入しておき、DDNSでフィルターを
かけるものは、perlスクリプトで、シェルスクリプトをはき出すようにしました。

最初は、全てのPREROUTING行がリセットされてしまうかと思い、chainで名前を付ける方向に考えを
持って行ったのですが、-D でマッチングした行を消せることが分かったので登録ユーザのDDNSを10分
おきに監視して、リストを2つ作成することにしました。

new.list
ddns名 ip_address
ddns名 ip_address

old.list
ddns名 ip_address
ddns名 ip_address

この2つのリストを比較し、ip_addressが更新されている場合は、古いIPアドレスで、-D PREROUTING -t nat ~で削除してから、
-A PREROUTING -t nat ~で新しいIPアドレスを追加するようにしました。

あと、新規に登録したDDNSと削除したDDNSに対応させてやっと動作するようになりました。

DDNSリストはWEBから編集可能にしてようやく目的達成かな?と思ってるんですが、

登録してないIPから接続しようとした場合、瞬時に切断されるのではなくタイムアウトとなります。
セキュリティー的にみてタイムアウトというのは良くないのでしょうか?


PREROUTINGだけにしてFORWARDを通さないとタイムアウトします。

No.8945 投稿時間:2003年03月13日(Thu) 20:33 投稿者名:かつ URL:http://www.kkoba.com/

さすらいのGさん、こんばんは。

> どうしても、PREROUTING行があると、FORWARDのフィルターより優先度が高いため?いくらフィルター
> かけても素通りしてしまいます。たぶん、やり方が悪いのだと思うのですが・・・
うーん、おかしいですね。
自分でもテストして見ましたが、PREROUTINGだけにしてFORWARDを通さないとタイムアウトします。
可能性としては、
1. FORWARDのデフォルトポリシーがDROPになっていない(iptables -Lで、Chain FORWARD (policy DROP)を確認する)
2. FORWARDを通っていない(192.168.0.2がRouter自身のため、FORWARDではなくINPUTを通っている)
の2つでしょうか?


> 登録してないIPから接続しようとした場合、瞬時に切断されるのではなくタイムアウトとなります。
> セキュリティー的にみてタイムアウトというのは良くないのでしょうか?
下手に返答を返すと「なんか動いてるな」ってわかってしまうので、タイムアウトで良いと私は思います。


別のゲートウェイで、外から確認してみます。

No.8953 投稿時間:2003年03月13日(Thu) 21:55 投稿者名:さすらいのGさん URL:

いつもアドバイスありがとうございます。

> 可能性としては、
> 1. FORWARDのデフォルトポリシーがDROPになっていない(iptables -Lで、Chain FORWARD (policy DROP)を確認する)
> 2. FORWARDを通っていない(192.168.0.2がRouter自身のため、FORWARDではなくINPUTを通っている)
> の2つでしょうか?

間違いなくDROPと表示されています。あと、実際にフォワードするプライベートIPは、LANの別PCなので、INPUTも通らない
はずなんですけどね^^; FORWARDをデフォルトで、DROPにしたら、MASQUERADE関係が全滅になっちゃって、たぶん、こっち
のパケット通すために設定したものが間違ってる可能性高いです。

原因の切り分けするのに、一度シンプルな構成まで戻してみて別のゲートウェイで、外から確認してみます。


「ある一部のDynamicDNSホストからのアクセスだけ許したい」ってことでしょうか?

No.8882 投稿時間:2003年03月11日(Tue) 21:46 投稿者名:かつ URL:http://www.kkoba.com/

さすらいのGさん、こんばんは。

>
> # FTP port mode <--- 17
> iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 21 -j DNAT --to $FTP_SERVER
> iptables -A FORWARD -i ppp0 -d $HTTP_SERVER -p tcp --dport 21 -m state --state NEW -j ACCEPT
> # FTP pasv mode <--- 18
> iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 4000:4029 -j DNAT --to $FTP_SERVER
> iptables -A FORWARD -i ppp0 -d $HTTP_SERVER -p tcp --dport 4000:4029 -m state --state NEW -j ACCEPT
>
> この部分で質問なのですが、各2行目の、$HTTP_SERVERは実際には、$FTP_SERVERと同一のマシンなので問題ないみたいで
> すが、正しくは、各2行目も$FTP_SERVERにする方が好ましいんですよね?
間違いを指摘してもらえると助かります(案外だれも指摘してくれないので)。
早速直しました。実害がないとは言え、実際のルータの設定も間違えてました。

> おそらく私のやりたいことをこの延長線上で考えると、各2行目に-sオプションがたくさん付き、設定分だけ行数が必要に
> なると思うのです。
> #例えば、PORTモードの設定時の2行目からがこんな感じかな。/32は省略で書きました。/255.255.255.255
> iptables -A FORWARD -i ppp0 -s hoge1.ddns.com/32 -d $FTP_SERVER -p tcp --dport 20:21 -m state --state NEW -j ACCEPT
> iptables -A FORWARD -i ppp0 -s hoge2.ddns.com/32 -d $FTP_SERVER -p tcp --dport 20:21 -m state --state NEW -j ACCEPT
> iptables -A FORWARD -i ppp0 -s hoge3.ddns.com/32 -d $FTP_SERVER -p tcp --dport 20:21 -m state --state NEW -j ACCEPT
>
> でもって、当然ddnsですので、この部分を5分とか10分おきに再定義しないといけないと思い。chain名を付けようと
> 考えていたわけです。でも、なんかよく調べるほど混乱してきてしまって・・・
「ある一部のDynamicDNSホストからのアクセスだけ許したい」ってことでしょうか?
FORWARDテーブルならチェインの追加・削除で対応できるかも知れないですね。
FTP Serverの方で制限かけた方が簡単だと思うけど、それじゃダメなんでしょうか?


|目次|掲示板|過去ログ目次|▲頁先頭|