我所处的情况是,我们在一台特定的机器上有三个独立的接口。每个连接的网络仅允许服务器(通过基于网络的路由/防火墙)仅提供特定服务。显然,客户端可以从各种子网进行连接,我依靠网络防火墙对其进行访问控制。
管理接口允许 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
而不是--dport
and将它们组合起来--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[电子邮件受保护]