前兩天在工作中遇到一個需求,某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
將新加規則寫入到配置文件中。