将端口 22 转发到特定接口

将端口 22 转发到特定接口

我所处的情况是,我们在一台特定的机器上有三个独立的接口。每个连接的网络仅允许服务器(通过基于网络的路由/防火墙)仅提供特定服务。显然,客户端可以从各种子网进行连接,我依靠网络防火墙对其进行访问控制。

管理接口允许 ssh 流量,但为了使客户端能够连接,必须将默认路由设置为管理网络上的网关。这可以解决 SSH,但会破坏仅允许通过生产接口使用的 HTTP 服务。第三个接口是备份接口,但该接口的所有流量都位于同一子网上。

路由表看起来像这样:

[root@xxxcpr2 ~]# ip route
10.19.1.0/24 dev eth0 proto kernel scope link src 10.19.1.10
10.18.29.0/24 dev eth1 proto kernel scope link src 10.18.29.25
192.168.5.0/24 dev eth2 proto kernel scope link src 192.168.5.35
default via 10.18.29.1 dev eth1

其中eth0为管理接口,eth1为生产接口,eth2为备份接口。

本质上,我想要达到的条件是任何和所有端口 22 流量的默认网关都从管理接口路由出去,但直接连接的子网之外的所有其他流量应从生产接口路由出去。本质上,我已经达到了我想要的 90%,我只是想为 SSH 流量添加一个例外。

我发现但我无法让它发挥作用。也许是我缺乏理解或者RHEL和Ubuntu之间存在一些差异。由于main表的默认网关已经设置为走出生产接口,所以我所做的是:

# echo 1 > /proc/sys/net/ipv4/ip_forward
# ip route add table 22 default via 10.19.1.1
# iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
# ip rule add fwmark 22 table 22
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.18.29.25
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.19.1.10

以我的思维方式(也许有人可以指出这是错误的)标记数据包并创建使用表 22 的规则应该可行(不知道为什么提到原始帖子,SNAT但为了完整性我尝试尽可能复制它)但除非我更改main表的默认路由,否则连接仍然超时。

基本上,在这一点上我需要有人指出我不理解或我忽略的地方。

答案1

对于传入的 ssh 连接(没有连接跟踪)

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 22

对于传出 ssh 连接(无连接跟踪)

iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 22

您应该能够使用--port而不是--dportand将它们组合起来--sport

使用连接跟踪可能是更好的做法,但上述规则应该可以帮助您继续下去。

答案2

一套更完整的防火墙规则,基于我对传入 ssh 流量的类似设置。

请确保在测试之前刷新任何现有的 iptables 规则。

iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m multiport --ports 22  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -m multiport --ports 22  -m state --state NEW  -j ACCEPT

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -N MarkThem -t mangle
iptables -t mangle -A OUTPUT -p tcp -m tcp -m multiport --ports 22  -j MarkThem
iptables -t mangle -A PREROUTING -p tcp -m tcp -m multiport --ports 22  -j MarkThem
# May need to filter out local LAN connections here.
# But try without filtering first.
# iptables -t mangle -A MarkThem  -s 10.18.29.0/24   -j RETURN
# iptables -t mangle -A MarkThem  -s 10.19.1.0/24   -j RETURN
# iptables -t mangle -A MarkThem  -s 192.168.5.0/24   -j RETURN
iptables -t mangle -A MarkThem  -j MARK --set-mark 22
iptables -t mangle -A MarkThem  -j CONNMARK --save-mark

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.18.29.25
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.19.1.10

注意我已明确设置规则以匹配端口 22 上的源或目标。一旦有某些功能正常运行,您可能会希望收紧防火墙规则。

测试传出 ssh 连接时,可能值得指定一个绑定地址,并可以-b选择查看它是否适用于源自管理地址的流量。

ssh -b 10.19.1.10[电子邮件受保护]

相关内容