使用 IP 路由或 IP 表从特定源 IP 到特定目标 IP

使用 IP 路由或 IP 表从特定源 IP 到特定目标 IP

问题

我已经在我的 shell 上创建了不同的 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(或者 Mac Addr,我还不知道)的速度限制为 10Mbps,我正在研究如何绕过它以用于一个善意的项目。

我现在想要为每个 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

“-o eth0”正确吗?或者我应该写“-o eth0.1”?

我尝试过许多类似的命令但都没有成功或者至少我继续为所有连接保持 10Mbps 而不是每个连接保持 10Mbps(现在使用 IP 别名应该是这样的)。

答案1

在您的情况下,您不需要使用 macvlan。

  • 在单个接口上分配地址。别名是在同一接口上拥有多个地址的弃用方法。只有当您想为不同的 IP 地址分配不同的 MAC 地址时才需要 macvlan,但这会使路由配置变得复杂。
 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 
  • 您有两种方法可以将辅助地址用于特定目的地。您可以通过指定 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 的输出。您可以使用 wireshark 代替 tcpdump。:

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
  • 另一种方法是使用SNATiptables 中的目标。但是如果您有数百条类似的规则,它可能会影响性能。
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
  • 还有第三种使用特定源的方法。在某些应用程序中,您可以在配置文件中或使用命令行参数指定源。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 route一无所知iptables,只能使用目标 IP 地址。Iptables 可以在创建规则时解析域名,但其中的 IP 地址不会神奇地更新。有一些技巧可以避免此限制:
    • 修复与域名关联的 IP 地址。您可以使用文件/etc/hosts来执行此操作。此方法适合快速测试和具有长 TTL 的 DNS 记录。
    • 最灵活的方式:使用dnsmasqipsetiptables。在这种情况下,dnsmasq解析域名并将其 IP 地址存储到ipset列表中。您可以在iptables SNAT规则中使用这些列表。

相关内容