
私はパブリック Web サーバーを数台と、自宅に Ubuntu マシンをいくつか持っています。MySQL や Memcache などを監視するために、いくつかのドメインを管理しています。理想的には、自宅のマシンから MySQL、Memcache などに接続し、他のすべてのアクセスを拒否できるようにしたいです。
私の iptables は現在次のようになっています:
ACCEPT tcp -- home ip 0.0.0.0/0 tcp dpt:3306
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT all -- server 1 ip 0.0.0.0/0
ACCEPT all -- server 2 ip 0.0.0.0/0
ACCEPT all -- server 3 ip 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
自宅からすべてにアクセスできるように iptables を拡張したいと思います。自宅の IP にすべてのポートへのアクセスを許可するのではなく、必要なポートごとに自宅の IP の行を追加するのがおそらく良い方法だと思います。しかし、それは問題ではないかもしれません。さらに、パスワードを要求せずに phpMemcachedAdmin のようなものを実行したいと考えています。
そこで、ドメインへのアクセスを全世界から拒否する方法について Google 検索を何度か実行しました。ドメインへのアクセスを全世界から拒否する行のすぐ上に、ポート 80 で自分の IP を許可する行を追加すれば、(うまくいけば)自分以外のすべてのアクセスがブロックされるはずです。
Google 検索で見た投稿には、-m string "Host: domain.com"
または 経由でドメインをブロックできると書かれていました--string "domain.com"
。 どちらも機能していないようです。私が試したことは次のとおりです:
sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP
最初の 2 つは不正な引数「Host:...」でエラーになり、最後の 1 つは不明なオプション「--string」でエラーになります。
事態を少し複雑にしているのは、私の自宅の IP が静的ではなく動的であることです。そのため、セットアップした DynDNS ドメイン経由で自宅の IP を許可する機能があれば便利です (必須ではありませんが)。iptables を停止および開始するためのスクリプトがあるので、必要な場合はいつでも停止して再起動し、IP を強制的に更新できます。(いくつかの場所で、iptables は起動時にドメインの IP のみをチェックすると読みました。)
標準 Web サーバーでの iptables の使用に関するセキュリティ関連のアドバイスも歓迎します。
ありがとう
2014 年 3 月 17 日追加: iptables 行に構文エラーが見つかりました。 は-m string
である必要があります-m string --string
。これで、iptables が、アクセスを禁止したいドメインを認識しているように見えます。ただし、問題はその後、iptables ルールの順序になりました。
新しい iptables は次のようになりました:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_for_matching" ALGO name bm TO 65535
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
アイデアとしては、文字列に一致する DROP の前に IP をキャッチすることです。DROP が最初の行にある場合は、それをキャッチして 502 エラーが発生します。ただし、iptables がリストどおりであれば、リクエストは通過します。私の自宅の IP はまだルール テーブルにありません。
動作するものは以下のようになります:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
ACCEPT all -- My Home IP 0.0.0.0/0
ACCEPT all -- My Laptop IP 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_to_match" ALGO name bm TO 65535
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
IP の代わりに DynDNS ドメイン名を使用するだけで、動的 IP を含めることができました。
おそらくこれが答えになると思いますが、この問題に関するベストプラクティスについてアドバイスをいただきたいと思います。