![iptables 规则 - 使用 nat 表转发/伪装服务](https://linux22.com/image/786398/iptables%20%E8%A7%84%E5%88%99%20-%20%E4%BD%BF%E7%94%A8%20nat%20%E8%A1%A8%E8%BD%AC%E5%8F%91%2F%E4%BC%AA%E8%A3%85%E6%9C%8D%E5%8A%A1.png)
我需要在iptables
如下配置的网络(docker 容器)上完成一个练习:
router
具有 2 个网络接口(eth0 <- public 10.9.0.0/24
;;两个网络上eth1 <- lan 192.168.60.0/24
的)的主机和一个默认端口 22 上的 SSH 服务器;router
x.x.x.254
- 一个IP 为 的
jumpbox
主机,在默认端口 22 和 23 上使用 SSH 和 TELNET;lan
192.168.60.10
admin
具有public
IP 的主机10.9.0.2
。
jumbox
我们收到的请求之一是通过转发/伪装主机的 SSH(在端口 2222 上)和 TELNET 服务到router
主机admin
。
问题是我无法重定向这些端口,连接一直处于保持状态(我认为是因为返回数据包配置不正确)。
目前我的配置如下(请参阅ADMIN'S RULES
):
#!/bin/bash
# Reset IPv4 rules
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Set default policies for chains
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Allow loopback traffic
iptables -A INPUT -i lo -j ACCEPT
# Allow traffic for ongoing connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# ====================== #
# NAT INTERNAL NETWORK #
# ====================== #
# Masquerade internal network hosts
iptables -t nat -A POSTROUTING -s 192.168.60.0/24 -o eth0 -j MASQUERADE
# Forward internal network requests to external network
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# =============== #
# ADMIN'S RULES #
# =============== #
# Allow 'admin' connection to 'jumpbox' SSH (on 2222 port)
iptables -t nat -A POSTROUTING -s 192.168.60.10 -p tcp --sport 22 -j SNAT --to 10.9.0.254:2222
iptables -t nat -A PREROUTING -s 10.9.0.2 -p tcp --dport 2222 -j DNAT --to 192.168.60.10:22
iptables -A FORWARD -s 10.9.0.2 -p tcp --dport 22 -j ACCEPT
# Allow 'admin' connection to 'jumpbox' TELNET
iptables -t nat -A POSTROUTING -s 192.168.60.10 -p tcp --sport 23 -j SNAT --to 10.9.0.254
iptables -t nat -A PREROUTING -s 10.9.0.2 -p tcp --dport 23 -j DNAT --to 192.168.60.10
iptables -A FORWARD -s 10.9.0.2 -p tcp --dport 23 -j ACCEPT
有人能告诉我解决方案吗?
提前谢谢。
编辑:
经过多次尝试,我通过以下命令成功实现了我的目的:
# Allow 'admin' connection to 'jumpbox' SSH (on 2222 port)
iptables -t nat -A PREROUTING -s 10.9.0.2 -d 10.9.0.254 -p tcp --dport 2222 -j DNAT --to 192.168.60.10:22
iptables -A FORWARD -s 10.9.0.2 -d 192.168.60.10 -p tcp --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.60.10 -p tcp --dport 22 -j SNAT --to 192.168.60.254
# Allow 'admin' connection to 'jumpbox' TELNET
iptables -t nat -A PREROUTING -s 10.9.0.2 -d 10.9.0.254 -p tcp --dport 23 -j DNAT --to 192.168.60.10
iptables -A FORWARD -s 10.9.0.2 -d 192.168.60.10 -p tcp --dport 23 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.60.10 -p tcp --dport 23 -j SNAT --to 192.168.60.254
现在问题变成了,如果我尝试使用内部 IP 进行连接:
$ telnet 192.168.60.10 23 # or
$ ssh -p2222 192.168.60.10
我可以做到这一点,但是我必须阻止这种行为。
答案1
我能够通过以下规则实现我的目标:
# ...
# Allow 'admin' connection to 'jumpbox' SSH (on 2222 port)
iptables -t nat -A PREROUTING -s 10.9.0.2 -d 10.9.0.254 -p tcp --dport 2222 -j DNAT --to 192.168.60.10:22
iptables -A FORWARD -s 10.9.0.2 -d 192.168.60.10 -m conntrack --ctstate DNAT -p tcp --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.60.10 -p tcp --dport 22 -j SNAT --to 192.168.60.254
# Allow 'admin' connection to 'jumpbox' TELNET
iptables -t nat -A PREROUTING -s 10.9.0.2 -d 10.9.0.254 -p tcp --dport 23 -j DNAT --to 192.168.60.10
iptables -A FORWARD -s 10.9.0.2 -d 192.168.60.10 -m conntrack --ctstate DNAT -p tcp --dport 23 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.60.10 -p tcp --dport 23 -j SNAT --to 192.168.60.254