Ipツールを使用すると、複数のアドレスをインターフェイスにバインドできることを知っています(例 http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ )。しかし、現在、IPv6の上に何かを構築しようとしています。アドレスブロック全体(たとえば、/ 64)を使用できるようにすると、プログラムが範囲から任意のアドレスを選択して、それにバインドします。言うまでもなく、この範囲のすべてのIPをインターフェイスに接続するにはしばらく時間がかかります。
Linuxはアドレスのブロック全体をインターフェースにバインドすることをサポートしていますか?
Linux 2.6.37以降では、 AnyIP と呼ばれる機能を介してこれをサポートしています。例えば私が走れば
ip route add local 2001:db8::/32 dev lo
ubuntu 11.04マシンでは、2001:db8 ::/32ネットワークの任意のアドレスの接続を受け入れます。
はい、Linuxはネットワークアドレスのブロックをネットワークインターフェイスにバインドすることをサポートしています...しかし、ループバックインターフェイス上でのみです。だからあなたはこれを行うことができます:
ip addr add 192.168.5.0/24 dev lo
そして、これを行います:
$ nmap -sP -oG - 192.168.5.0/24
# Nmap 5.21 scan initiated Tue Dec 7 11:38:28 2010 as: nmap -sP -oG - 192.168.5.0/24
Host: 192.168.5.0 () Status: Up
Host: 192.168.5.1 () Status: Up
Host: 192.168.5.2 () Status: Up
[...]
Host: 192.168.5.254 () Status: Up
Host: 192.168.5.255 () Status: Up
# Nmap done at Tue Dec 7 11:38:46 2010 -- 256 IP addresses (256 hosts up) scanned in 0.11 seconds
適切なルートが適切に配置されていれば、これは、IPv4アドレスに対して必要なことを実行します。 IPv6について質問しましたが、IPv6の経験はありませんが、同じように機能する可能性は十分にあります。
私はもともとこれについて読んだ here (記事の下部に向かって)。この記事では、以前は知らなかったCentOS/Red Hatの機能を使用して、インターフェイスに複数のアドレスを明示的に割り当てる方法についても説明しています。
他の人が言ったように、AnyIPメカニズムを使用して、サブネット全体の到着パケットをローカルホストインターフェースにルーティングできますが、上流のルーターに必要なパケットをすべてこのマシンにルーティングさせる必要があることにも注意してください。そもそも。これは、ルーターのルーティングテーブルエントリを使用して、またはBGP経由で簡単に実行できます。マシンが各IPに対して個別にARPを実行する必要がある場合、ARPは実際には適切ではありません。
だからここにいくつかのオプションがあります:
スクリプトを使用して、すべてのアドレスを個別にインターフェイスにバインドします
必要なブロックをマシンの単一のアドレスにルーティングし、そのマシンにpcapインターフェイスを使用して、そのブロックのすべてのトラフィックを(ルーターのように)インターセプトして処理します。
NATルールを使用して、1台のマシンにルーティングされたIpsのブロックをそのマシンの単一の内部IPに書き換えることができます...しかし、最終的には1つになります。注目したいIPごとの内部IP。ソリューション1に戻ります。
私があなただったら、オプション1で小さなスクリプトを書いたり、あるいは here のスクリプトを使用したりします。
#!/bin/sh
if [ "$#" -ne "4" ]; then
echo Usage:
echo " $0 interface ip range netmask"
echo " examples:"
echo " 1) Assuming you want to bind the IP range 192.168.0.1..192.168.0.254 to eth0 with netmask 255.255.255.0:"
echo " $0 eth0 192.168.0. 1..254 255.255.255.0"
echo " 2) Assuming you want to bind the IPv6 range 2001:41d0:1:5000::1-2001:41d0:1:5000::254 to eth0 with netmask /56"
echo " $0 eth0 2001:41d0:1:5000:: 1..254 56"
else
echo "Attempting to assign the IP range $2($3) to interface $1 with netmask $4"
for ip in $(eval echo "{$3}"); do ifconfig -v $1 add $2$ip netmask $4; done
fi
上記の「Anyip」はcentos 7では機能しませんでした。起動時に手動でipv6アドレスを作成するスクリプトを作成する必要がありました。そのために、以下を/ etc/crontabに追加しました。
@reboot root /path/to/bashscript
およそ3000のipv6アドレスを作成するbashスクリプトは次のとおりです。
#!/bin/bash
INETP="2a00:xxxx:xxxx:xxxx::"
PRE="64"
INTE="eth0"
IP1=/sbin/ip
echo -n "Adding IPv6 addresses..."
for i in {3..3000}
do
$IP1 -6 addr add ${INETP}$(printf '%x\n' $i)/${PRE} dev ${INTE}
done
echo "Done!"