[Linux] iptables ip/port forwarding

  • OS: Ubuntu-14.04.4-server-amd64

本機 Port A 轉送到本機 Port B

為了方便操作,先切換為 root

1
sudo su -

將 tcp port 20022 的封包轉送到本機的 port 22

1
sudo iptables -t nat -A PREROUTING -p tcp --dport 20022 -j REDIRECT --to-port 22

也可以使用 -i 參數指定網路卡 (interface),指定網路卡 eth0

1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20022 -j REDIRECT --to-port 22

本機 Port 轉送到其他主機 Port

此操作類型必須先開啟 ip forward。

情境設定

  • 主機 A IP: 192.168.0.253 (設定將 port 20022 封包轉送到主機 B 的 port 22)
  • 主機 B IP: 192.168.0.1 (SSH server 執行中,監聽 port 22)
  • 主機 C IP: 192.168.0.2 (測試轉送結果用的主機)

主機 A 操作

一樣為了方便操作,先切換為 root

1
sudo su -

啟用 ip forward

1
2
3
4
5
# 啟用 ip forward,立刻生效 (重開機會消失)
sysctl net.ipv4.ip_forward=1

# 設定網路卡啟動時時自動啟用 ip forward,重開機就不是問題
echo 'pre-up sysctl net.ipv4.ip_forward=1' >> /etc/network/interfaces

直接 echo 1/proc/sys/net/ipv4/ip_forward 也是一種立刻啟用的方式,個人習慣用 systemctl

1
echo 1 > /proc/sys/net/ipv4/ip_forward

轉送 tcp port 20022 收到的封包到主機 B 的 port 22

1
2
iptables -t nat -A PREROUTING -p tcp --dport 20022 -j DNAT --to 192.168.0.1:22
iptables -t nat -A POSTROUTING -p tcp --dport 22 --dst 192.168.0.1 -j MASQUERADE

主機 C 操作

使用 Netcatnc 指令測試主機 A 的 port 20022 是否為啟用中的狀態:

1
nc -zv 192.168.0.253 20022

如果設定沒問題的話應該會得到回應:

1
Connection to 192.168.0.253 20022 port [tcp/*] succeeded!

這時候使用 SSH 指定連線到連線主機 A 的 port 20022,實際會登入到主機 B。

實際上主機 A 沒有服務在使用 port 20022,但是因為我們設定了 iptables 做 port forward,所以這個封包並沒有進到 server,而是直接被轉送到 主機 B。同時主機 B 回傳的封包也會透過主機 A 傳到主機 C。主機 A 透過 POSTROUTING 的規則,把封包傳回主機 A。

開機後重新載入設定

因為自定義的 iptables rules 在重開機之後就會消失,所以要使用以下指令保存設定。

1
iptables-save > /etc/network/iptables.rules

重開機後設定消失,可以透過以下指令復原規則:

1
iptables-restore < /etc/network/iptables.rules

如果要設定為開機時自動復原的話,把上面的指令加入 /etc/network/interfaces 這個檔案:

1
echo 'pre-up iptables-restore < /etc/network/iptables.rules' >> /etc/network/interfaces

這樣一來重開機時,轉送設定會在網路卡啟動時一併載入

comments powered by Disqus