Ubuntu NAT Router

จาก Wiki Opensource

ปรับปรุงล่าสุดเมื่อวันที่ 18-02-58

ดูแลโดย วิบูลย์


Ubuntu NAT Router (สร้าง Ubuntu NAT Router สำหรับโรงเรียน)

ตัวอย่างสภาพแวดล้อมคือ
- โรงเรียนของเรามี ADSL router ของ ISP มี dns server คือ 8.8.8.8 มี IP ใช้ได้คือ 1.2.3.57 ถึง 1.2.3.62 subnet mask 255.255.255.248
- เราต้องการตั้ง ubuntu server ขึ้นมาทำเป็น router แบบ NAT โดย interface eth0 ต่อกับ adsl router
- จะให้ IP 10.0.100.1 สำหรับ interface ชื่อ eth1
- โดยที่เครื่องลูกจะต่อกับ eth1 ใช้ network 10.0.100.0/24
- ubuntu server ทำหน้าที่ dns server สำหรับ domain name ของเครื่องลูก และเป็น resolver
- ubuntu server ทำหน้าที่ dhcp server แจก IP ให้เครื่องลูก
- ทดสอบกับ ubuntu server 12.04

สร้าง Ubuntu NAT Router สำหรับโรงเรียนแบบแต่งระบบเอาเอง

ขั้นตอนดังนี้

1. ตั้งค่า IP แบบ fixed ให้กับ interface ของ ubuntu router
- แก้ไขไฟล์ /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
# not fix ip
#iface eth0 inet dhcp
# fix ip for eth0 lan card
iface eth0 inet static
address 1.2.3.56
netmask 255.255.255.248
dns-nameservers 8.8.8.8
# fix ip for eth1 lan card
auto eth1
iface eth1 inet static
address 10.0.100.1
netmask 255.255.255.0


2. ตั้งค่า NAT router
- ตั้งค่า ipv4 forwarding และ NAT
แก้ไขไฟล์ /etc/rc.local
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.0.100.1/24 -j MASQUERADE
exit 0

-------------------------------------------------------------------------------------------
หมายเหตุ ขั้นตอนตั้งค่า NAT router มีอีกวิธีเมื่อต้องการใช้งาน firewall ด้วยโปรแกรม shorewall 2 interfaces
- ติดตั้ง package
sudo apt-get install shorewall
sudo cp /usr/share/doc/shorewall/examples/two-interfaces/zones /etc/shorewall
sudo cp /usr/share/doc/shorewall/examples/two-interfaces/interfaces /etc/shorewall
sudo cp /usr/share/doc/shorewall/examples/two-interfaces/policy /etc/shorewall
sudo cp /usr/share/doc/shorewall/examples/two-interfaces/rules /etc/shorewall
sudo cp /usr/share/doc/shorewall/examples/two-interfaces/masq /etc/shorewall

- แก้ไขไฟล์ 4 ไฟล์ คือ zones, interfaces, policy และ rules ตามตัวอย่างนี้
ไฟล์ /etc/shorewall/zones
fw firewall
net ipv4
loc ipv4
ไฟล์ /etc/shorewall/interfaces
net eth0 detect dhcp,tcpflags,nosmurfs,routefilter,logmartians
loc eth1 detect
ไฟล์ /etc/shorewall/policy
$FW net ACCEPT
$FW loc ACCEPT
loc net ACCEPT
loc $FW ACCEPT
net all DROP info
# THE FOLLOWING POLICY MUST BE LAST
all all ACCEPT
ไฟล์ /etc/shorewall/rules
#Ping(DROP) net $FW
ACCEPT $FW loc icmp
ACCEPT $FW net icmp
# example drop unwanted intranet net
#DROP loc:10.0.100.193 $FW
# example drop unwanted internet net
#DROP net:42.2.192.0/19 $FW
# default open all ports
ACCEPT all $FW
# or open only SSH
#ACCEPT all $FW tcp 22
# or open only DHCPD
#ACCEPT all $FW udp 67:68
# or open only HTTP,HTTPS
#ACCEPT all $FW tcp 80,443

- แก้ไขไฟล์ masq
ไฟล์ /etc/shorewall/masq
eth0 10.0.0.0/8,\
169.254.0.0/16,\
172.16.0.0/12,\
192.168.0.0/16

- ตั้งค่า เปิดใช้งาน shorewall
แก้ไขไฟล์ /etc/default/shorewall
startup=1
แก้ไขไฟล์ /etc/shorewall/shorewall.conf
STARTUP_ENABLED=Yes
IP_FORWARDING=Yes

- รีสตาร์ท shorewall
sudo /etc/init.d/shorewall start

-------------------------------------------------------------------------------------------


3. ติดตั้ง dns server
- ติดตั้ง package
sudo apt-get install bind9

- ตั้งค่าใส่ upstream dns server และ ไม่ใช้ dnssec-validation
แก้ไขไฟล์ /etc/bind/named.conf.options
forward first;
forwarders {
// Your upstream DNS server
8.8.8.8;
};
// dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on { any; };
listen-on-v6 { any; };

มีคำแนะนำสำหรับการป้องกัน และอนุญาตเฉพาะเน็ตบางเน็ตให้ทำ recursion ได้เท่านั้น
ให้แก้ไขในแฟ้ม /etc/bind/named.conf.options โดยเพิ่ม
acl "trusted" {
10.0.100.0/24;
localhost;
localnets;
};

และในช่วง option { ... } ให้เพิ่มคำสั่งเหล่านี้ด้วยครับ
options {
...
allow-query { any; };
allow-recursion { trusted; };
allow-query-cache { trusted; };
...
};

Reference: https://kb.isc.org/article/AA-00269/0/What-has-changed-in-the-behavior-of-allow-recursion-and-allow-query-cache.html

- ตั้งค่า zone ที่ระบุชื่อ zone และชื่อไฟล์ที่เก็บข้อมูล domain name ของ IP ต่างๆใน zone
แก้ไขไฟล์ /etc/bind/named.conf.local
zone "example.com" in {
type master;
file "db.example.com";
};
zone "internal.example.com" in {
type master;
file "db.internal.example.com";
};

- ตัวอย่าง main zone ชื่อ example.com
ไฟล์ /var/cache/bind/db.example.com
$TTL 3h
example.com. IN SOA ns1.example.com. root.localhost.example.com. (
2013032400 ; Serial
3h ; Refresh after 3 hours
1h ; Retry after 1 hour
1w ; Expire after 1 week
1h ; Negative caching TTL of 1 hour
)
;
; Name servers
;
example.com. IN NS ns1.example.com.
;
; Addresses for the canonical names
;
localhost.example.com. IN A 127.0.0.1
ns1.example.com. IN A 10.0.100.1
dhcpserver.example.com. IN A 10.0.100.2
vyattarouter.example.com. IN A 10.0.100.3
myserver.example.com. IN A 10.0.100.5
radiusserver.example.com. IN A 10.0.100.6
mailserver.example.com. IN A 10.0.100.7
 ;
; Aliases
;
mail IN CNAME mailserver
dns.example.com. IN CNAME ns1.example.com.

- ตัวอย่าง sub zone ชื่อ internal.example.com
ไฟล์ /var/cache/bind/db.internal.example.com
$TTL 3h
internal.example.com. IN SOA ns1.example.com. root.localhost.example.com. (
2013032400 ; Serial
3h ; Refresh after 3 hours
1h ; Retry after 1 hour
1w ; Expire after 1 week
1h ; Negative caching TTL of 1 hour
)
;
; Name servers
;
internal.example.com. IN NS ns1.example.com.
;
; Addresses for the canonical names
;
r1.internal.example.com. IN A 10.0.200.3
webserver.internal.example.com. IN A 10.0.200.4

- รีสตาร์ท dns server
sudo service bind9 restart

อ่านเพิ่มเติม เรื่อง dns ตัวสำรอง ได้ที่ ติดตั้ง_bind_บน_ubuntu

4. ติดตั้ง dhcp server ให้แจก IP สำหรับ eth1
- ติดตั้ง package
sudo apt-get install isc-dhcp-server

- ตั้งค่า interface ที่จะแจก IP
แก้ไขไฟล์ /etc/default/isc-dhcp-server
INTERFACES="eth1"

- ตั้งค่า IP range ที่จะแจกแบบ dhcp IP
แก้ไขไฟล์ /etc/dhcp/dhcpd.conf
ตัวอย่าง IP class C 10.0.100.0/24 แจก IP ตั้งแต่ 200 ถึง 249
subnet 10.0.100.0 netmask 255.255.255.0 {
range 10.0.100.200 10.0.100.249;
option domain-name-servers 10.0.100.1;
option domain-name "example.com";
option routers 10.0.100.1;
option broadcast-address 10.0.100.255;
default-lease-time 600;
max-lease-time 7200;
}

- รีสตาร์ท isc-dhcp-server
sudo service isc-dhcp-server restart