web-dev-qa-db-ja.com

特定の送信元IPから特定の宛先IPへのIPルートまたはIPテーブル

問題

シェルで次のように、すでに異なるIPエイリアスを作成しました(それぞれが異なる仮想Macアドレスを使用します)。

ip link add link eth0 address 00:11:11:11:11:11 eth0.1 type macvlan

ifconfig eth0.1 172.17.1.15/21 up

Eth0:1の代わりにeth0.1を使用しました。そうしないと、macvlanが機能しないためです。ただし、IPエイリアスがeth0:1のように記述されていることは知っています。

IPあたりの速度調整は10Mbpsに設定されており(またはMac Addr、まだわかりません)、意図的なプロジェクトのためにバイパスを検討しています。

私が今欲しいのは、ルーターの速度調整を研究するために、各IPエイリアスに特定の宛先を設定することです。これで、IP /接続ごとに10Mbpsになるはずです。

例えば:

ルーター:172.17.0.1/21

eth0> 172.17.1.14/21

eth0.1> 172.17.1.15/21

eth0.2> 172.17.1.16/21

アクセスするソースとしてeth0.1が必要です:URL(speedtest1Web)

そしてeth0.2にアクセスするソース:URL(speedtest2Web)

私が試してみました:

iptables -t nat -A POSTROUTING -p tcp -s 172.17.1.15 -o eth0.1 -j SNAT --to-source xxx.xxx.xxx.xxx

または

iptables -t nat -I POSTROUTING -o eth0 -d xxx.xxx.xxx.xxx/32 -s 10.255.0.127 -j SNAT --to-source 172.17.1.15

ここで、xxx.xxx.xxx.xxx = speedtest1Web

「-oeth0」は正しいですか?それとも「-oeth0.1」と書くべきですか?

私は多くの同様のコマンドを試しましたが成功しませんでした。少なくとも、接続ごとに10Mbpsではなく、すべての接続に10Mbpsを使用し続けました(IPエイリアスで現在想定されていること)。

1
Leñöine

あなたの場合、macvlanを使用する必要はありません。

  • 単一のインターフェースでアドレスを割り当てます。エイリアスは、同じインターフェース上に複数のアドレスを持つための非推奨の方法です。 macvlanが必要になるのは、さまざまなIPアドレスにさまざまなMACアドレスが必要な場合だけですが、ルーティングの構成が複雑になります。
 l1:~# ip link set up dev eth0
 l1:~# ip address add 172.17.1.14/21 dev eth0
 l1:~# ip address add 172.17.1.15/21 dev eth0
 l1:~# ip address add 172.17.1.16/21 dev eth0
  • eth0インターフェースのアドレスのリストを確認します。
 l1:~# ip -4 a ls dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 172.17.0.14/21 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.17.0.15/21 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet 172.17.0.16/21 scope global secondary eth0
       valid_lft forever preferred_lft forever
  • デフォルトルートとデフォルト送信元アドレスを追加し、構成を確認します。
l1:~# ip route add 0/0 via 172.17.0.1 src 172.17.0.14
l1:~# ip route list
default via 172.17.0.1 dev eth0 src 172.17.0.14 
172.17.0.0/21 dev eth0 proto kernel scope link src 172.17.0.14 
  • 特定の宛先にセカンダリアドレスを使用するには、2つの方法があります。 src属性を指定して、特定の宛先へのルートを追加できます。

172.17.0.15宛先の送信元アドレスとして192.168.10.2を使用します

l1:~# ip route add 192.168.10.2 via 172.17.0.1 src 172.17.0.15

172.17.0.16宛先の送信元アドレスとして192.168.11.2を使用します

l1:~# ip r add 192.168.11.2 via 172.17.0.1 src 172.17.0.16

ルーティングテーブルを確認します。

l1:~# ip r ls
default via 172.17.0.1 dev eth0 src 172.17.0.14 
172.17.0.0/21 dev eth0 proto kernel scope link src 172.17.0.14 
192.168.10.2 via 172.17.0.1 dev eth0 src 172.17.0.15 
192.168.11.2 via 172.17.0.1 dev eth0 src 172.17.0.16 

また、ip route getコマンドを使用して、特定の宛先の実際のルートを確認することもできます。

l1:~# ip route get 192.168.10.2
192.168.10.2 via 172.17.0.1 dev eth0 src 172.17.0.15 uid 0 
    cache 

同じコマンドの短いバージョンがあります:

l1:~# ip r g 192.168.11.2
192.168.11.2 via 172.17.0.1 dev eth0 src 172.17.0.16 uid 0 
    cache 

pingおよびtcpdumpで結果を確認します。ホストにpingを実行し、他のコンソールでtcpdumpの出力を確認します。 tcpdumpの代わりにwiresharkを使用できます。

l1:~# tcpdump -ni eth0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:21:07.972535 IP 172.17.0.14 > 172.17.0.1: ICMP echo request, id 23048, seq 0, length 64
10:21:07.974416 IP 172.17.0.1 > 172.17.0.14: ICMP echo reply, id 23048, seq 0, length 64
10:21:15.391709 IP 172.17.0.15 > 192.168.10.2: ICMP echo request, id 23304, seq 0, length 64
10:21:15.393515 IP 192.168.10.2 > 172.17.0.15: ICMP echo reply, id 23304, seq 0, length 64
10:21:18.207461 IP 172.17.0.16 > 192.168.11.2: ICMP echo request, id 23560, seq 0, length 64
10:21:18.209391 IP 192.168.11.2 > 172.17.0.16: ICMP echo reply, id 23560, seq 0, length 64
  • もう1つの方法は、iptablesでSNATターゲットを使用することです。ただし、同様のルールが何百もある場合は、パフォーマンスに影響を与える可能性があります。
l1:~# iptables -t nat -A POSTROUTING \
               -o eth0 --dst 192.168.10.2 \
          -j SNAT --to-source 172.17.0.15
l1:~# iptables -t nat -A POSTROUTING \
               -o eth0 --dst 192.168.11.2 \
          -j SNAT --to-source 172.17.0.16

iptables-saveiptables-applyを使用して、iptablesを安全に構成することをお勧めします。検証はルートの場合と同じです-pingtcpdumpを使用します。また、ルールカウンターをチェックして、それらのルールが機能することを確認できます。

l1:~# iptables-save -c -t nat
# Generated by iptables-save v1.6.2 on Wed May 15 10:31:26 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [4:336]
:POSTROUTING ACCEPT [0:0]
[2:168] -A POSTROUTING -d 192.168.10.2/32 -o eth0 -j SNAT --to-source 172.17.0.15
[2:168] -A POSTROUTING -d 192.168.11.2/32 -o eth0 -j SNAT --to-source 172.17.0.16
COMMIT
# Completed on Wed May 15 10:31:26 2019
  • 特定のソースを使用する3番目の方法があります。一部のアプリケーションでは、構成ファイルまたはコマンドライン引数を使用してソースを指定できます。 pingの場合、これは-Iオプションです。
l1:~# ping -c 2 -I 172.17.0.15 192.168.11.2
PING 192.168.11.2 (192.168.11.2) from 172.17.0.15: 56 data bytes
64 bytes from 192.168.11.2: seq=0 ttl=63 time=2.348 ms
64 bytes from 192.168.11.2: seq=1 ttl=63 time=1.270 ms

--- 192.168.11.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.270/1.809/2.348 ms
l1:~# tcpdump -ni eth0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:37:08.724723 IP 172.17.0.15 > 192.168.11.2: ICMP echo request, id 37384, seq 0, length 64
10:37:08.726805 IP 192.168.11.2 > 172.17.0.15: ICMP echo reply, id 37384, seq 0, length 64
10:37:09.724985 IP 172.17.0.15 > 192.168.11.2: ICMP echo request, id 37384, seq 1, length 64
10:37:09.726084 IP 192.168.11.2 > 172.17.0.15: ICMP echo reply, id 37384, seq 1, length 64
  • また、ip routeiptablesもドメイン名について何も知らず、宛先のIPアドレスしか使用できないことを知っておく必要があります。 Iptablesはルールの作成時にドメイン名を解決できますが、その中のIPアドレスは魔法のように更新されません。この制限を回避するためのいくつかのトリックがあります:
    • ドメイン名に関連付けられているIPアドレスを修正します。 /etc/hostsファイルを使用してそれを行うことができます。この方法は、TTLが長いクイックテストやDNSレコードに適しています。
    • 最も柔軟な方法:dnsmasqipset、およびiptablesの使用。この場合、dnsmasqはドメイン名を解決し、そのIPアドレスをipsetリストに保存します。これらのリストは、iptablesSNATルールで使用できます。
1
Anton Danilov