7DTDサーバへの海外からのアクセスをブロックする方法

はじめに

チーターのアクセス元は、9割9分、海外からと言っても過言ではないです。したがって、海外からのアクセスをブロックすれば、チーターはほとんど来なくなります。

ここでは当サーバで適用している、海外からのアクセスをブロックする方法を説明します。

注意事項

  • 本説明にしたがって設定変更をおこなったことによって何らかの損害を負った場合、当サーバは一切の責任を負いません。自己責任で適用願います。
  • サーバのOSはLinux(Ubuntu20.04)であり、下記パッケージが導入されていることを前提とします。
    • iptables
    • ipset
    • wget
    • gunzip

方法

①まず、適当なディレクトリで下記コマンドを実行してください。

wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip ./cidr.txt.gz

cidr.txtというファイルが展開されたと思います。このファイルには、下記のように世界の国別のIPアドレスがCIDR記法で整理されています。(nami.jp様が維持しており、今のところ1日1回くらいの頻度で更新されています)

AD      46.172.224.0/19
AD      80.80.84.0/22
AD      80.80.92.0/22
...

②次に、ファイアウォール(iptables+ipset)によって、日本(JP)からのアクセスのみを許可し、それ以外の海外からのアクセスをブロックするための設定を行ないます。

  • 下記のようなシェルスクリプト(※1)を作成し、cidr.txtが存在するディレクトリで、OS起動時に1回実行(※2)してください。(必ずご自分のサーバの環境に合わせてスクリプトの内容は見直してください。
#!/bin/bash
 
# ホワイトリストを作成
/usr/sbin/ipset create -exist WHITELIST hash:net
 
# ホワイトリストに日本のIPアドレスを登録
sed -n 's/^JP\t//p' ./cidr.txt | while read ADDRESS; do
    /usr/sbin/ipset add WHITELIST $ADDRESS
done

#(自宅サーバの場合)LANのIPアドレスを登録
/usr/sbin/ipset add WHITELIST "192.168.10.0/24"

### iptablesの基本セッティング ###
# INPUTとFORWARDは全て拒否。
# OUTPUTは全て許可
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -F
iptables -X
# サーバ→サーバのINPUTを許可
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# ルールにマッチしなかったパケットのINPUTを全て許可
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# HTTP,HTTPS,DNSプロトコルは日本以外からのアクセスも許可する。
# 許可しないと、apt等を使ってパッケージをダウンロードできなくなってしまいます。
# HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# SSHは日本からのみアクセス許可
iptables -A INPUT -p tcp -m tcp --dport 22 -m set --match-set WHITELIST src -j ACCEPT

###7Days To Die Dedicated Server用設定###
# 日本からのみアクセス許可し、海外からはアクセス拒否する。
# 参考 https://7dtd.illy.bz/wiki/Ports
# UDP(26900-26903)必須
iptables -A INPUT -p udp -m udp --dport 26900:26903 -m set --match-set WHITELIST src -j ACCEPT
# TCP(26900)必須
iptables -A INPUT -p tcp -m tcp --dport 26900 -m set --match-set WHITELIST src -j ACCEPT
# TCP(WebControlPanel)任意(使う人だけ)
iptables -A INPUT -p tcp -m tcp --dport 8080 -m set --match-set WHITELIST src -j ACCEPT
# TCP(Telnet)任意(使う人だけ)
iptables -A INPUT -p tcp -m tcp --dport 8081 -m set --match-set WHITELIST src -j ACCEPT
# TCP(WebPanel for serverfixes)任意(使う人だけ)
iptables -A INPUT -p tcp -m tcp --dport 8082 -m set --match-set WHITELIST src -j ACCEPT

#Steam用(専用サーバーまたはリッスンサーバー、及びスチームワークスP2Pネットワーキングとスチーム音声チャット)
#参考 https://support.steampowered.com/kb_article.php?ref=8571-GLVN-8711&l=english
#ほんとに要るかは謎(開けなくても動く気はする)
iptables -A INPUT -p tcp --dport 27015 -j ACCEPT
iptables -A INPUT -p udp --dport 27015 -j ACCEPT
iptables -A INPUT -p udp --dport 3478 -j ACCEPT
iptables -A INPUT -p udp --dport 4379 -j ACCEPT
iptables -A INPUT -p udp --dport 4380 -j ACCEPT
  • 同様に、下記のようなシェルスクリプト(※1)を作成し、cidr.txtが存在するディレクトリで、crontab等を用いて1日1回程度実行してください。最新のcidr.txtの内容を定期的に反映するためです。(必ずご自分のサーバの環境に合わせてスクリプトの内容は見直してください。
#!/bin/bash
 
# ホワイトリスト(TMP)を作成
/usr/sbin/ipset create -exist TMP hash:net
 
# ホワイトリストに日本のIPアドレスを登録
sed -n 's/^JP\t//p' ./cidr.txt | while read ADDRESS; do
    /usr/sbin/ipset add TMP $ADDRESS
done

#(自宅サーバの場合)LANのIPアドレスを登録
/usr/sbin/ipset add WHITELIST "192.168.10.0/24"

#スワップ(TMP->WHITELSIT)
/usr/sbin/ipset swap TMP WHITELIST
/usr/sbin/ipset destroy TMP


# 最新の国別コードリストをダウンロード
cd (cidr.txtが存在するディレクトリを指定してください)
if [ -s ./cidr.txt ]; then
    mv ./cidr.txt ./cidr.txt.old
fi

wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip ./cidr.txt.gz

③設定は以上です。(※3)

(※1)シェルスクリプトのことをよく分からない方がいれば、下記を参照。

(※2)iptablesとipsetの設定内容は、OSをシャットダウンすると失われます。したがって、当シェルスクリプトはOS起動時に毎回実行する必要があります。なおOS起動時に自動的にシェルスクリプトを実行する方法は、ディストリビューションによって異なりますが、例えばUbuntuだとrc.localを用いた方法があります。詳しくは下記参照。

(※3)正しく動いていることを確認してみたい方は「sed -n ‘s/^JP\t//p’」のところを「sed -n ‘s/^US\t//p’」に変えて実行してください。この場合アメリカからのアクセスのみを許可することになるため、サーバに入ろうとしてもタイムアウトすると思います。また、前記サンプルコードのままだとSSHもアクセスできなくなってしまいますので、それだと困る方は事前に修正してください。

補足

  • SSHで前記設定を行なう場合、設定に失敗するとアクセスできなくなってしまいます。そういった場合は、サーバのコンソールから直接ログインして設定を修正してください。
  • 本説明が難しくてよく分からないという方は、BotmanCSMM等のサーバーマネージャに特定の国からのアクセスをブロックする機能がありますので、これらを適用すると良いかと思います。ただし、これらのサーバマネージャでは指定した特定の国しかブロックできないので、よっぽど根気よく日本以外の国を網羅しない限りは漏れが出るので、ブロックの確度は本説明の方法より落ちます。
  • Windows系OSを使っているという方については、本説明ではサポートしませんが、下記のような方法を使って似たようなことはできると思います。