在 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_*
应该可以完成工作。