程式扎記: [Linux 文章收集] iptables 做路由器

標籤

2014年12月30日 星期二

[Linux 文章收集] iptables 做路由器

Source From Here 
Preface 
因為測試需要, Client 需要透過 Route 到達 Server: 
 

Build-up VM OS 
這邊使用 VMWare Workstation 建立 VM OS, 而 OS 選擇 CentOS 6.4 64bits 版本. 各個部份設定參考如下. 

Route VM 
Route 共需要三張網卡, UI 設定如下: 
 

因為 eth0 是 NAT, 故只剩下 eth1 與 eth2 需要設定. 請新增下面檔案: 
- /etc/sysconfig/network-scripts/ifcfg-eth1 
  1. DEVICE=eth1  
  2. HWADDR=00:0C:29:21:FC:4D  
  3. BOOTPROTO=static  
  4. NM_CONTROLLED=yes  
  5. ONBOOT=yes  
  6. IPADDR=10.5.0.6  
  7. NETMASK=255.255.255.0  
- /etc/sysconfig/network-scripts/ifcfg-eth2 
  1. DEVICE=eth2  
  2. HWADDR=00:0C:29:21:FC:57  
  3. BOOTPROTO=static  
  4. NM_CONTROLLED=yes  
  5. ONBOOT=yes  
  6. IPADDR=172.16.0.2  
  7. NETMASK=255.255.0.0  
上面設定的 HWADDR 請使用 ifconfig 命令觀察每個 eth? 的實際值後替換成對應的值. 接著使用下面命令使設定生效: 
# echo "1" > /proc/sys/net/ipv4/ip_forward // 啟動Linux的 ip 轉發功能
# ifup eth1
# ifup eth2
# ipconfig

接下來為了方便測試, 增加 Client 與 Server 的 ip 到 /etc/hosts 檔案中: 
# vi /etc/hosts
  1. ...  
  2. 10.5.0.7        client  
  3. 172.16.0.3      server  

Client VM 
Client 的 eth0 連接到 Vmnet2, 接著設定如下: 
# ifconfig // 確認 eth0 的 HWaddr
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 // 設定網卡資訊
  1. DEVICE=eth0  
  2. HWADDR=00:0C:29:8A:88:F6  
  3. BOOTPROTO=static  
  4. NM_CONTROLLED=yes  
  5. ONBOOT=yes  
  6. IPADDR=10.5.0.7  
  7. NETMASK=255.255.255.0  
# ifup eth0
# ifconfig // 確認設定生效
# route add default gw 10.5.0.6 // 設定 default gateway 指向 Route eth1 ip
route -n // 確認設定生效
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.5.0.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
0.0.0.0 10.5.0.6 0.0.0.0 UG 0 0 0 eth0

# vi /etc/hosts
  1. ...  
  2. 10.5.0.7        route  
  3. 172.16.0.3      server  
# ping server // Now server is unreachable!
...Destination Host Unreachable

Server VM 
Server 的 eth0 連接到 Vmnet3, 接著設定如下: 
# ifconfig // 確認 eth0 的 HWaddr
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 // 設定網卡資訊
  1. DEVICE=eth0  
  2. HWADDR=  
  3. BOOTPROTO=static  
  4. NM_CONTROLLED=yes  
  5. ONBOOT=yes  
  6. IPADDR=172.16.0.3  
  7. NETMASK=255.255.0.0  
# ifup eth0
# ifconfig // 確認設定生效
# route add default gw 172.16.0.2 // 設定 default gateway 指向 Route eth2 ip
route -n // 確認設定生效
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.0.0 0.0.0.0 255.255.0.0 U 1 0 0 eth0
0.0.0.0 172.16.0.2 0.0.0.0 UG 0 0 0 eth0

# vi /etc/hosts
  1. ...  
  2. 172.16.0.2      route  
  3. 10.5.0.7        client  
# ping client // Now client is unreachable!
...Destination Host Unreachable

Setup iptables as Router 
接著請在 Route machine 上進行如下設定: 
# iptables -t nat -A POSTROUTING -s 10.5.0.0/24 -o eth1 -j MASQUERADE // 設定只要 IP 是 10.5.0.0/24 就往 eth1 送
POSTROUTING:在通過Linux路由器之後做的策略,也就是路由器的外網接口
-s 192.168.1.0/24:源數據所來自這個網段,也可以是單個ip,不寫表示所有內網 ip
-o eth0 -j MASQUERADE:表示在eth0這個外網接口上使用IP偽裝
# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth2 -j MASQUERADE // 設定只要 IP 是 172.16.0.0/16 就往 eth2 送
# iptables -L -t nat // 確定設定生效
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.5.0.0/24 anywhere
MASQUERADE all -- 172.16.0.0/16 anywhere

...

接著進行如下測試, 首先開啟一個 terminal 並登入 Client 後執行 tcpdump -i eth0. 接著再開啟另一個 terminal 登入 Server: 
# ping client // 這次可以通了
PING client (10.5.0.7) 56(84) bytes of data.
64 bytes from client (10.5.0.7): icmp_seq=1 ttl=63 time=0.668 ms
64 bytes from client (10.5.0.7): icmp_seq=2 ttl=63 time=1.35 ms
64 bytes from client (10.5.0.7): icmp_seq=3 ttl=63 time=1.48 ms
...

此時回到剛剛 Client 開啟的 terminal 應該可以看到: 
...
14:34:15.579748 IP server > route: ICMP echo request, id 3877, seq 66, length 64
14:34:15.579799 IP route > server: ICMP echo reply, id 3877, seq 66, length 64
14:34:16.583181 IP server > route: ICMP echo request, id 3877, seq 67, length 64
14:34:16.583240 IP route > server: ICMP echo reply, id 3877, seq 67, length 64
14:34:17.589643 IP server > route: ICMP echo request, id 3877, seq 68, length 64
14:34:17.589691 IP route > server: ICMP echo reply, id 3877, seq 68, length 64
...

你會發現雖然是由 Server 在 ping Client, 但是 Client 看到的卻是 Route 的 IP, 這是因為 NAT (Network Address Translation) 造成的結果. 

Supplement 
AskUbuntu - Forwarding traffic between 2 interfaces 
Introduction to Linux Traffic Control 
Changing IP Addresses and Routes 
Red Hat Enterprise Linux 4 - FORWARD 與 NAT 規則

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!