这是网络图:
[External computer]---[Router]---[SSH server]
EXTERNAL NET <=|=> INTERNAL NET
路由器正在进行 SNAT 和端口转换:
#~ iptables -t nat -A POSTROUTING -o eth-external -j SNAT --to-source $EXT_ROUTER_IP
#~ iptables -t nat -A PREROUTING -i eth-external -p tcp --dport 2222 -j DNAT --to-destination $SSH_SERVER:22
这很有效,我可以从我的网络外部通过 ssh -p 2222 $ROUTER_IP 连接到 SSH 服务器。
当我将 FORWARD 的默认策略设置为 DROP 时,问题就出现了。
#~ iptables -P FORWARD DROP
从逻辑上来说,现在发往内部 SSH 服务器的数据包已被丢弃。
我正在尝试
#~ iptables -A FORWARD -i eth-external -o eth-internal -p tcp --dport 22 -j ACCEPT
#~ iptables -A FORWARD -o sth-external -i eth-internal -p tcp --dport 22 -j ACCEPT
没有工作。
#~ iptables -A FORWARD -i eth-external -o eth-internal -j ACCEPT
#~ iptables -A FORWARD -o sth-external -i eth-internal -j ACCEPT
作品。
但我不想允许这两个接口之间的所有流量,只允许 SSH 数据包。
有人能帮助我吗?
谢谢!
编辑:
最后我终于让它工作了......
#~ iptables -t nat -A PREROUTING -i eth-external -p tcp --dport 2222 -j DNAT --to-destination $SSH_SERVER:22
#~ iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
谢谢@davidgo
答案1
您不接受从端口 2222 返回端口 22 的流量。您需要以下行
iptables -A FORWARD -i eth-external -o eth-internal -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -o sth-external -i eth-internal -p tcp --dport 2222 -j ACCEPT
或者可能更好
iptables -A FORWARD -i eth-external -o eth-internal -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
它将响应入站请求来匹配出站数据包。