前提 : 前同事留下的環境有一部份的環境是給實驗室 (172.16.0.x) 用的,以及公司辦公室所使用的網段 (10.1.1.x) , 要換成新設備但搞半天用不起來.
想說在新 server 裝 Linux 然後 Routing 設定一下就可以了,但發現從 172.16.0.x 的網路是可以通往 10.1.1.x ,但 10.1.1.x Router 卻不認識 172.16.0.x,但我沒有辦法去設定公司的 Router 所以 GG 了.只能額外想辦法做,想到以前有用 server 設定成分享器給大家上網 就是要上網 – 3.5G 篇,方式應該也差不多.
所以解決方案就是在 Linux 下 同時設定 NAT + Routing,恩那 NAT + Routing 誰會先生效,因為 Routing 比較上層(決定封包要從哪個埠出去),所以會先生效,當 Routing 指定哪一個網路埠出去後,接著該埠會依據 NAT 的規則出去.
Note:
Windows 也有支援 IP Forwarding , Routing + NAT ,在 Windows 2016 的 Server Manager console / Add roles and features – Server Roles (點選 Remote Access) / Remote Access – Roles Services (點選 Routing).
所以規則是這樣,當有資料發出來的時候 Routing 會決定是從 172.16.0.x 還是 10.1.1.x 出去
- 如果是 172.16.0.x 就直接透過 172.16.0.3
- 而要去 10.1.1.x 的會透過 NAT 偽裝.
設定 NAT + Routing 步驟如下:
- 先來設定 NAT
打開 Linux 下 iptables 的 NAT.ubuntu 預設沒開啟 ip_forward (會將網路埠1的封包轉到網路埠2 ,一樣會把網路埠2轉到網路埠1) 首先編輯 /etc/sysctl.conf[root@benjr ~]# cat /proc/sys/net/ipv4/ip_forward
如果為 0 表示沒有啟動,須透過下面的方式來啟動.
[root@benjr ~]# vi /etc/sysctl.conf net.ipv4.ip_forward=1 net.ipv6.conf.default.forwarding=1 [root@benjr ~]# sysctl -p
NAT 的規則也很簡單,收到 172.16.0.0 的封包透過 eth0 (10.1.1.1) 偽裝 出去到
[root@benjr ~]# iptables -t nat -A POSTROUTING -s 172.16.0.0/255.255.0.0 -o eth0 -j MASQUERADE [root@benjr ~]# iptables -A FORWARD -s 172.16.0.0/255.255.0.0 -o eth0 -j ACCEPT [root@benjr ~]# iptables -A FORWARD -d 172.16.0.0/255.255.0.0 -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT
- 關於 Routing 設定
透過 route add 來新增 Routing 規則,至要是 172.16.0.0 的封包,透過 gateway 172.16.0.3 (eth1) 出去,如果是 10.1.1.0 (eth0) 則是透過 NAT.[root@benjr ~]# route add -net 172.16.0.0 netmask 255.255.255.0 gw 172.16.0.3 [root@benjr ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.0.0 172.16.0.3 255.255.255.0 UG 0 0 0 eth1 172.16.0.0 * 255.255.255.0 U 1 0 0 eth1 10.1.1.0 * 255.255.252.0 U 0 0 0 eth0 default 10.1.1.1 0.0.0.0 UG 0 0 0 eth0
位於 172.16.0.0 Clients 的 IP / netmask / gateway 設定必須為 IP/netmask – 172.16.0.x / 255.255.255.0 ,gateway – 172.16.0.3 ,我們可以用 DHCP 都先設定好.