选项 1 - 每个用户 iptables

选项 1 - 每个用户 iptables

我有一个具有 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。

相关内容