
我沒有路由器,所以我把我的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 欄位將顯示正在符合的規則。