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を通るのが
普通だと思うんだけど...
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にして再確認てみます。
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しかないんですが、テーブル内の指定したルールだけを削除しないと駄目なのかな。
奥が深いです^^;
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から接続しようとした場合、瞬時に切断されるのではなくタイムアウトとなります。
セキュリティー的にみてタイムアウトというのは良くないのでしょうか?
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関係が全滅になっちゃって、たぶん、こっち
のパケット通すために設定したものが間違ってる可能性高いです。
原因の切り分けするのに、一度シンプルな構成まで戻してみて別のゲートウェイで、外から確認してみます。
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の方で制限かけた方が簡単だと思うけど、それじゃダメなんでしょうか?