[FreeBSD-users-jp 96716] Re: 「v6プラス 固定IPサービス」でのIPIPトンネルの設定の仕方
3226388001
3226388001 @ jcom.home.ne.jp
2021年 3月 12日 (金) 14:29:50 UTC
通りすがりの者です。
普段は殆どこのメールングリストは読んでいないのですが、
偶然本件を見かけまして・・
本題(「v6プラス 固定IPサービス」)では無かったようですが、
「v6プラス」の方のこちら:
> (3) MAP-E方式に対応するよう、FreeBSD の NAT 周りに手を入れる
数年前に個人的に手を入れて使用している物がありますので、
もしかしたら応用できる方がいらっしゃるかもしれないと思い、
ご参考までに情報を貼らせて頂きます。
※個人的用途なので汎用化はしておらず、
・割当てアドレスに応じたパラメータを設定とパッチ内に埋め込む必要があり、
この辺り(例)を参考に値を求める必要があります:
https://gato.intaa.net/archives/13173
http://ipv4.web.fc2.com/map-e.html
・ipfw natを使用していますが、その中の"same_ports"スイッチを
MAP-E動作への切替スイッチに転用しています。
※数年間実用していたものがベースですが、
今回投稿用に設定の抽象化とパッチの仕立て直しをしているので、
誤りがあったりしたらごめんなさい。
** /etc/rc.conf **
ifconfig_<v6plusIF>_ipv6="inet6 accept_rtadv"
ifconfig_<v6plusIF>_alias0="inet6 <CE IPv6 240b:xxxxxxxx> prefixlen 64"
ifconfig_gif0="inet6 tunnel <CE IPv6 240b:xxxxxxxx> <PEERADDR 2404:xxxxxxxx> prefixlen 64 mtu 1460 up"
ifconfig_gif0_alias0="inet <CE IPv4 アドレス> <CE IPv4 アドレス> netmask 255.255.255.255"
** ipfwルール **
kldload ipfw_nat
kldload ipfw_pmod
sysctl net.inet.ip.fw.one_pass=0
MAP_E_MYIP=<CE IPv4 アドレス>
ipfw nat 100 config ip ${MAP_E_MYIP} same_ports deny_in
00100 allow ip from any to any via lo0
:
skipto 20000 ip6 from any to any via <v6plusIF>
:
reass ip from any to any in
allow icmp from any to any in icmptypes 8
allow icmp from any to any out icmptypes 0
skipto 10000 ip from any to any via gif0
:
10000 check-state :gif_nat
tcp-setmss 14xx tcp from any to any tcpflags syn
:
15000 nat 100 ip from any to any keep-state :gif_nat
allow ip from any to any
20000 check-state :ip6_flow
:
allow ipencap from <CE IPv6 240b:xxxxxxxx> to <PEERADDR 2404:xxxxxxxx> out
allow ipencap from <PEERADDR 2404:xxxxxxxx> to <CE IPv6 240b:xxxxxxxx> in
:
deny ip from any to any
** デフォルトルート設定 **
route delete 0.0.0.0
route add 0.0.0.0 -interface gif0
以下、パッチ(releng/12.2)->
Index: sys/netinet/libalias/alias_db.c
===================================================================
--- sys/netinet/libalias/alias_db.c (revision 369447)
+++ sys/netinet/libalias/alias_db.c (working copy)
@@ -570,6 +570,14 @@
another link concurrently. This is because GetNewPort() looks for
unused triplets: (dest addr, dest port, alias port). */
+#define MAPE_IPV6_PREFIX (0x240bxxxxxxxxxxxxL) ※IPv6 プレフィックス/64
+#define MAPE_PSID ((int)((MAPE_IPV6_PREFIX >> 8) & 0xff))
+static int convertToMapE( int v ){
+ v = (v % 0xf0) + 0x10;
+ v = ((v & 0xf0) << 8) | (MAPE_PSID<<4) | (v & 0x0f);
+ return v;
+}
+
static int
GetNewPort(struct libalias *la, struct alias_link *lnk, int alias_port_param)
{
@@ -577,6 +585,7 @@
int max_trials;
u_short port_sys;
u_short port_net;
+ int mape_flag = 0;
LIBALIAS_LOCK_ASSERT(la);
/*
@@ -603,8 +612,10 @@
* this is already in use, the remainder of the
* trials will be random.
*/
+ mape_flag = 1;
port_net = lnk->src_port;
port_sys = ntohs(port_net);
+ max_trials = 240 + GET_NEW_PORT_MAX_ATTEMPTS;
} else {
/* First trial and all subsequent are random. */
port_sys = arc4random() & ALIAS_PORT_MASK;
@@ -628,6 +639,10 @@
int go_ahead;
struct alias_link *search_result;
+ if ( mape_flag ){
+ port_net = htons(convertToMapE(port_sys));
+ }
+
search_result = FindLinkIn(la, lnk->dst_addr, lnk->alias_addr,
lnk->dst_port, port_net,
lnk->link_type, 0);
@@ -637,6 +652,16 @@
else if (!(lnk->flags & LINK_PARTIALLY_SPECIFIED)
&& (search_result->flags & LINK_PARTIALLY_SPECIFIED))
go_ahead = 1;
+ else if ( mape_flag && search_result->link_type == LINK_TCP
+ && search_result->data.tcp->state.out != ALIAS_TCP_STATE_CONNECTED
+ && search_result->data.tcp->state.in != ALIAS_TCP_STATE_CONNECTED
+ && search_result->expire_time == TCP_EXPIRE_DEAD
+ && i >= GET_NEW_PORT_MAX_ATTEMPTS
+ ){
+ DeleteLink(search_result);
+ search_result = NULL;
+ go_ahead = 1;
+ }
else
go_ahead = 0;
@@ -658,9 +683,14 @@
}
#endif
}
- port_sys = arc4random() & ALIAS_PORT_MASK;
- port_sys += ALIAS_PORT_BASE;
- port_net = htons(port_sys);
+ if ( mape_flag && i >= GET_NEW_PORT_MAX_ATTEMPTS ){
+ port_sys++;
+ }
+ else{
+ port_sys = arc4random() & ALIAS_PORT_MASK;
+ port_sys += ALIAS_PORT_BASE;
+ port_net = htons(port_sys);
+ }
}
#ifdef LIBALIAS_DEBUG
Index: sys/netinet6/in6_gif.c
===================================================================
--- sys/netinet6/in6_gif.c (revision 369447)
+++ sys/netinet6/in6_gif.c (working copy)
@@ -324,7 +324,7 @@
* it is too painful to ask for resend of inner packet, to achieve
* path MTU discovery for encapsulated packets.
*/
- return (ip6_output(m, 0, NULL, IPV6_MINMTU, 0, NULL, NULL));
+ return (ip6_output(m, 0, NULL, 0/*IPV6_MINMTU*/, 0, NULL, NULL));
}
static int
<-パッチここまで
On Sat, 6 Mar 2021 05:01:44 +0900
Hiroo Ono (小野寛生) <hiroo.ono+freebsd @ gmail.com> wrote:
> 小野寛生です。
>
> 結論から言うと、残念ですが FreeBSD では実用上無理です。
>
> 2021年3月5日(金) 23:51 WATANABE Takeo <take @ kasaneiro.jp>:
> >
> > 渡部と申します。
> >
> > フレッツ光クロスを契約して,
> > JPNlE社の「v6プラス 固定IPサービス」に対応したISP(*1)と契約して,
> > FreeBSDを用いて,v4 over v6 IPoE接続によるインターネット接続を試みています。
> >
> > (*1) https://www.jpne.co.jp/service/v6plus-static/
> >
> > かなりネットの海を泳いだのですが,これと言った先行事例の記事が見つからず,
> > 挫折しています。ただ,
> >
> > https://people.allbsd.org/~hrs/FreeBSD/sato-FBSDW20170825.pdf
> >
> > では,「gifトンネルでは大丈夫」(p.15)との記載があり,できるものだと信じていあす。
>
> その資料には同じく「MAP-E には非対応」とあるかと思いますが、V6プラスで提供されているのは
> MAP-E 方式です。
> 参考: https://www.slideshare.net/yuyarin/i-pv4-ipv6coexistance
>
> https://bokut.in/note/2020/03/
> によれば、pf を使えば*一応*動くところまで設定可能なようですが、実用にはならないようです。
> NetBSD や OpenBSD ではどうなのかは分かりません。
>
> 対応策としては、
> (1) MAP-E 方式に対応しているルーターか Linux を用いて設定する
> (2) IPoE 方式を取っている ISP に乗り換える
> (3) MAP-E方式に対応するよう、FreeBSD の NAT 周りに手を入れる
>
> のどれかかなと思います。
>
> > ところが,私はトンネルを張った接続を行ったことがなく,
> > 何をどのようにしたらよいのか分かりません。
> >
> > 「教えて君」になってしまい申し訳ありませんが,
> > どなたか教えて頂けませんでしょうか。
> >
> > ●ISPからもらっている情報。
> >
> > 1. IPv6プレフィックス : aaaa : bbbb :cccc : dddd : eeee : ffff : gggg : hhhh / 56
> > 2. IPv4アドレス : 192. 168. 100. 119 / 32
> > 3. インターフェースID : iiiii : jjjjj : kkkk : llll
> > 4. Border Relay アドレス : mmmm : nnnn : oooo : pp :: 65
> >
> >
> > ●うちのネットワーク環境は下記のとおりです。
> >
> > +------------------+
> > 192.168.131.64/27 ------| FreeBSD Router|-----ONU----NGN網----VNE(JPNE)----The Net
> > LAN1( .65 )---------LAN2(なし)
> >
> >
> > ●ヤマハさんの設定事例集
> > http://www.rtpro.yamaha.co.jp/RT/docs/ipip/index.html#setting11
> >
> > から,
> >
> > LAN1のアドレスは「192.168.131.65」かつ,
> > 「RAプロキシで取得したプレフィックス) : (インターフェイスID) / 64」になるようです。
> >
> > # うちの回線はひかり電話未契約です。
> >
> > どのようにネットワークの設定(とくに,IPIPトンネル(gif)を張ればよいか,
> > どうかご教示願います。
> >
> > 宜しくお願い致します。
> >
> > ---
> > 渡部 岳郎(WATANABE, Takeo) / JA1CPJ
> > take @ kasaneiro.jp
> > _______________________________________________
> > freebsd-users-jp @ freebsd.org mailing list
> > https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
> > To unsubscribe, send any mail to "freebsd-users-jp-unsubscribe @ freebsd.org"
> _______________________________________________
> freebsd-users-jp @ freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
> To unsubscribe, send any mail to "freebsd-users-jp-unsubscribe @ freebsd.org"
freebsd-users-jp メーリングリストの案内