我有一个具有 5 个公共 IP 的网络接口。这些 IP 是工作正常为了传入交通。我需要做的是“强制”传出通过特定 IP 进行流量。
我还创建了一个简单的 REST 端点,如果您发出请求,它会在响应主体中告诉您您的 IP。例如 curl、fetch 或任何其他 HTTP 请求方法:
curl https://enosqoiqvbk6q22.m.pipedream.net
在实际场景中,我会看到来自不同进程的对相同 URL 的 HTTP 请求(以及 websocket,尽管这不太重要)。我希望按进程隔离这些请求(要么将每个进程置于不同的系统用户之下,要么在进程级别使用任何其他机制来执行此操作)。
Netplan 配置如下:
network:
version: 2
renderer: networkd
ethernets:
id0:
match:
macaddress: aa:aa:cb:4b:04:74
addresses:
- 123.123.12.102/29
- 123.123.12.103/29
- 123.123.12.104/29
- 123.123.12.105/29
- 123.123.12.106/29
gateway4: 123.123.12.101
nameservers:
addresses: [8.8.8.8,4.2.2.2]
ip address
返回以下内容:
# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether aa:aa:cb:4b:04:74 brd ff:ff:ff:ff:ff:ff
inet 123.123.12.102/29 brd 123.123.12.107 scope global eno1
valid_lft forever preferred_lft forever
inet 123.123.12.103/29 brd 123.123.12.107 scope global secondary eno1
valid_lft forever preferred_lft forever
inet 123.123.12.104/29 brd 123.123.12.107 scope global secondary eno1
valid_lft forever preferred_lft forever
inet 123.123.12.105/29 brd 123.123.12.107 scope global secondary eno1
valid_lft forever preferred_lft forever
inet 123.123.12.106/29 brd 123.123.12.107 scope global secondary eno1
valid_lft forever preferred_lft forever
inet6 fe80::7a2b:cbff:fe4b:474/64 scope link
valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether aa:aa:cb:4b:04:75 brd ff:ff:ff:ff:ff:ff
如果每个 IP 都有物理网络接口,我想我可以通过ip netns
绑定到每个接口来使用 IP 命名空间,ip netns exec ns_vlan02 ./someProcess
但似乎只有一个接口的选项。
我完全愿意为每个 IP 设置一个用户,或者在流程层面上这样做。我本质上是在利用我所拥有的资源寻找任何可行的途径。
我看到有人提到了 iptables,但似乎它假设进程 A 或用户 A 总是将请求发送到与进程 B 或用户 B 不同的域/ip。在我的场景中,请求将发送到相同的域/ip(就像开头的 pipedream URL 一样)。
编辑-迄今为止的发现:
选项 1 - 每个用户 iptables
https://serverfault.com/a/236724/621956
DNS 已损坏,但在设置规则时指定接口后似乎可以工作!
-o en1
选项 2 - 使用容器(lxd/docker)
可能会暴露对网络内部进程行为的其他控制,但令人担忧的是,这只会带来不必要的复杂性。如果 DNS 问题得到解决,则首选选项 1。
还有其他选择吗?
我该如何解决这个问题?谢谢!
答案1
你可能想看看 iptables-extensions(8):
iptables [-m name [module-options...]] [-j target-name [target-options...] ... owner This module attempts to match various characteristics of the packet creator, for locally generated packets. This match is only valid in the OUTPUT and POSTROUTING chains. Forwarded packets do not have any socket associated with them. Packets from kernel threads do have a socket, but usually no owner. [!] --uid-owner username [!] --uid-owner userid[-userid] Matches if the packet socket's file structure (if it has one) is owned by the given user. You may also specify a numerical UID, or an UID range. [!] --gid-owner groupname [!] --gid-owner groupid[-groupid] Matches if the packet socket's file structure is owned by the given group. You may also specify a numerical GID, or a GID range. [!] --socket-exists Matches if the packet is associated with a socket.
编辑:抱歉,我刚刚看到这是您的选项 1。