當前場景如下
跳板機A是雙網卡,有一個內網IP和一個公網IP
內網IP: 10.0.10.30
外網IP: 58.68.255.123
內網機器:10.0.30.88,可以和10.0.10.30通訊
另外有一台內網機器需要通過公網去連接ssh,由於這台內網設備沒有公網IP所以需要跳板機通過Iptables做端口轉發
剛開始用的Iptbales做端口映射命令如下
iptables -t nat -A PREROUTING -p tcp -d 58.68.255.123 --dport 31688 -j DNAT --to-destination 10.0.30.88:22
iptables -t nat -A POSTROUTING -p tcp -d 10.0.30.88 --dport 22 -j SNAT --to-source 58.68.255.123
發現無法通過58.68.255.123:31688去ssh連接這台機器,試了好幾次都是如此,開始想是不是因為雙網卡原因
查看路由表后發現58.68.255.123並沒有到內網10.0.10.0的路由,大概就是這個原因了,iptables把請求轉發到內網10.0.30.88后,10.0.30.88跨網段了無法把包通過58.68.255.123轉發回客戶端就是連接這台機器的ssh客戶端,因為30.88無法回原,必須通過10.0.10.30轉發給58.68.255.123再轉發給客戶端,大概明白這個道理就該知道怎么做了。
iptables -t nat -A PREROUTING -p tcp -d 58.68.255.123 --dport 31688 -j DNAT --to-destination 10.0.30.88:22
iptables -t nat -A POSTROUTING -p tcp -d 10.0.30.88 --dport 22 -j SNAT --to-source 10.0.10.30
只是下一條命令變了而已,把回原地址更改為內網的了,這樣就可以在跳板機上把請求轉發給客戶端了。
或者用以下命令也可以
iptables -t nat -A PREROUTING -p tcp -i em1 --dport 31688 -j DNAT --to 10.0.30.88:22
iptables -t nat -A POSTROUTING -j MASQUERADE
效果是一樣的,需要指定網卡,em1為外網網卡
以上第一次命令不生效原因主要還是跨網段的原因,30跨到10,導致這個問題,如果公網IP轉發端口的這台機器內網IP也在30段,那么第一條命令是可以生效的。
iptables還是需要很多地方去學習研究的,寫下這篇日志,防止遺忘。