こんにちはmOqOmです。
今回は巷で話題のOpenGFWをAlmaLinuxにインストールする方法を紹介していきます。
Go言語が使用できる環境であれば、Go言語のセットアップ手順をスキップしてください。
Go言語のセットアップ
# Go言語のダウンロード
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
# optフォルダに解凍
sudo tar -C /opt/ -xzf go1.22.0.linux-amd64.tar.gz
# Go言語のパスの追加
echo 'export GOROOT=/opt/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin' >> ~/.bashrc
source ~/.bashrc
# Go言語のバージョンを確認
go version
OpenGFWのセットアップ
# OpenGFWのクローン
git clone https://github.com/apernet/OpenGFW.git
# フォルダの移動
cd OpenGFW
# OpenGFWのビルド
go build -o /opt/OpenGFW/OpenGFW
# config.yamlとrules.yamlを作成
nano /opt/OpenGFW/config.yaml
nano /opt/OpenGFW/rules.yaml
config.yamlのサンプル
io:
queueSize: 1024
local: true # FORWARD チェーンで OpenGFW を実行したい場合は false に設定する
workers:
count: 4
queueSize: 16
tcpMaxBufferedPagesTotal: 4096
tcpMaxBufferedPagesPerConn: 64
udpMaxStreams: 4096
rules.yamlのサンプル
- name: block v2ex http
action: block
expr: string(http?.req?.headers?.host) endsWith "v2ex.com"
- name: block v2ex https
action: block
expr: string(tls?.req?.sni) endsWith "v2ex.com"
- name: block shadowsocks
action: block
expr: fet != nil && fet.yes
- name: block trojan
action: block
expr: trojan != nil && trojan.yes
- name: v2ex dns poisoning
action: modify
modifier:
name: dns
args:
a: "0.0.0.0"
aaaa: "::"
expr: dns != nil && dns.qr && any(dns.questions, {.name endsWith "v2ex.com"})
- name: block google socks
action: block
expr: string(socks?.req?.addr) endsWith "google.com" && socks?.req?.port == 80
- name: block wireguard by handshake response
action: drop
expr: wireguard?.handshake_response?.receiver_index_matched == true
- name: block bilibili geosite
action: block
expr: geosite(string(tls?.req?.sni), "bilibili")
- name: block CN geoip
action: block
expr: geoip(string(ip.dst), "cn")
OpenGFWの起動
# Logレベルの設定
export OPENGFW_LOG_LEVEL=debug
# OpenGFWの起動
/opt/OpenGFW/OpenGFW -c /opt/OpenGFW/config.yaml /opt/OpenGFW/rules.yaml
特定サイトのブロック方法
例えばYouTubeをブロックした場合は以下のように記載すればブロックされます。
YouTubeをブロックしたい場合にはrules.yamlに以下を記載します。
内容を軽く説明すると、httpとhttpsをブロックし、youtube.comのDNS名前解決を0.0.0.0に書き換えています。
※認識が間違っている可能性があります。
- name: block YouTube http
action: block
expr: string(http?.req?.headers?.host) endsWith "youtube.com"
- name: block YouTube https
action: block
expr: string(tls?.req?.sni) endsWith "youtube.com"
- name: youtube dns poisoning
action: modify
modifier:
name: dns
args:
a: "0.0.0.0"
aaaa: "::"
expr: dns != nil && dns.qr && any(dns.questions, {.name endsWith "youtube.com"})
OpenGFWの起動とサービス化
SELinuxの無効化
私の知識不足で、SELinuxの有効化しておくとOpenGFWサービスが起動できないので、SELinuxの無効化を行います。
nano /etc/selinux/config
変更前
# To revert back to SELinux enabled:
#
# grubby --update-kernel ALL --remove-args selinux
#
SELINUX=enforcing
変更後
# To revert back to SELinux enabled:
#
# grubby --update-kernel ALL --remove-args selinux
#
SELINUX=disabled
再起動後にOpenGFWのサービス化を実施します。
OpenGFWのサービス化
sudo nano /etc/systemd/system/opengfw.service
以下が今回サービス化としてのファイルの内容になります。
[Unit]
Description=OpenGFW Service
After=network.target
[Service]
Type=simple
ExecStart=/opt/OpenGFW/OpenGFW -c /opt/OpenGFW/config.yaml /opt/OpenGFW/rules.yaml
Environment="OPENGFW_LOG_LEVEL=debug"
WorkingDirectory=/opt/OpenGFW
Restart=always
RestartSec=3
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=opengfw
[Install]
WantedBy=multi-user.target
OpenGFWサービスの起動
サービスファイルの作成が完了したらデーモンの再読みを行いOpenGFWのサービスを起動させます。
# デーモンの再読込み
sudo systemctl daemon-reload
# OpenGFWの起動
sudo systemctl start opengfw
# OpenGFWの自動起動
sudo systemctl enable opengfw
コメント