使用 iptables 阻止传出连接

Nil*_*ils 7 firewall iptables centos

我有一台(非生产)机器,外部支持者可以在其中访问 shell(非 root)。我想阻止他们使用 iptables 从那台机器进一步进入我们的网络。

“正常”防火墙 GUI 仅阻止传入流量。如何设置诸如“接受所有传入流量(加上响应),但仅允许特定目标的新传出流量(例如到监控服务器的 snmp-traps)”之类的规则?

操作系统是 CentOS 5

Gil*_*il' 8

假设您只想接受传入 TCP 流量,您可以使用这些规则将传出流量限制为已建立的 TCP 连接(必须从外部发起)和 LAN 外部的 IP 地址:

iptables -A INPUT -p tcp -i lo -j ACCEPT
iptables -A INPUT -p tcp -p 22 -j ACCEPT   # repeat for other ports you want to allow
iptables -P INPUT -j DENY
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp \! -d 10.0.0.0/8 -j ACCEPT  # replace by your LAN's network(s)
iptables -A OUTPUT -p tcp \! --syn -j ACCEPT
iptables -P OUTPUT -j DENY
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您可能更愿意将一些规则专门应用于支持者执行的流程。假设他们在supporters组中,以下规则将拒绝支持者(并且仅支持者)在您的 LAN 内的所有连接(传入或传出):

iptables -I INPUT \! -i lo -s 10.0.0.0/8 -m owner --gid-owner supporters -j DENY
iptables -I OUTPUT \! -o lo -d 10.0.0.0/8 -m owner --gid-owner supporters -j DENY
Run Code Online (Sandbox Code Playgroud)

请注意,gid-owner测试进程的fsgid,它几乎总是有效的 GID。除非进程运行setgid或将其有效 GID 切换到补充组,否则将应用用户的主要组(记录在用户数据库中,例如/etc/passwd)。


jor*_*anm 5

除了您明确定义为 ACCEPT 的流量外,有两种方法可以丢弃所有传出流量。第一个是将 OUTPUT 链的默认策略设置为丢弃。

iptables -P OUTPUT DROP
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是当链被刷新(所有规则删除)时,所有出站流量都将被丢弃。另一种方法是在链的末尾放置一个“毯子”DROP 规则。

iptables -A OUTPUT -j DROP
Run Code Online (Sandbox Code Playgroud)

在不确切知道您需要什么的情况下,我无法就接受什么提供建议。我个人使用将默认 DROP 规则放在链的末尾的方法。您可能需要调查您的 GUI 如何设置规则,否则它可能与传统的 CLI 启动时恢复规则的方式(例如 /etc/sysconfig/iptables)相冲突。