iptables實現內外網端口映射及轉發上網


前兩天在工作中遇到一個需求,某192.168.1.0/24內網網段內只有一台主機A連接到了公網,A的兩塊網卡分別有一個公網地址(123.234.345.456)和一個內網地址(192.168.1.10),現需要內網的另一台主機B(192.168.1.77)連接到互聯網下載某些東西,同時將B的某服務端口開放到公網上,兩台主機的系統均為CentOS7。

主要參考了https://www.cnblogs.com/ssgeek/p/9220680.html 和 https://blog.csdn.net/light_jiang2016/article/details/79029661 兩篇文章,事實證明並不需要改路由表等操作,簡單幾條命令即可完成我們的需求。

解決思路為使用iptables的轉發功能,當然CentOS7自帶了firewalld防火牆也有轉發功能,但因為配置內網轉接公網也需要通過iptables進行,這里就都使用iptables(CentOS7無需安裝和啟用iptables.service,我們只是用到了iptables命令)。

首先查看B主機的網卡

[root@~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 20:04:0f:f5:25:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.77/24 brd 192.168.1.255 scope global noprefixroute em1
       valid_lft forever preferred_lft forever
    inet6 fe80::2204:fff:fef5:25c0/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

編輯網卡ens1的配置文件

[root@r740 redis]# vi /etc/sysconfig/network-scripts/ifcfg-ens1

TYPE=Ethernet
PROXY_METHOD=none
BOOTPROTO=static   #也可以設置為dhcp,具體看路由器是否開啟了dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
NAME=ens1
UUID=531a7963-406d-4e4d-b949-efe5d55d6cc
DEVICE=ens1
ONBOOT=yes
IPADDR=192.168.1.77
PREFIX=24
GATEWAY=192.168.1.10 #重點在這里,網關要設成主機A的內網地址
DNS1=114.114.114.114
~                                                                                                                                                              
~                                                                                                                                                              
~  

:wq保存修改,然后重啟網絡服務

systemctl restart network

systemctl restart NetworkManager  #如果安裝了圖形界面,network會被NetworkManager代替

之后回到A主機,開啟A的內核轉發

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf && sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.1.77 -j MASQUERADE    #進行ip偽裝,對來源為192.168.1.77的主機數據報進行轉發,如果改為192.168.1.0/24,則對整個內網網段的主機都進行轉發

OK,現在在主機B ping一個公網網址,發現已經可以ping通了。

 


將以下代碼保存成shell腳本,執行,即可開啟對應端口的公網映射

#!/bin/bash
pro='tcp'

src_host='123.234.345.456' #主機A的公網地址
src_port=16379  #在主機A上要映射的端口

Dst_Host='192.168.1.77'  #主機B的內網地址
Dst_Port=6379  #在主機B上要映射過去的端口

# 清空規則(如果自己以前定義過規則,比如上文的轉發規則,則慎用!)
#iptables -F
#iptables -X
#iptables -Z
#iptables -t nat -F

# Destination network  address translate (dnat)

iptables -t nat -A PREROUTING  -p $pro -d $src_host  --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port

iptables -A FORWARD -p $pro -d $Dst_Host --dport $Dst_Port -j ACCEPT

# 本地連接不經過prerouting,只經過output鏈,所以想要在服務器A通過本地ip訪問服務器B需要在output 鏈增加dnat規則

iptables -t nat -A OUTPUT -p $pro -d $src_host --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port

在主機B運行redis服務后,掃描123.234.345.456的13679端口,發現已經是開啟狀態,端口轉發成功。

如果希望持久化配置

iptables-save > /etc/sysconfig/iptables

將新加規則寫入到配置文件中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM