SoftEtherへの海外からの接続をiptablesでブロック

これは何

VPN Serverを公開してしばらくすると、海外からのお客様が怒涛のように押し寄せてきます。残念ながらリソースの無駄遣いになってしまうので、環境のためにもブロックしておくのが良いでしょう。ただし、日本からのアクセスのみを許可したまま海外に出かけたりすることの無いようお気をつけください。また、今回はSoftEtherをDockerで動かしている関係で、iptablesの指定先が通常と異なるので、そこだけご注意を。

作業手順

国別IPアドレスリストの取り込み

まずは、各国別のIPアドレスリストを把握する必要があります。今回は、以下のサイトで公開されているものを利用させていただきました。

WorldIPv4Map/README.md at main · inet-ip-info/WorldIPv4Map
This repository provides an up-to-date mapping of country-wise IPv4 address allocations, essential for internet infrastr...

正直このサイトに書かれている通りに実行していくだけです。必要に応じて、sedの正規表現を書き換えましょう。ipsetの永続化については、systemctl使うならこんな雰囲気で。

$ sudo yum install ipset-service
$ sudo ipset save > hoge # 内容を確認
$ sudo cp hoge /etc/sysconfig/ipset
$ sudo systemctl start ipset
$ sudo systemctl enable ipset
# 状態確認
$ sudo systemctl status ipset
$ sudo ipset l | head

iptablesでアクセスを制限

冒頭にも書きましたが、DockerでSoftEtherを動かしている場合、iptablesで「iptables -A INPUT」といった設定をしても、docker-Chainの設定が勝ってしまうため、意図したとおりに動いてくれません。以下のページにありますように、DOCKER-USERチェインで設定するのが正解です。

Docker と iptables — Docker-docs-ja 24.0 ドキュメント

というわけで、以下の感じで。「allow_list」は、ipsetのリストを指していますので、各環境に合わせて変更してください。また、portをどこまでカバー/制限するかはdockerに何をやらせているかによって変わってくると思うので、こちらも各環境に合わせてください。X.Y.0.0/16というのは、自分の環境のVPN接続確立後のネットワークアドレスになります。これを指定しないと、VPN接続は出来てもSSL通信ができないという状態になったりするのでご注意を。こちらのネットワークアドレスもそれぞれの環境に合わせて設定してください。

$ sudo /sbin/iptables -I DOCKER-USER -m multiport -p tcp --dport 443,5555,1701 -j DROP
$ sudo /sbin/iptables -I DOCKER-USER -m multiport -p tcp --dport 443,5555,1701 -m set --match-set allow_list src -j ACCEPT
$ sudo /sbin/iptables -I DOCKER-USER -m multiport -p tcp --dport 443,5555,1701 -s X.Y.0.0/16 -j ACCEPT

$ sudo /sbin/iptables -I DOCKER-USER -m multiport -p udp --dport 500,4500,1194,1701 -j DROP
$ sudo /sbin/iptables -I DOCKER-USER -m multiport -p udp --dport 500,4500,1194,1701 -m set --match-set allow_list src -j ACCEPT
$ sudo /sbin/iptables -I DOCKER-USER -m multiport -p udp --dport 500,4500,1194,1701 -s X.Y.0.0/16 -j ACCEPT

あとは荒ぶっているvpnserverのログが凪になり、自分の環境からは接続できることが確認できればOK。必要に応じて、AWSの海外リージョン上にある環境からの接続テストもしておくと安心かもですね。
最後に問題なければ、適当にiptablesの設定内容を永続化。

$ sudo iptables-save > ~/iptables # 内容確認
$ sudo cp ~/iptables /etc/sysconfig/iptables
$ sudo systemctl start iptables 
$ sudo systemctl enable iptables
$ sudo systemctl status iptables

#システムリブートを挟んで設定が反映されていることを確認
$ sudo iptables -L 

え。今どきならFirewalldを使えって?

コメント

タイトルとURLをコピーしました