異なるIPで1000macvlan
を作成したいと思います。そして、ip rule
を使用して、複数のインターフェースを備えたインターネットに異なるパブリックIPをルーティングします。
最初に1000macvlanを作成します。
ip link add link eth0 address %02x:%02x:%02x:%02x:%02x:%02x eth0_%d type macvlan
%02xはMACアドレス、%dは0〜999です。
次に、ifconfigを使用して、各macvlanに異なるパブリックIPを設定します。最後に、ipルールを使用します。
ip route add default via ${router} dev ${interface} src ${ip} table ${interfaceidx}
ip rule add from ${ip} table ${interfaceidx}
各macvlanは、ルールとテーブルを追加します。
他のサーバーを使用して、macvlanのIPにpingを実行します。
root@ubuntu:/tmp# ping 222.217.107.102
PING 222.217.107.102 (222.217.107.102) 56(84) bytes of data.
64 bytes from 222.217.107.102: icmp_seq=1 ttl=56 time=57.5 ms
64 bytes from 222.217.107.102: icmp_seq=2 ttl=56 time=58.0 ms
64 bytes from 222.217.107.102: icmp_seq=3 ttl=56 time=60.1 ms
64 bytes from 222.217.107.102: icmp_seq=4 ttl=56 time=57.5 ms
ただし、ホストでmacvlanにpingを実行すると、パケットがドロップされます。
[root@localhost ~]# ping 222.217.107.102
PING 222.217.107.102 (222.217.107.102) 56(84) bytes of data.
64 bytes from 222.217.107.102: icmp_seq=1 ttl=64 time=0.124 ms
ping: sendmsg: Invalid argument
64 bytes from 222.217.107.102: icmp_seq=3 ttl=64 time=0.049 ms
ping: sendmsg: Invalid argument
ping 127.0.0.1もパケットをドロップします:
[root@localhost ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
ping: sendmsg: Invalid argument
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.050 ms
ping: sendmsg: Invalid argument
ping: sendmsg: Invalid argument
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.061 ms
ping: sendmsg: Invalid argument
ping: sendmsg: Invalid argument
ping: sendmsg: Invalid argument
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
私のルーティングテーブルは大丈夫だと思います。他のPCpingは問題ありません。最新のLinuxカーネルは4294967295テーブルIDをサポートしており、32ビット長のrtnetlink属性RTA_TABLEとして実装されています。 https://bird.network.cz/pipermail/bird-users/2013-November/008706.html
327654: from 113.15.163.120 lookup 1429
327655: from 113.15.163.121 lookup 1511
327656: from 113.15.163.122 lookup 1522
327657: from 113.15.163.123 lookup 1186
327658: from 113.15.163.125 lookup 1513
327659: from 113.15.163.124 lookup 1190
327660: from all lookup main
327670: from all lookup default
linuxのデフォルトのarpテーブルは1000です。
net.ipv4.neigh.default.gc_thresh1 = 8192
net.ipv4.neigh.default.gc_thresh2 = 32768
net.ipv4.neigh.default.gc_thresh3 = 65536
1000 macvlanはarpを失う原因になるため、pingはドロップします。これらの行をsysctl.conf
に追加します。 sysctl -p
。