根据 UID 选择网关 (Linux)

根据 UID 选择网关 (Linux)

我有两个 NIC 和两个 IP。如何设置路由,使所有内容都通过第一个 IP 发送,但特定(本地)用户的流量除外,该用户的流量通过第二个 IP 发送?

我知道有一些 HOWTO,但是在过去的三天里我无法成功使用它们。

我喜欢这个http://www.debian-administration.org/article/379/Policy_routing文章最好的,我的情况唯一的区别是我不处理 PPP 连接,我有两个以太网接口。

设置完一切后(?),可以在 wireshark 中看到给定本地用户的网络浏览流量,SYN ACK 返回到正确的 IP 和接口,但浏览器没有应答。

请帮忙。

- -整个故事 - -

使用全新安装的 Ubuntu 10.10 进行测试,两个连接是:

eth0: ip=192.168.168.236 gw=192.168.168.1
wlan0: ip=192.168.2.12 gw=192.168.2.1
nameserver is 192.168.168.1

防火墙开始时是空的(即没有规则),所有策略都被接受。

root@kipkopp:~# ip rule list
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
root@kipkopp:~# ip route show
192.168.2.0/24 dev wlan0  proto kernel  scope link  src 192.168.2.12  metric 2 
192.168.168.0/24 dev eth0  proto kernel  scope link  src 192.168.168.236  metric 1 
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.168.1 dev eth0  proto static 

root@kipkopp:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
100 copyofmain
101 new

(建立主表的副本,新表是空的)

root@kipkopp:~# ip route show table copyofmain
192.168.2.0/24 dev wlan0  proto kernel  scope link  src 192.168.2.12  metric 2 
192.168.168.0/24 dev eth0  proto kernel  scope link  src 192.168.168.236  metric 1 
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.168.1 dev eth0  proto static 

root@kipkopp:~# iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 1
root@kipkopp:~# ip rule add fwmark 1 pri 100 table copyofmain
root@kipkopp:~# ip rule add from 192.168.168.236 pri 200 table copyofmain
root@kipkopp:~# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source=192.168.168.236

尝试以 uid=1001 浏览网站一切正常。

(构建“新”表)

root@kipkopp:~# ip route show table new
192.168.2.0/24 dev wlan0  proto kernel  scope link  src 192.168.2.12  metric 1 
192.168.168.0/24 dev eth0  proto kernel  scope link  src 192.168.168.236  metric 2 
169.254.0.0/16 dev wlan0  scope link  metric 1000 
default via 192.168.2.1 dev wlan0  proto static 

root@kipkopp:~# ip rule add from 192.168.2.1 pri 200 table new
root@kipkopp:~# iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to-source=192.168.2.12

root@kipkopp:~# ip rule show
0:  from all lookup local 
100:    from all fwmark 0x1 lookup copyofmain 
200:    from 192.168.168.236 lookup copyofmain 
200:    from 192.168.2.12 lookup new 
32766:  from all lookup main 
32767:  from all lookup default 

Uid 1001 仍然使用 copyofmain 表,并且能够上网。

root@kipkopp:~# ip rule delete from all fwmark 0x1 lookup copyofmain
root@kipkopp:~# ip rule add fwmark 1 pri 100 table new

root@kipkopp:~# ip rule list
0:  from all lookup local 
100:    from all fwmark 0x1 lookup new 
200:    from 192.168.168.236 lookup copyofmain 
200:    from 192.168.2.12 lookup new 
32766:  from all lookup main 
32767:  from all lookup default 

Uid 1001 无法再浏览。

root@kipkopp:~# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter 
root@kipkopp:~# echo 0 > /proc/sys/net/ipv4/conf/wlan0/rp_filter 

root@kipkopp:~# ip route flush cache

没提升。

我在主表中更改了默认路由:

root@kipkopp:~# ip route delete default via 192.168.168.1 dev eth0  proto static
root@kipkopp:~# ip route add default via 192.168.2.1 dev wlan0  proto static

Uid 1001 和其他用户一样,很高兴地浏览。

答案1

看起来使用ip rule更简单,而且效果很好

第一的

你当然有一个网关

第二

创建自定义表

echo '1000 mytable' >> /etc/iproute2/rt_tables

或使用vim更安全

第三

sudo ip rule add uidrange 1000-1000 lookup mytable
  • 我们可以通过运行id命令来检查UID
  • number-number 是格式,对于单个用户可以相同

最后

为自定义表“mytable”设置默认路由

sudo ip route add default via <gateway> dev <interface-of-gateway> proto static

相关内容