« 傳統吸水拖把使用心得 | 首頁 | iptables / route command notes »

2005年03月29日

Building Linux NAT with MRTG network monitoring

linux_inside.png 只要一台電腦、兩張網卡和簡單的幾個步驟, 就能用 Linux 自製 IP 分享器! 若是功力夠, 還能架起一部媲美高價 IP 分享器的 Linux NAT!

本篇是以 Fedora Core 3 來架設 Linux NAT 的範例, 完成示意圖請點選這裡.

環境說明:

  • ADSL 寬頻網路,  1 個固定 IP
  • 裝有兩張網路卡的 PC 乙台
  • 作業系統: Fedora Core 3 (取消防火牆設定)

以下設定步驟係依上述環境進行處理, 通用設定過程請連結參考資料.

Step 1: 確認需求套件, 關閉不需要的服務與埠口

  • iptables (防火牆、NAT 設置)
  • openssh-server (SSH daemon)
  • setup (TCPWrapper)
  • net-snmp (SNMP daemon)
  • mrtg (網路流量監視報表)
  • httpd (Web Server)

Linux NAT 機器建議只開放 ssh (TCP Port: 22), 並於 /etc/hosts.deny 設定:

sshd: ALL EXCEPT 192.168.1.

或使用 iptables 設定:

#iptables -A INPUT -d your_public_ip -p tcp --dport 22 -j DROP

只接受 192.168.1 內部網段使用者登入 sshd, 以策安全.

Step 2: Linux 網路設定 (以 eth0 接 LAN, eth1 接 WAN 為例)

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.254
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
TYPE=Ethernet

/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=static
IPADDR=your_public_ip
NETMASK=your_netmask
ONBOOT=yes
TYPE=Ethernet

/etc/sysconfig/network

NETWORKING=yes
HOSTNAME=your_hostname
GATEWAY=
your_gateway (外部 IP 的 GATEWAY)

Step 3: 設定 NAT (SNAT)  / DNAT (DMZ、Virtual Server)

設定 NAT
#modprobe ip_nat_ftp
#echo "1" > /proc/sys/net/ipv4/ip_forward
#iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j MASQUERADE

設立 Virtual Server (轉 port)
#iptables -t nat -A PREROUTING -p tcp -d your_public_ip --dport 80 -j DNAT --to-destination 192.168.1.100:80

設立 DMZ 端
#iptables -t nat -A PREROUTING -d your_public_ip -j DNAT --to-destination 192.168.1.100

以上可寫入 /etc/rc.d/rc.local 於每次開機時自動執行

Step 4: 設定 Client (以固定 IP 為例)

IP: 192.168.1.1
Netmask: 255.255.255.0
Gateway: 192.168.1.254
DNS: 168.95.1.1

該 Client PC 即可透過 Linux NAT 上網.
如不啟用 MRTG 網路流量監視報表, 可不繼續往下閱讀.

Step 5: 設定 / 啟用 snmpd

#vi /etc/snmp/snmpd.conf
將預設內容修改如下:

com2sec local localhost public
com2sec mynetwork 192.168.1.0/24 public
group MyRWGroup v1 local
group MyROGroup v1 mynetwork
view all included .1.3.6.1.2.1.1 80
access MyROGroup "" any noauth 0 all none none
access MyRWGroup "" any noauth 0 all all all
syslocation Fedora Core 3
syscontact someone <someone@mail.com.tw>

#chkconfig snmpd on
#service snmpd start

Step 6: 設定 / 啟用 mrtg

#mkdir /var/www/html/mymrtg

#cfgmaker --global 'WorkDir: /var/www/html/mymrtg' \
>--global 'Options[_]: bits,growright' \
>--global 'Language: big5' \
>--output /etc/mrtg/mrtg.cfg \
>--ifref=ip \
>192.168.1.254

如果 cfgmaker 出現錯誤訊息, 通常是 /etc/snmp/snmpd.conf 設定不正確所致, 建議回到上一步驟仔細檢查 snmpd.conf 的設定內容.

#indexmaker --output /var/www/html/mymrtg/index.html /etc/mrtg/mrtg.cfg

#mrtg /etc/mrtg/mrtg.cfg (重覆執行 3 次)

使用瀏覽器查看 MRTG 網頁: http://192.168.1.254/mymrtg/ (需先啟動 httpd)

請確定 /etc/cron.d/mrtg 或 /etc/crontab 是否有設置每五分鐘自動執行 mrtg, mrtg 報表才會自動更新


參考資料:


--- 2007.04.14 補充:

Posted by Jamyy at 2005年03月29日 16:13

Trackback Pings

TrackBack URL for this entry:
http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/64

Comments

我想問如果有一斷真 ip ,
應該怎樣設定呢 ?
因為我找了許多書都找不到答案 .

eth0 : 203.193.23.82 - 203.193.23.94
network 203.193.23.80
gateway = 203.193.23.81
broadcast = 203.193.233.95

eth1: 192.168.222.4
LAN 192.168.222.5 - 192.168.222.254
Server
e.g.
192.168.222.1 Web server port 80 ,443
( want top map to 203.193.233.92 )
192.168.222.2
192.168.222.3
192.168.222.4

多謝指點

Posted by: at 2005年06月23日 23:51

很抱歉, 關於您的問題, 其實我也沒試過
我會找個時間實驗看看
不曉得虛擬網卡 (eth0:0, eth0:1, eth0:2...)
是否能解決這個問題
您可以先試試看

Posted by: Jamyy at 2005年06月24日 11:08

我期待你的好消息.

其實我已在 /etc/sysconfig/network-scripts/
做了

ifcfg-eth0:01
ifcfg0eth0:02

等東西.

但暫時未用到 其他的真 ip

Posted by: 輝 at 2005年06月24日 11:51

呵呵, 實驗成功囉~
這樣的確是可行的 ^^

Posted by: Jamyy at 2005年06月24日 13:00

請問一張網卡可以嗎?
我第一次接觸本系統...
可以完整的教學一張網卡的設定嗎?

Posted by: 初學者 at 2006年10月22日 19:47

一張網卡也是可行的, 以下是一張網卡的應用實例:
(因為設定方式和本篇大同小異, 恕不詳加說明)

小烏龜、Linux NAT以及其他內部 PC 都接到 Switch Hub

由單張網卡的 Linux PPPoE ADSL 上網, 網卡為: eth0 (內部 IP), ppp0 (外部 IP) → ppp0 於 ppp 撥號上網後產生

設定 Linux NAT (與本篇的差異處):
1. 沒有 eth1 (因為只有一張網卡)
2. 不用設定 /etc/sysconfig/network 裡的 GATEWAY
3. -o eth1 改為 -o ppp0
4. -d your_public_ip 改為 -i ppp0

ps. -o 表示從某張網卡出去的封包; -i 表示從某張網卡進入的封包

至於 Linux 的 PPPoE 撥號方法, 請參考鳥哥的網頁: http://linux.vbird.org/linux_server/redhat6.1/linux_21internet.php

Posted by: Jamyy at 2006年10月23日 15:58

感謝囉!!
小弟我去試看看了~~

Posted by: 初學者 at 2006年10月30日 19:24

小弟我試了...可是我覺得我好像白痴喔!!
都看不太懂ㄝ~~
想說手邊有台淘汰的電腦拿來架設Linux當做IP分享器
可是好像很難ㄝ~~~
希望有高手可以教我完整的教學"一張網卡的設定來架設Linux當做IP分享器"
系統是Fedora Core 3 的

Posted by: 初學者(小雨) at 2006年10月31日 22:43

大哥您好,
我又來了!
之前參照您的vpn實作已經可以連線進來;不過連進來後無法用vpn主機的nat再連出去。
os:fedora 7
eth0:192.168.0.252(對外)
eth1:10.0.0.1(對內)
我參照以上設定,在iptables的POSTROUTING加上
Masquerade If source is 10.0.0.0/24 and output interface is eth0
請問是不是nat哪裡沒設好?

Posted by: andy at 2007年08月01日 10:34

應該是 PPTP VPN Client 的設定問題
請編輯 PPTP Tunnel
"Add default route?" → Via gateway.. 10.0.0.1
"Delete old default route?" → Yes

Posted by: Jamyy at 2007年08月01日 11:59

大哥您好
client 這邊似乎只要用上vpn的路由就不能連線;是不是我nat這裡沒設成功呢?

Posted by: andy at 2007年08月01日 13:17

如果 cat /proc/sys/net/ipv4/ip_forward 是 0 的話
請先 echo 1 > /proc/sys/net/ipv4/ip_forward
並編輯 /etc/sysctl.conf
設定: net.ipv4.ip_forward = 1

請以 iptables -t nat -L -n 確定回應為:
Chain POSTROUTING (policy ACCEPT)
MASQUERADE all -- 10.2.0.0/24 0.0.0.0

若還是不行, 請確定 pptp server 的防火牆:
iptables -L -n
iptables -t nat -L -n
iptables -t mangle -L -n
確定 policy 都是 ACCEPT

再不行, 應該就是 pptp client 設置的問題了
這方面請參考我上一個回應

Posted by: Jamyy at 2007年08月01日 14:10

大哥您好,
基本上訊息都有正確,有個地方不一樣
/sbin/iptables -t nat -L -n
出現
MASQUERADE 0 -- 192.168.0.0/24 0.0.0.0/0
port這裡不是all而是0
檢查webmin
Source ports for masquerading 是any,其餘空白
IPs and ports for SNAT 是default,其餘空白

請問大哥這樣設定是有問題?

感謝

Posted by: andy at 2007年08月01日 14:20

其實 0 就是 all
因為 iptables 版本不同而產生的顯示差異

Posted by: Jamyy at 2007年08月01日 15:02

大哥抱歉,剛測了一下
linux client
設定add default route? via gateway 10.0.0.1可以連的出去!

windows client
是要哪裡設定呢?

感謝

Posted by: andy at 2007年08月01日 16:08

Windows 不需設定

請參考 PPTP 那篇

Posted by: Jamyy at 2007年08月01日 16:10

大哥您好,
剛剛我這裡做了一個測試,如下
NAT/VPN 主機
eth0:192.168.0.252(對外可上網)
eth1:10.0.0.1(內部網路)
default gateway:192.168.0.254
以上大哥提示的設定都有設定

Windows Client主機
網卡:10.0.0.3/gateway:10.0.0.1
(可ping nat 主機的 eth1, eth0 IP;但無法ping到gw:192.168.0.254及外部IP)

這樣無法上網;是不是代表我的NAT架設是沒有成功的?

感謝大哥..^^

Posted by: andy at 2007年08月02日 00:55

你是說單純的 Windows client (非 pptp client)
無法從 linux nat 出去嗎?
這樣的話的確是要檢查一下 linux nat 的設置

Posted by: Jamyy at 2007年08月02日 11:00

大哥午安,
是的,請問大哥nat是只要在防火牆設定iptables的POSTROUTING加上
Masquerade If source is 10.0.0.0/24 and output interface is eth0
這樣就ok嗎?

感謝

Posted by: andy at 2007年08月02日 11:31

午安~~
除了 MASQUERADE 之外, 還要允許 IP FORWARD 喔!

echo 1 > /proc/sys/net/ipv4/ip_forward

如果要每次開機都自動允許 IP FORWARD
可編輯 /etc/sysctl.conf
設定 net.ipv4.ip_forward = 1

Posted by: Jamyy at 2007年08月02日 11:52

大哥感激您的提醒,
我這裡好像測出了問題,想請大哥您指教,
我比較了一下Fedora 5和Fedoar 7的防火牆設定。
後來發現,Fedoar 7的iptables設定表:
Packet filtering(filter)表格的Forwarded packets (FORWARD)這裡是
Reject Always

後來我參照Fedora 5的設定
在Reject Always之上加上了就ok了
Run chain RH-Firewall-1-INPUT Always

請問大哥這樣是正確的嗎?有安全性問題嗎?

感謝

Posted by: andy at 2007年08月02日 12:05

ok....我在這Packet filtering(filter)表格的Forwarded packets (FORWARD)規則調整了一下,似乎比較合理,改成如下
Accept If output interface is eth1
Accept if input interface is eth1
Reject Always

ps eth1 為內網

請大哥再次確認..^^
感激

Posted by: andy at 2007年08月02日 13:21

我的做法是取消系統預設的防火牆
再逐一加入自己想要的 rule
你也可以試試看 :)

Posted by: Jamyy at 2007年08月02日 13:49

感謝大哥回答;
這裡設定似乎改成外網的比較合理
Accept If output interface is eth0
Accept if input interface is eth0
防火牆設定有用webmin重新設定成我們環境的rule,沒有很複雜就開所需要的port進來。

這裡目前測試已經正常也可以上網,但vpn連進來時,可以上網,但無法上msn;這是防火牆設定的問題?

感謝大哥..^^

Posted by: andy at 2007年08月02日 15:06

大哥您好,
NAT/VPN 主機
eth0:192.168.0.252(對外可上網)
eth1:10.0.0.1(內部網路)

Windows Client主機
網卡:10.0.0.3/gateway:10.0.0.1

當我直接透過NAT上網,msn正常;但連結vpn之後,上網正常,但msn無法連結;請問是要把msn的port加進防火牆規則中是嗎?

Posted by: andy at 2007年08月02日 15:22

這似乎不是防火牆的問題
實驗的結果是 msn 無法走 pptp tunnel 來連線
(但 skype 可以)
查了 google 也只得到一個結論:
把 "使用遠端網路的預設閘道" 的打勾拿掉

Posted by: Jamyy at 2007年08月03日 09:40

感謝大哥的回答,了解了!
使用pptpd vpn 並透過 vpn gateway 就無法與 msn 一同使用就是了?

感謝..^^

Posted by: andy at 2007年08月06日 14:20

是的
至少我在 msn 8.1 測試的結果是這樣

Posted by: Jamyy at 2007年08月06日 16:44