linux 策略路由配置问题

abelguo 发布于 2015/12/01 21:02
阅读 464
收藏 0

大家好我在ubuntu12.04的系统下搭建策略路由出现里一些问题,希望的得到大家的帮助,问题具体如下:

我电脑上右三块网卡A,B,C,我希望从A端口进来的数据包通过策略路由分别从B和C口出去(B,C在同一子网内)例如:

A ip地址为:192.168.2.1  与A网卡连接的pc A1 ip地址为192.168.2.100

B ip地址为:192.168.3.201  与B网卡连接的pc B1 ip地址为192.168.3.101

C ip地址为:192.168.3.202 与B网卡连接的pc C1 ip地址为192.168.3.102

我希望从A1能够ping通B1,和C1,我电脑上没有这些网卡,我在电脑上使用虚拟网络模拟具体设置如下:

#!/bin/bash

create_link()
{
    ip link add veth1 type veth peer name veth1.2
    ip link add veth2 type veth peer name veth2.2
    ip link add veth3 type veth peer name veth3.2
    ifconfig veth1 192.168.3.201 up
    ifconfig veth2 192.168.3.202 up
    ifconfig veth3 192.168.2.1 up
    ifconfig eth0 192.168.3.201 up
    ip netns add net1
    ip netns add net2
    ip netns add net3
    ip link set veth1.2 netns net1
    ip link set veth2.2 netns net2
    ip link set veth3.2 netns net3
    ip netns exec net1 ifconfig veth1.2 192.168.3.101 up
    ip netns exec net2 ifconfig veth2.2 192.168.3.102 up
    ip netns exec net3 ifconfig veth3.2 192.168.2.100 up
    ip netns exec net3 route add -net 0.0.0.0/0 gw 192.168.2.1 dev veth3.2
    ip route add 192.168.3.0/24 via 0.0.0.0 dev veth1 table 1
    ip route add 192.168.3.0/24 via 0.0.0.0 dev veth2 table 2
    ip rule add fwmark 1 table 1
    ip rule add fwmark 2 table 2

}
set_iptables()
{
    iptables -t raw   -A  PREROUTING  -s 192.168.2.0/24 -j TRACE
    iptables -t mangle -I PREROUTING  -d 192.168.3.101 -j MARK --set-mark 1
    iptables -t mangle -I PREROUTING  -d 192.168.3.102 -j MARK --set-mark 2
#    iptables -t nat    -I PREROUTING  -d 192.168.4.0/24 -j DNAT --to-destination 192.168.3.102
    iptables -t nat    -I POSTROUTING  -s 192.168.2.0/24 -j MASQUERADE
}
set_sys()
{
    sysctl -w net.ipv4.ip_forward=1
    sysctl -w net.ipv4.conf.all.arp_announce=2
    sysctl -w net.ipv4.conf.all.arp_ignore=1
}
main()
{
    set_sys;
    create_link;
    set_iptables;
}
main

当我使用 ip netns exec net3 ping 192.168.3.101 -c 1时能够ping通,使用dmesg的关键信息如下:

abelguo@linux604:~$ sudo ip netns exec net3 ping 192.168.3.101 -c 1
PING 192.168.3.101 (192.168.3.101) 56(84) bytes of data.
64 bytes from 192.168.3.101: icmp_req=1 ttl=63 time=0.603 ms

--- 192.168.3.101 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.603/0.603/0.603/0.000 ms
abelguo@linux604:~$ dmesg
[ 1283.442680] TRACE: raw:PREROUTING:policy:2 IN=veth3 OUT= MAC= SRC=192.168.2.1 DST=224.0.0.251 LEN=67 TOS=0x00 PREC=0x00 TTL=255 ID=4680 DF PROTO=UDP SPT=5353 DPT=5353 LEN=47
[ 1283.442700] TRACE: mangle:PREROUTING:policy:3 IN=veth3 OUT= MAC= SRC=192.168.2.1 DST=224.0.0.251 LEN=67 TOS=0x00 PREC=0x00 TTL=255 ID=4680 DF PROTO=UDP SPT=5353 DPT=5353 LEN=47  
[ 1286.332135] TRACE: mangle:PREROUTING:policy:3 IN=veth3 OUT= MAC=0e:4c🇧🇧73:0f🇧🇫ca:c4:2b:88:a0:a8:08:00 SRC=192.168.2.100 DST=192.168.3.101 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=42612 DF PROTO=ICMP TYPE=8 CODE=0 ID=2813 SEQ=1 MARK=0x1
[ 1286.332485] TRACE: mangle:POSTROUTING:policy:1 IN= OUT=veth1 SRC=192.168.2.100 DST=192.168.3.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=42612 DF PROTO=ICMP TYPE=8 CODE=0 ID=2813 SEQ=1 MARK=0x1
[ 1286.332499] TRACE: nat:POSTROUTING:rule:1 IN= OUT=veth1 SRC=192.168.2.100 DST=192.168.3.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=42612 DF PROTO=ICMP TYPE=8 CODE=0 ID=2813 SEQ=1 MARK=0x1
[ 1286.332568] [UFW BLOCK] IN=veth1 OUT=veth3 MAC=f2:c1:5f:45:61:61:8a:72:26:80:01:64:08:00 SRC=192.168.3.101 DST=192.168.2.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=41711 PROTO=ICMP TYPE=0 CODE=0 ID=2813 SEQ=1
可以看到包在mangle表中的prerouting 中确实被标记里,并且在正确的端口出去。

当我使用 ip netns exec net3 ping 192.168.3.102 -c 1时却无法ping通,使用dmesg的关键信息如下:

abelguo@linux604:~$ sudo ip netns exec net3 ping 192.168.3.102 -c 1
PING 192.168.3.102 (192.168.3.102) 56(84) bytes of data.

--- 192.168.3.102 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

abelguo@linux604:~$ dmesg
[ 1936.250242] TRACE: raw:PREROUTING:policy:2 IN=veth3 OUT= MAC=0e:4c🇧🇧73:0f🇧🇫ca:c4:2b:88:a0:a8:08:00 SRC=192.168.2.100 DST=192.168.3.102 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=48798 DF PROTO=ICMP TYPE=8 CODE=0 ID=2942 SEQ=1
[ 1936.250283] TRACE: mangle:PREROUTING:rule:1 IN=veth3 OUT= MAC=0e:4c🇧🇧73:0f🇧🇫ca:c4:2b:88:a0:a8:08:00 SRC=192.168.2.100 DST=192.168.3.102 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=48798 DF PROTO=ICMP TYPE=8 CODE=0 ID=2942 SEQ=1
[ 1936.250304] TRACE: mangle:PREROUTING:policy:3 IN=veth3 OUT= MAC=0e:4c🇧🇧73:0f🇧🇫ca:c4:2b:88:a0:a8:08:00 SRC=192.168.2.100 DST=192.168.3.102 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=48798 DF PROTO=ICMP TYPE=8 CODE=0 ID=2942 SEQ=1 MARK=0x2
[ 1936.250676] TRACE: mangle:POSTROUTING:policy:1 IN= OUT=veth2 SRC=192.168.2.100 DST=192.168.3.102 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=48798 DF PROTO=ICMP TYPE=8 CODE=0 ID=2942 SEQ=1 MARK=0x2
[ 1936.250691] TRACE: nat:POSTROUTING:rule:1 IN= OUT=veth2 SRC=192.168.2.100 DST=192.168.3.102 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=48798 DF PROTO=ICMP TYPE=8 CODE=0 ID=2942 SEQ=1 MARK=0x2
确实也是显示包从veth2出去但是却无法ping通

此时的默认路由表为:

192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 veth3
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 veth1
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 veth2
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

且使用ip netns exec net2 ping 192.168.3.202 也无法ping通
如果我把路由表  veth1那条去掉确实走veth2的可以ping通,我怀疑是不是在ping包返回是出现的什么问题,但是没有头绪。希望高手能给点意见



加载中
返回顶部
顶部