我的问题是“如何将我的每个服务器的 NIC 绑定到单独的 IP?”
我的 Ubuntu 12.04 服务器有两个 NIC - 都连接到我的家庭局域网。
NIC 的设备名称是在 /etc/udev/rules.d/70-persistent-net.rules 中设置的。我将其命名为 lan0 和 lan1。(请参阅下文了解我的 70-persistent-net.rules)。
每个 NIC 都通过路由器上的 DHCP 正确获取其 IP 设置。IP 分配基于 dhcp 请求的 MAC。lan0 分配的 IP 为 172.23.80.1,而 lan1 分配的 IP 为 172.23.80.2。(请参阅下面的 ifconfig 输出和我的 /etc/network/interfaces)。
我的问题是,当我从另一台计算机通过 ssh 连接时,无论我在 ssh 调用中使用了什么 IP,我总是从同一个服务器 MAC 接收连接。
让我描述以下显示我的问题的实验。我在 Ubuntu 台式电脑上使用三个终端(term1、term2 和 term3)
术语1:
arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.0.1 ether 00:50:7f:9d:2d:30 C wlan0
172.23.80.1 (incomplete) wlan0
期限2:
ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686)
* Documentation: https://help.ubuntu.com/
Last login: Thu Aug 16 12:37:48 2012 from 172.23.128.11
me@FERMI:~$
术语1:
arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.0.1 ether 00:50:7f:9d:2d:30 C wlan0
172.23.80.1 ether 00:0d:61:22:3d:d6 C wlan0
术语3:
ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686)
* Documentation: https://help.ubuntu.com/
Last login: Thu Aug 16 13:37:12 2012 from 172.23.128.11
me@FERMI:~$
术语1:
arp -n
Address HWtype HWaddress Flags Mask Iface
172.23.80.2 ether 00:0d:61:22:3d:d6 C wlan0
172.16.0.1 ether 00:50:7f:9d:2d:30 C wlan0
172.23.80.1 ether 00:0d:61:22:3d:d6 C wlan0
从最后一个 arp 可以看出,两个 ssh 连接都由服务器上的单个 NIC 提供服务,尽管两个 ip 已分配给不同的 NIC。这是我的问题。
这是我的服务器配置:
me@FERMI:~$ ifconfig
lan0 Link encap:Ethernet HWaddr 00:0d:61:22:3d:d6
inet addr:172.23.80.1 Bcast:172.31.255.255 Mask:255.240.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1452 errors:0 dropped:0 overruns:0 frame:0
TX packets:496 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:113691 (113.6 KB) TX bytes:72934 (72.9 KB)
lan1 Link encap:Ethernet HWaddr 00:19:5b:68:93:57
inet addr:172.23.80.2 Bcast:172.31.255.255 Mask:255.240.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1103 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85747 (85.7 KB) TX bytes:684 (684.0 B)
Interrupt:22 Base address:0x9000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:700 (700.0 B) TX bytes:700 (700.0 B)
me@FERMI:~$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto lan0
iface lan0 inet dhcp
auto lan1
iface lan1 inet dhcp
me@FERMI:~$ cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# PCI device 0x1186:/sys/devices/pci0000:00/0000:00:1e.0/0000:03:02.0 (sundance)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:19:5b:68:93:57", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="lan1"
# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:03.0/0000:02:01.0 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:61:22:3d:d6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="lan0"
me@FERMI:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default OHM.UNIVERSE 0.0.0.0 UG 100 0 0 lan0
172.16.0.0 * 255.240.0.0 U 0 0 0 lan0
172.16.0.0 * 255.240.0.0 U 0 0 0 lan1
me@FERMI:~$ cat /proc/sys/net/ipv4/ip_forward
0
me@FERMI:~$ arp -n
Address HWtype HWaddress Flags Mask Iface
172.23.128.11 ether 00:18:de:02:f0:5c C lan0
172.16.0.1 ether 00:50:7f:9d:2d:30 C lan0
me@FERMI:~$ sudo ufw status
Status: inactive
答案1
您的 NIC 绑定到单独的 IP。问题在于默认路由。输出route
显示默认路由通过 lan0 NIC 进行。
ip route del default
要解决您的索赔,只需使用或删除默认路线route del default
。
但是之后,您将无法路由到网络外部。如果您愿意,可以创建两个子网,例如 172.23.80.0 和 172.23.81.0,然后通过ip route 172.23.80.0/24 via 172.23.80.1 dev lan0
和分别路由ip route 172.23.81.0/24 via 172.23.81.1 dev lan1
。例如
# /etc/network/interfaces
# 主网络接口
auto lan1
iface lan1 inet dhcp
post-up route del default
post-up ip route 172.23.81.0/24 via 172.23.81.1 dev lan1
也可能,但未经测试
路由删除默认
ip 路由通过 172.23.80.1 dev lan0 添加 172.23.80.1/32
ip 路由通过 172.23.80.2 dev lan1 添加 172.23.80.2/32
答案2
您可以使用iptables
强制更改发往连接计算机的数据包的传出 MAC/IP 地址。
答案3
所以,首先我想说一下我的iptables
技能不够扎实。但我相信@chronospoon 对@bersch 答案的不足之处的看法是正确的,尽管它看起来差不多了。
无论如何,我搜索了一下,发现LARTC(Linux 高级路由和流量控制)。这里有一份操作指南分割访问看起来它准确地解释了你想要什么。我引用一下:
第一个问题是如何路由通过特定提供商(比如提供商 1)传入的数据包的答案,然后再通过同一提供商传出。
让我们首先设置一些符号名称。让 $IF1 成为第一个接口的名称(上图中的 if1),让 $IF2 成为第二个接口的名称。然后让 $IP1 成为与 $IF1 关联的 IP 地址,让 $IP2 成为与 $IF2 关联的 IP 地址。接下来,让 $P1 成为提供商 1 的网关的 IP 地址,让 $P2 成为提供商 2 的网关的 IP 地址。最后,让 $P1_NET 成为 $P1 所在的 IP 网络,让 $P2_NET 成为 $P2 所在的 IP 网络。
可以创建两个附加路由表,例如 T1 和 T2。这些路由表添加到 /etc/iproute2/rt_tables 中。然后,您可以在这些表中设置路由,如下所示:
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2
没什么特别的,只需构建到网关的路由并通过该网关构建默认路由,就像在单个上游提供商的情况下所做的那样,但将路由放在每个提供商的单独表中。请注意,网络路由就足够了,因为它告诉您如何找到该网络中的任何主机,其中包括网关,如上所述。接下来,您设置主路由表。通过连接到该邻居的接口将事物路由到直接邻居是一个好主意。请注意“src”参数,它们确保选择了正确的传出 IP 地址。
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
然后,您对默认路线的偏好:
ip route add default via $P1
接下来,设置路由规则。这些规则实际上选择使用哪个路由表进行路由。如果您已经有相应的源地址,您需要确保路由出给定的接口:
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2
这组命令确保所有针对特定接口传入的流量的答案都从该接口得到答复。
警告
读者 Rod Roark 指出:“如果 $P0_NET 是本地网络,而 $IF0 是其接口,则需要以下附加条目:
ip route add $P0_NET dev $IF0 table T1
ip route add $P2_NET dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo table T1
ip route add $P0_NET dev $IF0 table T2
ip route add $P1_NET dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo table T2
'
现在,这只是最基本的设置。它将适用于路由器本身上运行的所有进程,以及本地网络(如果是伪装的)。如果不是,那么您要么拥有来自两个提供商的 IP 空间,要么想要伪装成两个提供商之一。在这两种情况下,您都需要添加规则,根据本地网络中机器的 IP 地址选择从哪个提供商路由出去。