Tuesday, October 25, 2011

DMZ คือ

knowledge
Demilitarized Zone (DMZ)
    ในกรณีที่ผู้ใช้บริการมี Server ต่าง ๆ อยู่ด้วย ในที่นี่สมมุติว่ามี Web Server, FTP Server, DNS Server , Proxy Server, Mail Server และ MySQL  Serer แล้วเราจะทำอย่างไรล่ะ
วิธีการที่นิยมกันคือการเพิ่มโซนของเครือข่ายมาอีกโซนหนึ่งนั่นคือ Demilitarized Zone (DMZ) ซึ่งถ้าแปลตรง ๆ ก็คือ "เขตปลอดทหาร" เช่น ที่กำหนดขึ้นที่เขตแดนระหว่างประเทศเกาหลีเหนือและประเทศเกาหลีใต้ในระหว่าง การสงบศึกชั่วคราวของสงครามเกาหลี
สำหรับในเรื่อง Network Security แล้ว DMZ เป็นคำจำกัดความของโซนอีกประเภทหนึ่งที่ไม่ใช่ทั้ง Internal (เครือข่ายภายใน) และ External (เครือข่ายภายนอกหรือเครือข่ายอินเตอร์เน็ต) แต่หมายถึงเครือข่ายที่ต้องมีการสื่อสารกับทั้งเครือข่ายภายในและเครือข่าย ภายนอกนั่นเอง  และดังนั้นผมจึงได้จัดให้ Server ทั้ง 5 ซึ่งต้องติตต่อกับทั้งเครือข่ายภายในและเครือข่ายภายนอกให้อยู่ใน DMZ ดังรูปที่ 3
อาจจะสงสัยบ้างว่าถ้ามี DHCP Server ด้วยจะเอาไว้ตรงไหน  เนื่องจาก DHCP Server ไม่ต้องมีการติดต่อสื่อสารกับเครือข่ายภายนอก จึงสามารถวางไว้ที่เครือข่ายภายในได้เลยครับ หรือถ้า Gateway มี Spec สูงหน่อย ก็สามารถวางไว้บน gateway เลยก็ได้ครับ
รูปที่ 3 การทำไฟร์วอลล์แบบที่มี DMZ ที่จัดแบ่งไอพีไม่ถูกต้อง
จาก รูปข้างบนนี้ผมลองทำดูแล้วมีปัญหาครับ คือ Linux ไม่ยอมรับลักษณะที่มีการ์ดแลนด์ 2 การ์ดแต่มีค่า IP อยู่ในวงเดียวกันนั่นคือการ์ด 202.129.48.162 กับการ์ด 202.29.48.163 ซึ่งเป็น IP ที่อยู่ในวงเดียวกันคืออยู่ในวง 202.129.48.160/28
เมื่อเป็นแบบนี้วิธีการแก้ปัญหาก็สามารถทำได้ด้วยการแบ่ง subnet ออกเป็น 2 subnet คือแบ่งไอพีวงแลนที่ได้จาก ISP เป็น 2 วงแลนนั่นเอง โดยวงแลนวงที่หนึ่งจะให้เป็นของ External และวงที่สองเป็นของ DMZ ซึ่งสามารถแบ่งได้เป็นดังนี้ :
วงที่ 1 : 202.129.48.160/29 ซึ่งจะมีไอพีเป็น 8 ไอพีที่อยู่ในช่วง 202.129.48.160 ถึง 202.129.48.167 แต่จะใช้งานได้จริงเป็น 6 ip คือ 202.129.48.161 ถึง 202.129.48.166
วงที่ 2 : 202.129.48.168/29 ซึ่งจะมีไอพีเป็น 8 ไอพีที่อยู่ในช่วง 202.129.48.168 ถึง 202.129.48.175 แต่จะใช้งานได้จริงเป็น 6 ip คือ 202.129.48.169 ถึง 202.129.48.174และแล้วก็จะได้รูปแบบของการจัดวางเครือข่ายทั้งหมดใหม่เป็น ดังรูปที่ 4
รูปที่ 4 การทำไฟร์วอลล์แบบที่มี DMZ ที่ถูกต้อง
เพื่อ ความสะดวกในการทำ ipchains เราควรจัดทำตารางแอคเซสรูลขึ้นมาก่อน  เพื่อแสดงความต้องการในการใช้งานว่าเราต้องการจะยอมรับหรือปฏิเสธแอปปลิเค ชันอันไหนบ้าง  โดยความต้องการในที่นี้ขออ้างถึงรูปที่ 4 และได้ดังตารางต่อไปนี้ :
ลำดับ
Source
Destination
Service
Port No.
Action
1
internal
any
เป็นการทำ NAT (MASQ)

forward
2
internal
any
ftp
21 tcp
accept
3
internal
any
dns
53 udp
accept
4
dmz
any
dns
53 udp
accept
5
any
dmz
dns
53 udp
accept
6
any
any
http
80 tcp
accept
7
Internal
any
telnet
23 tcp
accept
8
any (external)
internal
telnet
23 tcp
reject
9
any
any
smtp
25 tcp
accept
10
internal
any
pop3
110 tcp
accept
11
Intenal
any
imap
143 tcp
accept
12
Internal
any
https
443 tcp
accept
13
Internal
any
ping
icmp
accept
14
ไม่ใช่ Internal
any
webcache (proxy)
8080 tcp
reject
15
any (external)
dmz
ping
icmp
reject
16
any
any
tcp port 0-1023
0-1023 tcp
reject
17
any
any
tcp Network File System (NFS)
2049 tcp
reject
18
any
any
udp port 0-1023
0-1023 udp
reject
19
any
any
udp Network File System (NFS)
2049 udp
reject
20
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
2773 tcp
reject
21
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
6771 tcp
reject
22
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
6713 tcp
reject
23
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
7215 tcp
reject
24
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
27374 tcp
reject
25
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
27573 tcp
reject
26
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
54283 tcp
reject
27
any
dmz
x windows system
6000-6009 tcp
reject
28
any
dmz
X Font Service
7100 tcp
reject
29
intenal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม Back Orifice 2000
8787 tcp
reject
30
internal
any
ดักจับโฮสต์ภายในที่ติดโปรแกรม Back Orifice 2000
54320-54321
reject
1:#ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ
2:#ipchains -A input -s 192.168.1.0/24 -d 0/0 21 -p tcp -y -j ACCEPT
3.:#ipchains -A input -s 192.168.1.0/24 -d 0/0 53 -p udp -j ACCEPT
4:#ipchains -A input -s 202.129.48.168/29 -d 0/0 53 -p udp -j ACCEPT
5:#ipchains -A input -s 0/0 -d 202.129.48.168/29 53 -p udp -j ACCEPT
6:#ipchains -A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT
7:#ipchains -A input -s 192.168.1.0/24 -d 0/0 23 -p tcp -y -j ACCEPT
8:#ipchains -A input -s 0/0 -d 202.129.48.168/29 23 -p tcp -y  -j REJECT
9:#ipchains -A input -s 0/0 -d 0/0 25 -p tcp -y -j ACCEPT
10:#ipchains -A input -s 192.168.1.0/24 -d 0/0 110 -p tcp -y -j ACCEPT
11:#ipchains -A input -s 192.168.1.0/24 -d 0/0 143 -p tcp -y -j ACCEPT
12:#ipchains -A input -s 192.168.1.0/24 -d 0/0 443 -p tcp -y -j ACCEPT
13:#ipchains -A input -s 192.168.1.0/24 -d 0/0 -p icmp --icmp-type ping -j ACCEPT
14: #ipchains -A input -s ! 192.168.1.0/24 -d 0/0 8080 -p tcp -y -j REJECT
15:#ipchains -A input -s 0/0 -d 202.129.48.168/29 -p icmp --icmp-type ping -j REJECT
16:#ipchains -A input -s 0/0 -d 0/0 0:1023 -p tcp -y -j REJECT
17:#ipchains -A input -s 0/0 -d 0/0 2049 -p tcp -y -j REJECT
18:#ipchains -A input -s 0/0 -d 0/0 0:1023 -p udp -j REJECT
19:#ipchains -A input -s 0/0 -d 0/0 2049 -p udp -j REJECT
20:#ipchains -A input -s 192.168.1.0/24 -d 0/0 2773 -p tcp -y -j REJECT
21:#ipchains -A input -s 192.168.1.0/24 -d 0/0 6771 -p tcp -y -j REJECT
22:#ipchains -A input -s 192.168.1.0/24 -d 0/0 6713 -p tcp -y -j REJECT
23#ipchains -A input -s 192.168.1.0/24 -d 0/0 7215 -p tcp -y -j REJECT
24:#ipchains -A input -s 192.168.1.0/24 -d 0/0 27374 -p tcp -y -j REJECT
25:#ipchains -A input -s 192.168.1.0/24 -d 0/0 27573 -p tcp -y -j REJECT
26:#ipchains -A input -s 192.168.1.0/24 -d 0/0 54283 -p tcp -y -j REJECT
27:#ipchains -A input -s 0/0 -d 202.129.48.168/29 6000:6009 -p tcp -y -j REJECT
28:#ipchains -A input -s 0/0 -d 202.129.48.168/29 7100 -p tcp -y -j REJECT
29:#ipchains -A input -s 192.168.0.1/24 -d 0/0 8787 -p tcp -y -j REJECT
30:#ipchains -A input -s 192.168.0.1/24 -d 0/0 54320:54321 -p udp -j REJECT
:
ความหมายแต่ละบรรทัด:
1.ทำ NAT ให้เครือข่ายภายในเพื่อจะให้สามารถออกสู่เครือข่ายภายนอกได้
2.อนุญาตให้เครือข่ายภายใน ftp ไปที่ไหนก็ได้
3.อนุญาตให้เครือข่ายภายในใช้ DNS ของที่ไหนก็ได้
4.อนุญาต ให้ DMZ ไปใช้ DNS ของที่ไหนก็ได้  ซึ่งตรงนี้เป็นการอนุญาตให้ทั้งเครือข่าย  จริง ๆ แล้วอาจจะอนุญาตให้เฉพาะ Proxy Server กับ DNS Sever ก็พอแล้ว โดยให้ระบุ IP address ของ Server ไปได้เลย นั่นคือต้องใช้คำสั่งนี้สองบรรทัดนะ
5.อนุญาตให้ต้นทางที่ไหนก็ได้มาใช้ DNS ใน DMZ ได้  ซึ่งไอพีของปลายทางสามารถจะระบุเฉพาะ IP ของ DNS Server ไปเลยก็ได้
6.อนุญาตให้ใช้ http ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
7.อนุญาตให้เครือข่ายภายในสามารถจะ telnet ไปที่ไหนก็ได้
8.ไม่ อนุญาตให้ต้นทางที่ไหนก็ได้ telnet เข้ามา DMZ ได้ แต่เมื่อย้อนไปดูข้อ 7 ก็สรุปว่าอนุญาตให้เฉพาะเครือข่ายภายในเท่านั้นที่ telnet เข้า DMZ ได้
9.อนุญาตให้ต้นทางที่ไหนสามารถใช้ smtp ที่ปลายทางที่ไหนก็ได้
10.อนุญาตให้เครือข่ายภายในไปใช้ pop3 ที่ปลายทางที่ไหนก็ได้
11.อนุญาตให้เครือข่ายภายในไปใช้ imap ณ ปลายทางที่ไหนก็ได้
12.อนุญาตให้เครือข่ายภายในไปใช้ https ณ ปลายทางที่ไหนก็ได้
13.อนุญาตให้เครือข่ายภายใน ping ไปที่ไหนก็ได้
14.ไม่อนุญาตให้เครือข่ายที่นอกเหนือจากเครือข่ายภายในสามารถใช้งาน Proxy Server ได้
15.ไม่ อนุญาตให้ทุกที่ ping เข้ามาใน DMZ แต่เมื่อย้อนไปดูข้อ 13 แล้ว สรุปเป็นว่าอนุญาตให้เฉพาะเครือข่ายภายในเท่านั้นที่ ping เข้า dmz ได้
16.ห้ามการใช้งานที่พอร์ต 0-1023 tcp ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน แต่จะอนุญาตให้เฉพาะกฎข้อก่อนหน้านี้เท่านั้น
17.ห้ามการใช้งาน tcp Network File System (NFS) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
18.ห้ามการใช้งานที่พอร์ต 0-1023 udp ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน แต่จะอนุญาตให้เฉพาะกฎข้อก่อนหน้านี้เท่านั้น
19.ห้ามการใช้งาน udp Network File System (NFS) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
20-26 ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
27.ห้ามต้นทางที่ไหนก็แล้วแต่  ติดต่อเข้าไปยัง x windows system ของ DMZ
28.ไม่อนุญาตให้ใช้งาน tcp พอร์ต 7100 (X Font Service) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
29-30 ดักจับโฮสต์ภายในที่ติดโปรแกรม Back Orifice 2000

ที่มา http://www.tkc.ac.th/osunun/technology/linux/gateway_firewall.html

Monday, October 24, 2011

ตัวอย่างการทำ Firewall แบบ DMZ พร้อม Transparent Proxy (DMZ ใช้ Private IP)

การจัดเครือข่าย Firewall แบบ DMZ (Demilitarized Zone) เป็นรูปแบบหนึ่งที่นิยมใช้กัน  ซึ่งเครือข่ายจะประกอบไปด้วยเครือข่าย 3 ส่วนด้วยกัน คือ
1 .เครือข่ายภายใน 
(trusted internal network) จะเป็นส่วนที่ไม่อนุญาตให้เครือข่ายภายนอกเข้ามาได้ ซึ่งส่วนใหญ่จะเป็นส่วนของ Client
2. เครือข่าย
DMZ เป็นส่วนที่เครือข่ายภายนอกและเครือข่ายภายในเข้ามาใช้งานได้ตามกฎที่ Firewall ได้ตั้งไว้
3.เครือข่ายภายนอก (Internet)

โดยการเชื่อมต่อใช้งานจะต้องมี
Linux Server ตัวหนี่งทำหน้าที่เป็น Firewall ซึ่งจะต้องประกอบด้วยการ์ดแลน 3 การ์ด ดังรูปที่ 1



รูปที่ 1
เพื่อให้เข้าใจได้ง่ายขึ้นจึงขอใช้รูปตัวอย่างการเชื่อมต่อจริง ๆ ดังรูปที่ 2  ซึ่งที่ Linux Firewall จะมี Ethernet Card 3 การ์ดคือ eth0 ใช้เชื่อมต่อกับเครือข่ายภายนอก, eth1 ใช้เชื่อมต่อกับเครือข่ายภายใน  และ eth2 ใช้เชื่อมต่อกับเครือข่าย DMZ  ในส่วนของ eth0 นั้นมี IP Address เป็น 3 ค่าคือ
1. 202.129.49.194
แทนตัวเองซึ่งเป็น Firewall
2. 202.129.49.195 ใช้แทน
HTTP
3. 202.129.49.196
ใช้แทน DNS

หมายเหตุ Proxy ไม่จำเป็นต้องให้บริการกับบุคคลภายนอก จึงไม่จำเป็นต้องใช้ IP จริง



รูปที่ 2
หน้าที่ของ Linux Firewall
1.ทำ NAT (Outbound) ให้เครือข่ายภายใน (trusted internal network) สามารถเชื่อมต่อไปยังเครือข่ายภายนอกได้
2.ในกรณีที่เครือข่ายภายในออกไปใช้งานเครือข่ายภายนอกเป็นการเรียกใช้ http ให้ redirect ไปยัง Proxy ของ DMZ (Transparent Proxy)
3.
Linux Server ต้องอนุญาตให้เครือข่ายภายในสามารถใช้งาน DNS Server ในวง DMZ ทั้งการเรียกโดยใช้ IP จริงและ IP ปลอมได้ (ทั้ง 202.129.49.196 และ 192.168.2.3)
4.
Linux Server ต้องอนุญาตให้เครือข่ายภายในสามารถใช้งาน Web Server ในวง DMZ ทั้งการเรียกโดยใช้ IP จริงและ IP ปลอม (ทั้ง 202.129.49.195 และ 192.168.2.2)
5
.ทำ NAT (Inbound) ให้เครือข่ายภายนอกเข้ามาใช้ Web Server และ DNS Server ในวง  DMZ ได้
6.ทำหน้าที่เป็น
Firewall

คำสั่ง
iptables ที่ใช้
คำสั่งที่ใช้ทั้งหมดเป็นดังนี้
:

#-----Start script------#

#Define variables
LAN_IP="192.168.1.1"
LAN_BCAST_ADRESS="192.168.1.255"
LAN_IFACE="eth1"

INET_IP="202.129.49.194"
INET_IFACE="eth0"

HTTP_IP="202.129.49.195"
DNS_IP="202.129.49.196"

DMZ_IP="192.168.2.1"
DMZ_IFACE="eth2"

DMZ_HTTP_IP="192.168.2.2"
DMZ_DNS_IP="192.168.2.3"
DMZ_PROXY_IP="192.168.2.4"

LO_IP="127.0.0.1"
LO_IFACE="lo"
#CRITICAL: Enable IP forwarding since it is disabled by default.
echo "1" > /proc/sys/net/ipv4/ip_forward
#Clear all chains of rule
iptables -F
iptables -X allowed
iptables -X icmp_packets
iptables -t nat -F

# Chain Policies gets set up before any bad packets gets through
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# the allowed chain for TCP connections, utilized in the FORWARD chain
iptables -N allowed
iptables -A allowed -p TCP --syn -j ACCEPT
iptables -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A allowed -p TCP -j DROP

# ICMP rules, utilized in the FORWARD chain
iptables -N icmp_packets
iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

# POSTROUTING chain in the nat table : Enable IP SNAT for all internal networks trying to get out on the Internet
iptables -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP

# PREROUTING chain in the nat table

         
# Do some checks for obviously spoofed IP's
iptables -t nat -A PREROUTING -i $INET_IFACE -s 192.168.0.0/16 -j DROP
iptables -t nat -A PREROUTING -i $INET_IFACE -s 10.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i $INET_IFACE -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i $INET_IFACE -s $INET_IP -j DROP

          # Enable IP Destination NAT for DMZ zone (Inbound NAT)
iptables -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $HTTP_IP --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
iptables -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
iptables -t nat -A PREROUTING -p UDP -i $INET_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
          # Enable Internal network connect to DMZ HTTP and DMZ DNS by public IP (update by Adisorn)
iptables -t nat -A PREROUTING -p TCP -i $LAN_IFACE -d $HTTP_IP --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
iptables -t nat -A PREROUTING -p TCP -i $LAN_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
iptables -t nat -A PREROUTING -p UDP -i $LAN_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP

          #Redirect all http from internal network (not DMZ http destination) to Proxy Server (Transparent Proxy) (update by sorn)
iptables -t nat -A PREROUTING -p TCP -i $LAN_IFACE -s 192.168.1.0/24 -d ! $DMZ_HTTP_IP --dport 80 -j DNAT --to-dest 192.168.2.4:3128
# FORWARD chain

         
# Get rid of bad TCP packets
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP

          # DMZ section : General rules
iptables -A FORWARD -i $DMZ_IFACE -o $INET_IFACE -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -o $DMZ_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $LAN_IFACE -o $DMZ_IFACE -j ACCEPT
iptables -A FORWARD -i $DMZ_IFACE -o $LAN_IFACE -j ACCEPT

          # DMZ section : HTTP server
iptables -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_HTTP_IP --dport 80 -j allowed
iptables -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_HTTP_IP -j icmp_packets         

          #DMZ section : DNS server
iptables -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP --dport 53 -j allowed
iptables -A FORWARD -p UDP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP --dport 53 -j ACCEPT
iptables -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP -j icmp_packets                   
          # LAN section
iptables -A FORWARD -i $LAN_IFACE -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

          # LOG all packets reaching here
iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "

# Firewall rules

         
# INPUT chain

                    #Get rid of bad packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
                    # Packets from the Internet to this box
iptables -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

                    # Packets from LAN, DMZ or LOCALHOST

                              # From DMZ Interface to DMZ firewall IP
iptables -A INPUT -p ALL -i $DMZ_IFACE -d $DMZ_IP -j ACCEPT

                              # From LAN Interface to LAN firewall IP
iptables -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT
iptables -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
                              # From Localhost interface to Localhost IP
iptables -A INPUT -p ALL -i $LO_IFACE -d $LO_IP -j ACCEPT
                    # All established and related packets incoming from the internet to the firewall
iptables -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
                    # Logging rule
iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
          # OUTPUT chain

                    # Get rid of bad TCP packets
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
                    # Allow ourself to send packets not spoofed everywhere
iptables -A OUTPUT -p ALL -o $LO_IFACE -s $LO_IP -j ACCEPT
iptables -A OUTPUT -p ALL -o $LAN_IFACE -s $LAN_IP -j ACCEPT
iptables -A OUTPUT -p ALL -o $INET_IFACE -s $INET_IP -j ACCEPT
                    # Logging rule
iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

#-----End script------#

การทำ DMZ

เช่น 202.29.30.49 map 192.168.2.19 สามารถเรียกดูได้ ที่
202.29.30.49 ครับ


เขาเรียกว่าการทำ DMZ ครับ คือต้องมีการ์ดแลนเพิ่มมาอีกใบนึงคับ เท่าที่ทราบ แต่ว่าผมก็ยังไม่เคยทำ

ปล. ไม่รู้ผมเข้าใจถูกหรือเปล่านะครับ ที่ผมเข้าใจก็คือ อย่างเช่นเราเข้า 202.29.30.49:80 ก็ให้วิ่งไปเปิดเครื่อง 192.168.2.19:80 ใชป่ะคับ ถ้าใช่เขาเรียกทำ DMZ ครับ
ใช้ ipnat ครับ
เปิด ipnat ให้ทำงานโดยเพิ่มในไฟล์ /etc/rc.conf ดังนี้
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"

แล้วเพิ่มกฎนี้เข้าไปใน /etc/ipnat.rules
rdr rl1 0.0.0.0/0 port 8081 -> 192.168.0.252 port 80 tcp

โดย rl1 คือการ์ดแลนใบที่ต้องการให้ forward มา อาจจะเป็น ip จริงฝั่งที่ต่อกับอินเตอร์เน็ต โดยพอร์ต 8081 คือหมายเลขพอร์ตที่เรียกเข้ามา
เช่น การ์ดแลนใบนี้(rl1)มี ip 202.222.123.5 ถ้าเรียกผ่าน potocol http ก็เรียกโดยhttp://202.222.123.5:8081มันก็จะ forward ไปที่ 192.168.0.252 พอร์ต 80

ตัวอย่าง
rdr rl1 0.0.0.0/0 port 8081 -> 192.168.0.252 port 80 tcp
rdr rl1 0.0.0.0/0 port 22 -> 192.168.0.3 port 22 tcp
rdr rl1 0.0.0.0/0 port 80 -> 192.168.0.4 port 80 tcp
rdr rl1 0.0.0.0/0 port 25 -> 192.168.0.4 port 25 tcp

   
เพิ่มเติมครับ
เครื่องที่ทำ port forwarding ต้องมีแลนการ์ดอย่างน้อยสองใบ คือ ip จริง กับ ip ปลอม

ถ้าทำ port forwarding จาก router ใช้คำสั่งดังนี้ครับ
ip nat inside source static tcp 192.168.0.50 80 interface serial0 80

โดย 192.168.0.50 80 คือ ip ปลอม กับ พอร์ต ที่ต้องการให้ forward มา

serial0 80 คือ interface ฝั่ง WAN ที่ออกเน็ต

/sbin/iptab/sbin/iptables -t nat -A PREROUTING -p tcp -s x/x -d [ip.address ฝั่ง wan ของคุณ] -i [wan-interface-name] --dport 80 -j DNAT --to-destination 192.168.1.100:80


กรณีที่เรามี web1, web2 ถ้ากำหนด rules แบบนี้มันจะงงมั๊ยครับ

rdr rl1 0.0.0.0/0 port 80 -> 192.168.0.4 port 80 tcp
rdr rl1 0.0.0.0/0 port 80 -> 192.168.0.5 port 80 tcp

กำหนดซ้อนกันไม่ได้ครับ ถ้า 2 เว็บก็ต้องรันกันคนละ port ครับ

งั้นต้องเป็นแบบนี้รึเปล่าครับ

rdr rl1 0.0.0.0/0 port 80 -> 192.168.0.4 port 80 tcp (web1)
rdr rl1 0.0.0.0/0 port 81 -> 192.168.0.5 port 80 tcp (web2)

แล้วเวลาเข้าเวปล่ะครับ กรณีที่เป็น web2 ต้องเป็น www.web2.com:81 รึเปล่าครับ ถ้าเป็นอย่างนี้เราจะมีวิธีแก้ยังงัยครับให้ user เค้าเข้าได้แบบปกติน่ะครับคือ

www.web2.com อย่างนี้เลย...รบกวนด้วยนะครับ ผมสงสัยจริงๆ ขอบคุณครับ

Sunday, October 23, 2011

Domain forwarding in Apache

Domain forwarding in Apache

Here's a short tutorial on one way to forward one domain to another in Apache, keeping Google happy as we go along.

The disclaimer bit

First of all this tutorial is based on Apache 2.2 on Centos 5. No responsibility will be taken for things going wrong so use at your own risk!

What we want to achieve

Let's say we have a client who wants to forward three domains to one. For this example let's use:
  • www.ilovemymonkeys.com
  • www.monkeysarecool.com
  • www.monkeysrockmyworld.com
The domain the client wants all of these forwarded to is
  • www.monkeyworld.com

Is it really worth it?

Well not really no. If you can pursuade the client it is probably best to park these additional domains that have been registered. There is not going to be a great deal of benefit, if any, for SEO. But if you really need to do it here's how.

What you'll need

This article assumes you have command line access to your box. If you don't then you'll need to contact your hosting company and explain your requirements

Virtual hosts

It is likely you'll be using Name Based Virtual Hosts in Apache. If you haven't set up Virtual Hosts it is a great way to manage sites so be sure to read up on it. Presuming you have an entry for monkeyworld.com we need to edit/create it in our virtual hosts file. The location of where you should place this varies depending on what flavour of Linux you are running. On Centos 5 you can create a file in /etc/httpd/conf.d with the appenedix .conf and it will be picked up when Apache is started.
vi /etc/httpd/conf.d/httpd-vhosts.conf 
NameVirtualHost *:80 
# Monkey World 
<VirtualHost *:80> 
  <Directory /var/www/vhosts/monkeysarecool.com/httpdocs> 
    AllowOverride All 
  </Directory> 
    DocumentRoot /var/www/vhosts/monkeysarecool.com/httpdocs 
    ServerName www.monkeysarecool.com 
    ServerAlias ilovemonkeys.com monkeysarecool.co.uk monkeysrockmyworld.co.uk 
    ServerAlias www.ilovemonkeys.com www.monkeysarecool.co.uk www.monkeysrockmyworld.co.uk Include /var/www/vhosts/monkeysarecool.com/conf/vhost.conf 
</VirtualHost> 
You'll see the lines Server Alias have listings for the domains both with www and without. This ensures you can receive requests with and without www. I like to put them on separate lines so I can see I have what's happening.
Finally there is an Include line. This points to an additional configuration file for the domain. You could use an .htaccess file here but if you have root access to the box it is much more efficient performance wise to put it in an additional configuration file.

Forwarding the domain

So far we've set up requests for Apache to serve up monkeyworld.com for our additional domains. You could leave it like this and restart Apache to have the same content served up on these domains. This is a bad thing for Google though and it is likely your rankings will slip down with duplicate content on multiple domains.
So we want to forward the domain. To do that lets open our additional configuration file:
vi /var/www/vhosts/monkeysarecool.com/conf/vhost.conf
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(monkeyworld.com|ilovemonkeys.com|monkeysarecool.co.uk|monkeysrockmyworld.co.uk) [NC] 
RewriteRule ^(.*)$ http://www.monkeyworld.com$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(www.ilovemonkeys.com|www.monkeysarecool.co.uk|www.monkeysrockmyworld.co.uk) [NC] 
RewriteRule ^(.*)$ http://www.circalibrary.com$1 [R=301,L]
We're using Apache's mod_rewrite to send redirect requests and return a 301 Moved Permanently Header. This should help Google and any other bots to understand what we're doing. Again I like separate entries for with and without www but that's personal preference.
Save this file. We should be done but before restarting Apache let's test that we haven't made any syntax errors that will stop the server from starting up.
/etc/init.d/httpd configtest
If you get "Syntax OK" you are good to restart the server:
/etc/init.d/httpd restart
All done! So now when you hit www.ilovemonkeys.com, monkeysarecool.co.uk or monkeysrockmyworld.co.uk you will be forwarded monkeyworld.com, with the address being changed as well.

 
Design by GURU