Wednesday, February 5, 2014

用 iptables 手動做 3G 版本的 IP 分享器

環境配置與需求
  • 本文於作業系統 CentOS 5.8 底下驗證
  • 具備 3G Modem 以及 SIM 卡 (這是一定要的咩)
  • 3G 撥號軟體 wvdial
  • Linux 封包過濾軟體 iptables
以下將針對關鍵的軟體部分做說明以及分享:

3G 撥號軟體 wvdial

首先要能確保您的電腦能夠順利撥接,而在 Linux 底下有一套 wvdial 似乎蠻受推崇的,安裝方式以及設定都算簡單。

安裝 wvdial
yum install wvdial
我的 /etc/wvdial.conf 設定檔 
[Dialer Defaults]
Enable = yes
Modem = /dev/ttyACM0
Baud = 460800
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ISDN = 0
Modem Type = USB Modem
Phone = *99#
Username = none
Password = none
Linux 封包過濾軟體 iptables

使用 iptables 做 NAT 後,讓內網的電腦設備都透過前步驟的 3G 網卡出去,即可達到製作 3G 版的 IP 分享器之需求。

修改 /etc/sysctl.conf
net.ipv4.ip_forward = 1 // 原本為 0

設定 iptables 做 SNAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j SNAT --to :111.80.88.126

  • -t nat (nat table)
  • -A (append)
  • POSTROUTING (post routing在路由之後進行)
  • ppp0 (設備上的3G網卡裝置名稱)
  • -o (output) 
  • -s (source)
  • 192.168.182.0/24 (內網IP,其中 /24 可省略或做其他調整)
  • -j (jump)
  • SNAT (source NAT) 
  • --to (後面接對外IP)

查詢設定的指令
iptables -t nat -L

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  192.168.0.0/24       anywhere            to:111.80.88.126

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

延伸應用

由於每次 wvdial 撥接產生出來的對外 IP 不盡相同,所以前述指令就會要做些微調整,此 script 則會動態找尋目前的 3G 對外 IP 為何自動修正,如果把此指令加註在開機執行的 loop 內,即可達成開機後,自動成為 3G IP 分享器喔。

以下是分享動態產生的 script
IFACE=ppp0
FORWARD_IP_ADDR=192.168.0.0/24
IP_ADDR=`ifconfig ${IFACE} | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`

iptables -P INPUT ACCEPT
iptables -F
iptables -t nat -A POSTROUTING -s ${FORWARD_IP_ADDR} -o ${IFACE} -j SNAT --to ${IP_ADDR}

經過強者同事醍醐灌頂後,我們改為更便捷的方式,採用以下一行script就搞定
iptables -t nat -A POSTROUTING -j MASQUERADE
話說 iptables 還是有點博大精深,再來慢慢地要完整的理解整個流程才是。

補充指令

顯示目前防火牆規則
iptables-save
儲存防火牆規則
/etc/init.d/iptables save

參考資料

[1.] CentOS  做 NAT 
[2.] CentOS 6.2  架設 NAT
[3.] How to Find out the IP address assigned to eth0 and display IP only

No comments:

Post a Comment