iptables 規則 - 使用 nat 表轉發/偽裝服務

iptables 規則 - 使用 nat 表轉發/偽裝服務

iptables我需要在配置如下的網路(docker 容器)上完成練習:

  1. 具有 2 個網路介面的主機routereth0 <- public 10.9.0.0/24; eth1 <- lan 192.168.60.0/24;在兩個網路上router都有x.x.x.254)和預設連接埠 22 上的 SSH 伺服器;
  2. jumpbox具有lanIP 的主機192.168.60.10,在預設連接埠 22 和 23 上具有 SSH 和 TELNET;
  3. admin具有publicIP 的主機10.9.0.2

jumbox向我們提出的請求之一是透過router主機轉送/偽裝主機的 SSH(在連接埠 2222 上)和 TELNET 服務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

相關內容