如何禁止用户在特定地址以外的其他地址绑定套接字?

如何禁止用户在特定地址以外的其他地址绑定套接字?

我希望不允许该用户在 Internet 接口上绑定端口(有效地创建全球可访问的服务器,尽管在端口 >1024 上),但允许在某些端口的环回接口上执行此操作。

是否有一个神奇的 iptables 技巧或者其他东西可以达到这种效果?

该服务器未运行 SELinux,并且现在设置它太过分了,因此如果有的话,我更喜欢其他解决方案。

答案1

我不认为强制套接字到特定端口的可能性,但您可以阻止其他端口被成功使用。这可以通过iptables及其owner模块来实现。您可以删除来​​自不允许地址的属于此用户的进程的所有回复。

如果这对您来说是一个选择,而您不知道如何操作,请告诉我,我会另外提供一些代码。

编辑1

解决方案是阻止来自该用户的每个属于

  1. 也不是该用户打开的连接(即他根本没有监听端口)
  2. 也不从允许的端口发送。

您说得对,owner在 INPUT 中不起作用,但我们只在 OUTPUT 中需要它。为了使事情变得更容易(和更快),我们将所有允许的数据包(来自此用户)标记为 42,所有不允许的数据包标记为 41。标记不允许的数据包就足够了。

它的工作方式如下:

  1. 来自该用户的所有数据包(连接)都被选中进行特殊处理
  2. 所有数据包都标有 41(不允许)。对于允许的连接,此标记稍后将被覆盖。
  3. 允许所有具有本地生成的第一个数据包的连接
  4. 剩下的一切都不是本地创建的。删除所有不是来自本地的
  5. 现在允许所有具有允许源端口(回复源即本地端口)的连接
  6. 最后一步:丢弃所有标有 41 的数据包。

编辑2

使用表格的方法nat失败了(对于传入连接,因为只签入连接的第一个数据包nat,并且第一个数据包是传入数据包,它只在模块不可用-t nat INPUT时命中owner)。因此,现在所有检查和标记都在默认表 ( filter) 中完成。

剧本:

#!/bin/bash

# MODIFY NEXT LINE
user=hl

# iptables -F
# iptables -t nat -F
# iptables -t mangle -F

iptables -N user_x &>/dev/null
iptables -N user_x_ports &>/dev/null
iptables -N user_x_allow &>/dev/null
iptables -N user_x_block &>/dev/null


# configure chain user_x_allow  
iptables -A user_x_allow -j CONNMARK --set-mark 42
iptables -A user_x_allow -j ACCEPT

# configure chain user_x_block
iptables -A user_x_block -j CONNMARK --set-mark 41
iptables -A user_x_block -j DROP

# configure chain user_x_ports
# one line for each allowed port  
iptables -A user_x_ports -p tcp --sport 1234 -j user_x_allow

# configure chain user_x
iptables -A user_x -m conntrack --ctstate NEW -j user_x_allow
iptables -A user_x \! -o lo -j user_x_block
iptables -A user_x -j user_x_ports
iptables -A user_x -j user_x_block

# the first two rules are just for checking what happens with "iptables -L -nv"
#       and can be commented out
index=1
iptables -I OUTPUT "$index" -m owner --uid-owner $user; ((index++)) # just count
iptables -I OUTPUT "$index" -m owner --uid-owner $user -m connmark --mark 0; ((index++)) # just count
iptables -I OUTPUT "$index" -m connmark --mark 41 -j DROP # or reset
((index++))
iptables -I OUTPUT "$index" -m connmark --mark 42 -j ACCEPT
((index++))
# this matches non-marked (new) connections only
iptables -I OUTPUT "$index" -m owner --uid-owner $user -j user_x
((index++))

相关内容