如何使用 iptables 將 HTTP 和 SSH 連接埠轉送到我的內部伺服器?

如何使用 iptables 將 HTTP 和 SSH 連接埠轉送到我的內部伺服器?

我沒有路由器,所以我把我的CentOS 6.4 Linux系統做成了路由器,將公網流量轉送到我的本地區域網路。它有兩個 NIC 卡,一個用於公共 IP 位址 (eth1),另一個用於專用 IP 位址 (eth2)。

我有一台連接到本地 LAN 的伺服器,假設位於192.168.1.2

路由器

  • eth1: x.x.x.x,公有IP位址
  • eth2: 192.168.1.1,內部路由器位址

當外部網路的某人在公共 IP 上運行 ssh 時,它應該被重定向到伺服器:

ssh x.x.x.x或使用油灰

我禁用了伺服器上的 SELinux 和 iptables 防火牆。我在Linux系統路由器上嘗試了一些iptables修改,但SSH請求仍然沒有重定向:

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22

我還想使用來自相同 Linux 系統路由器的 iptables 將所有 HTTP (80) 流量轉送到我的內部伺服器。

答案1

首先確保內核中啟用了資料包轉發

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

您也可以透過新增以下行來使其永久化/etc/sysctl.conf

net.ipv4.ip_forward = 1

您必須在充當路由器的 Linux 機器上執行此操作。您可以在路由器機器上嘗試以下規則。

iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j  DNAT --to-destination 192.168.1.2:22

也請讓我們知道路由器盒中 NAT 規則的輸出。

iptables -t nat -L -n -v

答案2

基於這個驚人的數位海洋關於如何轉發連接埠的教程,我決定在這裡重新寫一下。

我花了很多時間研究它是如何運作的。 我是 Linux 新手,開始並不總是那麼容易。

防火牆伺服器(2 個 NIC 卡)- 網路詳細資訊:

  • 公有IP位址:xx.xx.xx.xx
  • 私有IP位址:yy.yy.yy.yy
  • 公共介面:乙太網路0
  • 私有介面:乙太網路1

內部的(例如 ssh、web)伺服器(1 個網卡)- 網路詳細資訊:

  • 私有IP位址:zz.zz.zz.zz
  • 私有介面:乙太網路0

解決方案:

在核心中啟用資料包轉送:

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

定義變數:

# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"

# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"

# Services:
SSH="22"
HTTP="80"

Iptables 連接埠轉送(使用 -m conntrack):

iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip

幾點注意事項:

  • 「..-s $ADMIN -d $FW_eth0_ip ..」(第一行)- 僅出於安全原因添加 - 這意味著只有 ADMIN IP 可以存取 SSH(如果不需要,您可以將其刪除)
  • -m 連線是相同的-m狀態
  • 我建議將 SSH 的預設端口更改為另一個端口,例如 1xxxx(在 /etc/ssh/sshd_config 中)
  • 查看TCP 和 UDP 連接埠號碼列表
  • 我使用連接埠 15xx1 存取防火牆伺服器上的 SSH,使用 15xxx2 存取內部伺服器

終端:

# access firewall server
$ ssh [email protected] -p 15xx1

# access internal server
$ ssh [email protected] -p 15xx2

有關使用規則的更多詳細資訊在提到的教程中有完美的描述。

這就是我的全部內容,希望對您有幫助。

答案3

雖然這個問題是關於 iptables 的,但如果你也執行了 FirewallD,這裡是如何存取內部網路的 HTTP。

首先在您的內部伺服器 FirewallD 中允許 http 流量:

# firewall-cmd --permanent --add-service=http

然後將外部ip的http流量轉送到內部ip的80埠:

# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11

SSH 服務也可以做同樣的事情。

答案4

首先,在Linux網關中啟用路由:

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

然後使用您的網路介面(即 eth1)和所需連接埠新增以下規則:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

使用 檢查您的規則iptables -L -v,pkts 和 bytes 欄位將顯示正在符合的規則。

相關內容