Linux防健忘日誌No.62-Ubuntu 12.04 DHCP Server+NAT架設

在三月跟竹竿討論如何重練我家網路的環境,最後討論的方案是回歸到最原始,並且優化了架構,如上圖所示

 

把一台裝LINUX的SERVER擋在前面,當作ROUTER以及DHCP的腳色,然後內網可以透過這台SERVER做NAT上網出去

另外一部分用傳統的分享器當作備援路線,以及在撥另外一個IP給BT機使用,一方面避免Server掛掉讓內網完全死翹翹,另一方面是下載機洗IP時不會影響到另外一邊內網的工作

 

不過我這次只實作DHCP那段,下面那一片我沒有做,但很簡單,就只是IP手動設定跟分享器DHCP開與關而已,沒什麼技術成分,用到再去切換就好

至於DMZ那一塊我也沒實作,原先想說SERVER直接用vSphere來架ESXi Server,開兩個虛擬機器在上面,一個是ubuntu,另外一個是Windows Server

但基於手邊伺服器的硬體空間配置以及目前ASP網頁方面較沒有甚麼急迫性,所以我就沒有架ESXi Server了

 

#========================================

切回正題

 

接下來的內容我是參照外國”codeghar”這位網友的網誌,翻譯並且加入一些解說(或者可以說是廢話),英文好的人可以直接去看英文…

http://codeghar.wordpress.com/2012/05/02/ubuntu-12-04-ipv4-nat-gateway-and-dhcp-server/

但是這篇的價值在於iptables…,由好友兼可能成為國手的竹竿寫了幾行iptables,就算自己看得懂英文要直接去原文的人,煩請可以參考一下文章裡在iptables那塊撰寫的部分

 

 

首先你的電腦上必須有兩張網路卡,我這裡eth0是對內網eth1是從種花電信的MODEM拉出來做PPPOE撥號連去網際網路用的

還有一些網路基礎概念

(關於pppoe比較好的撥接方式可以在 http://gavaee.wordpress.com/2011/10/21/%E8%A8%AD%E5%AE%9Aadsl%EF%BC%88pppoe%EF%BC%89%E9%80%A3%E7%B7%9A/ 找到)

 

 

我的子網路習慣網段是192.168.1.0/24主機位置(也就是DHCP Server的ip)我設定192.168.1.30

是基於之前舊的拓樸架構做設定,要不然子網路內原先的samba資料夾全部都要重新set一輪…很煩

 

 

首先先確定一下你網路架構情況

sudo vi /etc/network/interfaces

 

內容:

#========================================

auto lo
iface lo inet loopback

auto dsl-provider 
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth1 up # line maintained by pppoeconf
provider dsl-provider

auto eth1
iface eth1 inet manual

auto eth0
iface eth0 inet static
address 192.168.1.30 #設定為你DHCP server想要取得的IP位置
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255

#========================================

比較需要改的是對內網的eth0部分,如果你在這裡就卡關了,回頭讀一下網路概論再回來吧…,想當初我連broadcast的詳細運作原理都不知道,在這裡搞這些東西很痛苦的(阿…扯遠了)

 

接著你要開啟NAT才能讓內網可以讓封包轉交

sudo vi /etc/sysctl.conf

 

找到#net.ipv4.ip_forward=1

將前面的#字號拿掉,存檔

 

然後重點來了,你必須要設定好iptables,依照codeghar的網誌到/etc/rc.local扔入兩行簡單的iptables指令就結束了

不過晚上給竹竿檢查的時候直接被打槍(意料中的事XD,我自己都覺得這樣有夠貧弱的),請教了一番,就幫我做了一個腳本

 

這裡的做法是,要到root底下先做一個iptables的bash檔,你要直接放到/etc/rc.local裡面也行,不過這邊基於管理考量,另外拉了一個腳本出來

sudo vi /root/iptablse.config

 

(2012/06/16更新:如果你套用以下iptables的設定之後,

在某些情況下有可能會出現連結外部網路時不定期的嚴重掉速或者高延遲等問題,

需要flush tables或者重開機才會解決,有時候可能連這些方式都沒有用…

這時請檢查線材或者switch是否老舊,並不是每個人都會發生,

原因推測是因為節點裝置過多或者線材訊號損失率過高,

在高速傳輸大量封包,造成每一個點的losse  package暴增,讓Server無法負荷)

 

(2012/07/24更新:也有可能遭遇到MTU設定的問題,請完成這篇動作之後到

http://thkaw.pixnet.net/blog/post/91605625 去看一下解決方法!)

 

貼入以下內容:

#========================================

#!/bin/bash

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP

iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m multiport -i ppp0 -p tcp –dport 20,21,22,80,443,3306,5900,8080,8112 -j ACCEPT

iptables -A FORWARD -m mark –mark 99 -j DROP
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE
iptables -t mangle -A PREROUTING -i ppp0 -d 192.168.1.0/24 -j MARK –set-mark 99

#========================================

 

你可以自訂義你要讓外網與Server溝通開放的port口,更改內容中這一行:

iptables -A INPUT -m multiport -i ppp0 -p tcp –dport 20,21,22,80,443,3306,5900,8080,8112 -j ACCEPT

我這裡開放了FTP,HTTP,HTTPS,MYSQL,VPN,以及兩個自定義的PORT口

 

可以自行加入

 

完成腳本之後,要設定開機時自動RUN(記得你的腳本權限要設定775喔~~~,要不然會跟我一樣耍腦花30分鐘找,以為rc.local沒被執行到= =)

sudo vi /etc/rc.local

 

 

exit 0之前

插入一行

/root/iptables.config

 

儲存離開

 

 

然後要開始安裝DHCP Server

sudo apt-get install isc-dhcp-server

 

安裝完畢後設定DHCP Server的組態檔

sudo vi /etc/dhcp/dhcpd.conf

 

其中

# option definitions common to all supported networks…
option domain-name “www.yaya123.gov”;  #這裡是你的網域名稱,可以填入你server的dns
option domain-name-servers 8.8.8.8,8.8.6.6; #這裡是你網域的dns server,我這裡塞了兩台google的dns server

default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

 

接著往下移動

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

#subnet 10.152.187.0 netmask 255.255.255.0 {
#}

# This is a very basic subnet declaration.  

subnet 192.168.1.0 netmask 255.255.255.0 {  
range 192.168.1.31 192.168.1.100;                    #這邊是設定你要自動分派子網段IP的範圍跟設定參數,這裡設定可以由31分到100
option routers 192.168.1.30;                               #這裡是設定你DHCP Server自身要分配的IP位置是哪一個,呼應前面interfaces檔裡面設定的位置
}
# This declaration allows BOOTP clients to get dynamic addresses,
# which we don’t really recommend.

 

確認無誤後儲存後離開(有誤頂多在回來改)

 

最後你要告訴系統你要讓哪個網路卡對應內網,前面提到我是用eth0,也是呼應interfaces裡面的eth0來做設定

sudo vi /etc/default/isc-dhcp-server

 

原本是INTERFACES=””

改成INTERFACES=“eth0”

儲存離開,接著重新啟動電腦,將eth0接台switch(或者直接接也可以),在接到別台電腦看看有沒有正常分派ip吧~~~

 

 

 

關於iptables那一塊,應該是能做到非常堅固完善的保護

我看過近百本關於Linux的中文書,就是沒看過raw跟mark是甚麼作用…

具竹竿表示,中文書只有一本有提到,至於是哪本…

 

等我念LPIC-2真的想要認真好好iptables之後我再告訴大家(炸

 

 

thx for:

竹竿格格

http://codeghar.wordpress.com/2012/05/02/ubuntu-12-04-ipv4-nat-gateway-and-dhcp-server/

http://comtech247.net/2012/05/01/how-to-set-up-a-dhcp-server-on-ubuntu-server-12-04-lts/

http://tw.myblog.yahoo.com/jw!cpeqenSCGRCd74kRAZI4vNPE0w–/article?mid=111

1 Comment

  1. 完成腳本之後,要設定開機時自動RUN
    sudo vi /etc/sysctl.conf

    應該是 sudo vi /etc/rc.local 才是喔….
    版主回覆:(05/05/2013 04:50:46 AM)
    筆誤sorry@@!,的確是rc.local
    感謝訂正

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料