ds-lite(IPv4 over IPv6ルータ)の構築 -Firewalld → nftables 切替-

“VPSサーバ" と “ミニPC" を使用し、"ds-lite(IPv4 over IPv6ルータ)の構築(以降、ds-lite)" をしています。今回は、ファイアウォール(Firewalld → nftables) の切替をしましたので、そのことを書きたいと思います。

【お願い】
・ds-lite(IPv4 over IPv6ルータ) の構築については、解らない部分・理解が出来ていないことがあります。自分のPC、インターネット環境を使用してds-liteの情報を掲載しますが、これが正しいと思わないようにお願いします。
また、自分はVPSサーバー(クラウドサーバ)を使用しています。※サービスは従量制ため、ご使用の場合は注意をお願いします。今回の記事について、PC,その他のトラブルについては責任を負いかねます。自己責任でお願い致します。

1. 自分のインターネット環境・機器

・光回線事業者:ドコモ光 1ギガ Aタイプ
・IPoeサービス:v6プラス
・ミニPC:MINISFORUM MT4UB1

2. VPSサーバー

・VULTR
 サービス名:Cloud Compute(Regular Performance)
       CPU:1vCPU/Memory:1GB/Bandwidth:1.00TB/Storage:25GB
・[インストールOS]:RedHat Enterprise Linux 9 (無償版)

3. ds-liteの構築

【前提条件】

・少し構築の部分で変更があり設定について順番に書きますが、過去のds-liteの構築についてほとんど変わりありません。恐れ入りますが、省略をさせて頂きます。
・過去のds-liteの構築については、カテゴリより"ds-lite"を見て頂きますようお願いします。
・ミニPCにdhcpサーバが構築されている。
・VPSサーバとminiPCにperlの実行環境がされている。

3.1 VPSサーバ側

[3.1.1] ds-liteの設定
“perl言語"を使って実行をしています。
ソースコードを掲載しますが、【】の部分は変更しています。

ds-lite@vps:~ $ sudo vim /home/ds-lite/vps_ds-lite.pl 
#!/usr/bin/perl

#-----------【魔法の言葉】------------
use POSIX qw(strftime);
use File::Path;
use strict;
use warnings;
#use NetAddr::IP;
#use Net::Netmask;
#use utf8;

#-----------【変数】------------
#IP関連設定
my $LOCAL_IPV6="【ミニPC:取得済みのIPv6アドレス】";
my $VPS_SERVER_IPV6="【VPSサーバ:取得済みのIPv6アドレス】";
my $LOCAL_IPV4="【ミニPC:dhcpクライアントのipv4アドレス/サブネットマスク】";
my $LOCAL_IPV4_GW="【ミニPC:dhcpdサーバのipv4アドレス】";

#-----------【処理】------------
print "ds-liteの構築を開始します。\n";
print "※スーパーユーザーで実行してください\n";
print "項目の値を変更したい場合はテキストエディターなど使用し編集を行ってください。\n";
print "\n";
print "ds-liteを開始したい場合は・・・ 1 \n";

my $question = <STDIN>;
chomp $question;

if($question == "1"){
        print "これより ds-lite の構築を開始します。\n";
        my $ipip6tunnel_1 = `modprobe ip6_tunnel`;
        my $ipip6tunnel_2 = `ip -6 tunnel add ip6tnl mode ipip6 remote '${LOCAL_IPV6}' local '${VPS_SERVER_IPV6}' dev ens3 encaplimit none`;
        my $ipip6tunnel_3 = `ip link set dev ip6tnl up`;

        my $sysctl_1 = `sysctl -w net.ipv4.ip_forward=1`;
        my $sysctl_2 = `sysctl -w net.ipv4.conf.all.forwarding=1`;
        my $sysctl_3 = `sysctl -w net.ipv4.conf.ens3.rp_filter=0`;
        my $sysctl_4 = `sysctl -w net.ipv4.conf.ip6tnl.rp_filter=0`;
        my $sysctl_5 = `sysctl -w net.nf_conntrack_max=65535`;
        my $sysctl_6 = `sysctl -p`;

        my $route_1 = `route add -net 192.168.0.0/16 dev ip6tnl`;
        my $route_2 = `route add -net 10.0.0.0/8 dev ip6tnl`;
        my $route_3 = `route add -net 172.16.0.0/12 dev ip6tnl`;
        my $route_4 = `route add -net '${LOCAL_IPV4}' dev ip6tnl`;

        print("ipv6 ds-lite の構築が完了しました。\n");

}else{
        print "1以外の入力がされました。\n";
        print "終了します。\n";
}

[3.1.2] ファイアウォール(nftable)の設定
ソースコードを掲載しますが、【】の部分は変更しています。
※ファイアウォールの細かい設定は、個々で設定を行ってください。

ds-lite@vps:~ $ sudo vim /etc/sysconfig/nftables.conf
flush ruleset

table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
                iifname "ens3" ip6 saddr 【ミニPC:取得済みのIPv6アドレス】 counter packets 0 bytes 0 accept
                iifname "ens3" jump input6_ens3
                ct state related,established counter packets 0 bytes 0 accept
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
                oifname "ens3" ip6 daddr 【ミニPC:取得済みのIPv6アドレス】 counter packets 0 bytes 0 accept
                ct state related,established counter packets 0 bytes 0 accept
        }

        chain input6_ens3 {
                ct state {established,related} accept
                ct state invalid drop
                udp dport bootpc accept
                tcp dport bootpc accept
                reject with icmp type port-unreachable
        }
}

table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "ens3" counter packets 0 bytes 0 masquerade
                ct state related,established counter packets 0 bytes 0 accept  
        }
        chain forward {
                type filter hook forward priority filter; policy accept;
                iifname "ip6tnl" oifname "ens3" counter packets 0 bytes 0 accept
                iifname "ens3" oifname "ip6tnl" ct state related,established counter packets 0 bytes 0 accept

        }
}

[3.1.3] ds-liteの構築実行・nftableの実行
【ds-lite】

ds-lite@vps:~ $ sudo perl /home/ds-lite/vps_ds-lite.pl 

【nftable】

ds-lite@vps:~ $ sudo nft -f /etc/sysconfig/nftables.conf
ds-lite@vps:~ $ sudo systemctl restart nftables.service

3.2 minipc側

[3.2.1] ds-liteの設定
ソースコードを掲載しますが、【】の部分は変更しています。

ds-lite@minipc:~ $ sudo vim /home/ds-lite/minipc_ds-lite.pl 
#!/usr/bin/perl

#-----------【魔法の言葉】------------
use POSIX qw(strftime);
use File::Path;
use strict;
use warnings;
#use NetAddr::IP;
#use Net::Netmask;
#use utf8;

#-----------【変数】------------
#IP関連設定
my $LOCAL_IPV6="【ミニPC:取得済みのIPv6アドレス】";
my $VPS_SERVER_IPV6="【VPSサーバ:取得済みのIPv6アドレス】";


#-----------【処理】------------
print "ds-liteの構築を開始します。\n";
print "※スーパーユーザーで実行してください\n";
print "項目の値を変更したい場合はテキストエディターなど使用し編集を行ってください。\n";
print "\n";
print "ds-liteを開始したい場合は・・・ 1 \n";

my $question = <STDIN>;
chomp $question;

if($question == "1"){
        print "これより ds-lite の構築を開始します。\n";

        my $ipip6tunnel_1 = `modprobe ip6_tunnel`;
        my $ipip6tunnel_2 = `ip -6 tunnel add ip6tnl mode ipip6 remote '${VPS_SERVER_IPV6}' local '${LOCAL_IPV6}' dev ens3 encaplimit none`;
        my $ipip6tunnel_3 = `ip link set dev ip6tnl up`;

        my $sysctl_1 = `sysctl -w net.ipv4.ip_forward=1`;
        my $sysctl_2 = `sysctl -w net.ipv4.conf.all.forwarding=1`;
        my $sysctl_3 = `sysctl -w net.ipv6.conf.ip6tnl1.accept_ra = 0`;
        my $sysctl_4 = `sysctl -p`;

        print("ipv6 ds-lite の接続が完了しました。\n");

}else{
        print "1以外の数字が入力されました。\n";
        print "終了します。\n";
}

[3.2.2] ファイアウォール(nftable)の設定
ソースコードを掲載しますが、【】の部分は変更しています。
※ファイアウォールの細かい設定は、個々で設定を行ってください。

ds-lite@minipc:~ $ sudo vim /etc/sysconfig/nftables.conf
flush ruleset

table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
                iifname "lo" counter packets 0 bytes 0 accept;                
                iifname "enp2s0" ip6 saddr 【VPSサーバ:取得済みのIPv6アドレス】 counter packets 0 bytes 0 accept
                iifname "enp2s0" jump input6_enp2s0
                ct state related,established counter packets 0 bytes 0 accept   
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
                oifname "enp2s0" ip6 daddr 【VPSサーバ:取得済みのIPv6アドレス】 counter packets 0 bytes 0 accept
                ct state related,established counter packets 0 bytes 0 accept     
        }

        chain input6_enp2s0 {
                ct state {established,related} accept
                ct state invalid drop
                udp dport bootpc accept
                tcp dport bootpc accept
                reject with icmp type port-unreachable # all other traffic
        }
}

table ip nat {
        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "ip6tnl1" counter packets 0 bytes 0 masquerade
                oifname "enp1s0" counter packets 0 bytes 0 masquerade
                ct state related,established counter packets 0 bytes 0 accept   
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
                iifname "ip6tnl1" oifname "enp1s0" counter packets 0 bytes 0 accept
                iifname "enp1s0" oifname "ip6tnl1" ct state related,established counter packets 0 bytes 0 accept
        }
}

[3.2.3] ds-liteの構築実行・nftableの実行
【ds-lite】

ds-lite@minipc:~ $ sudo perl /home/ds-lite/minipc_ds-lite.pl 

【nftable】

ds-lite@minipc:~ $ sudo nft -f /etc/sysconfig/nftables.conf
ds-lite@minipc:~ $ sudo systemctl restart nftables.service

以上になります。

【使用サービス情報】
NTT Docomo さん
JPIX さん
VULTR さん(※紹介リンク用にさせて頂いています。※)

【参考文献】
Archlinux さん -nftables-
Server World さん -CentOS Stream 9/Nftables : サービスを有効化する –
有限会社ビットハイブ さん -nftablesによるファイアウォール設定-

ds-lite,PEAR,VULTR

Posted by こなつ