以非特权用户身份使用非默认路由

以非特权用户身份使用非默认路由

在 Ubuntu 16.04 上,IPv4 的默认路由是 eth0 以外的接口。

如果我尝试

curl -vvv --interface eth0 v4.ifconfig.co

我明白了

* SO_BINDTODEVICE eth0 failed with errno 1: Operation not permitted; will do regular bind

但如果我sudo它可以正常工作。

我该如何更改配置,以便在此非特权用户下运行的服务可以使用 eth0 进行 IPv4?我认为我不能只更改 sudo config 来允许这样做,因为我不希望服务以 root 身份运行任何内容。我还想在当前接口上保留 IPv4 的默认路由。

答案1

每个进程的路由假设用户为foo,eth0的IP地址为10.1.1.1,路由器的IP地址为10.1.1.254:

iptables -t mangle -A OUTPUT -m owner --uid-owner foo -j MARK --set-mark 42
iptables -t nat -A POSTROUTING -o eth0 -m mark --mark 42 -j SNAT --to-source 10.1.1.1
ip rule add fwmark 42 table 42
ip route add default via 10.1.1.254 dev eth0 table 42

您还需要sysctl net.ipv4.conf.eth0.rp_filter=0

答案2

尝试使用getcap/setcap并检查man 7 capabilities。对于你的情况,有些NET_CAP_*应该可以完成工作。

相关内容