多條ADSL外部IP讀取NAT後的web server

以下說明如何使用多條ADSL ( 外部IP ) 讀取 NAT 後的 web server,然後再由相同的線路返回。

也就是線路 1 進來,線路 1 出去,藉此做到網站頻寬分流的效果。

 

應用:

你可以使用一台NAT,後面接一台 web server,在 NAT 主機上,可視需要增加 ADSL 的數量,分散網站流量。

當然設定每一個網站的 DNS www 的 ip 值時,必需分散到不同的 ADSL 固定 ip 上。

 

 

NAT 主機路由的分析

0:	from all lookup local
10:	from 210.242.226.205 lookup 10
20:	from 210.242.226.206 lookup 20
30:	from 122.117.172.247 lookup 30
100:	from all fwmark 0x100 lookup 100
200:	from all fwmark 0x200 lookup 200
300:	from all fwmark 0x300 lookup 300
32766:	from all lookup main
32767:	from all lookup default

第 10 ,20 ,30 條,主要是宣告,當來源端為 210.242.226.205 時,使用 table 10 的路由,也就是使用 eth2 出去,如下:

default via 210.242.226.254 dev eth2

[root@sun ~]# ip route show table 10
default via 210.242.226.254 dev eth2
[root@sun ~]# ip route show table 20
default via 210.242.226.254 dev eth3
[root@sun ~]# ip route show table 30
default via 122.117.172.247 dev ppp0
[root@sun ~]# ip route show table 100
default via 210.242.226.254 dev eth2
[root@sun ~]# ip route show table 200
default via 210.242.226.254 dev eth3
[root@sun ~]# ip route show table 300
default via 122.117.172.247 dev ppp0

而第 100, 200, 300 的 table ,主要宣告

被標上 mark 0x100 使用 table 100

被標上 mark 0x200 使用 table 200

被標上 mark 0x100 使用 table 300

而將封包標上 mark 的工作,由 iptables 處理

/*******************************************************************************************************************

* 以上是 NAT 主機路由的部份

*******************************************************************************************************************/

NAT 主機 iptables 分析

設定基本資料,設定內部 server 的區網 ip,和打閞封包轉傳模組功能

#!/bin/bash

DNSIP="192.168.0.100"
WWWIP="192.168.0.100"

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

重要 !!! 非常重要 !!! 不要只使用 all 或 *,測試結果無效 !!!

#echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
#echo 0 > /proc/sys/net/ipv4/conf/*/rp_filter

使用以下方式,但使用以下前,先要播接光世代產生 ppp0 介面,才能關閉核心逆向過濾功能
核心逆向過濾功能(Reverse Path Filtering),過濾不可能出現在某個網路介面的封包

參考:為什麼光世代pppoe 撥接斷線後,如果重新撥接成功,要再重新執行一次 shell script 的 iptables 規則 ?

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ppp0/rp_filter
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

非常重要 ! 因為 mangle 的語法卡了 1 個多月,重點是 mangle 的參數,把 ( 直接使用網卡裝置 ) 封包標上 mark 值,才能在經過路由時比對

#mangle
iptables -F -t mangle
iptables -X -t mangle
iptables -Z -t mangle

iptables -t mangle -A PREROUTING  -i eth2 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100
iptables -t mangle -A PREROUTING  -i eth3 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200
iptables -t mangle -A PREROUTING  -i ppp0 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x300
iptables -t mangle -A POSTROUTING -o eth2 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100
iptables -t mangle -A POSTROUTING -o eth3 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200
iptables -t mangle -A POSTROUTING -o ppp0 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x300
iptables -t mangle -A PREROUTING  -i eth0 -m conntrack  --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

然後是 NAT 的部份,主要是設定 DNAT ,讓外部 ip 可以讀取到區域內 server 的網頁資料

#nat
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat

#iptables -P PREROUTING ACCEPT
#iptables -P POSTROUTING ACCEPT
#iptables -P OUTPUT ACCEPT

iptables -t nat -A PREROUTING -d 210.242.226.205 -p udp --dport 53  -j DNAT --to-destination $DNSIP:53
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 53  -j DNAT --to-destination $DNSIP:53
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 80  -j DNAT --to-destination $WWWIP:80
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 20  -j DNAT --to-destination $WWWIP:20
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 21  -j DNAT --to-destination $WWWIP:21
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 25  -j DNAT --to-destination $WWWIP:25
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 110 -j DNAT --to-destination $WWWIP:110
iptables -t nat -A PREROUTING -d 210.242.226.205 -p tcp --dport 143 -j DNAT --to-destination $WWWIP:143

iptables -t nat -A PREROUTING -d 210.242.226.206 -p udp --dport 53  -j DNAT --to-destination $DNSIP:53
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 53  -j DNAT --to-destination $DNSIP:53
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 80  -j DNAT --to-destination $WWWIP:80
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 20  -j DNAT --to-destination $WWWIP:20
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 21  -j DNAT --to-destination $WWWIP:21
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 25  -j DNAT --to-destination $WWWIP:25
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 110 -j DNAT --to-destination $WWWIP:110
iptables -t nat -A PREROUTING -d 210.242.226.206 -p tcp --dport 143 -j DNAT --to-destination $WWWIP:143

iptables -t nat -A PREROUTING -d 122.117.172.247 -p tcp --dport 80  -j DNAT --to-destination $WWWIP:80
iptables -t nat -A PREROUTING -d 122.117.172.247 -p tcp --dport 25  -j DNAT --to-destination $WWWIP:25
iptables -t nat -A PREROUTING -d 122.117.172.247 -p tcp --dport 110 -j DNAT --to-destination $WWWIP:110
iptables -t nat -A PREROUTING -d 122.117.172.247 -p tcp --dport 143 -j DNAT --to-destination $WWWIP:143

必需要做 SNAT ,否則區網內真實的 server 無法經由 SNAT 把信寄到外面去

iptables -t nat -A POSTROUTING -o eth2 -s 192.168.0.0/24 -j SNAT --to-source 210.242.226.205
iptables -t nat -A POSTROUTING -o eth3 -s 192.168.0.0/24 -j SNAT --to-source 210.242.226.206
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j SNAT --to-source 122.117.172.247

最後是本機防火牆部份

#filter
# 清除所有防火牆規則,並建立全部阻擋封包進入
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# 所有的來自 lo 這個介面的封包,都予以接受
#iptables -A INPUT -i lo -j ACCEPT

# 對於自己所產生的連線,並且後續的要求封包都接受
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth3 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
#iptables -A INPUT -i eth1 -s 192.168.1.0/24 -j ACCEPT

# 對於 ping 要求的封包全部拒絕,不過對於自己發出去的 ping 封包要接受
#iptables -A INPUT -p icmp --icmp-type 8 -j DROP
#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
AICMP="0 3 3/4 4 8 11 12 14 16 18"
for tyicmp in $AICMP
do
  iptables -A INPUT -s 0/0 -p icmp --icmp-type $tyicmp -j ACCEPT
done

# 開放 ssh (22) 的 tcp port
iptables -A INPUT -p TCP -s 0/0 --dport 22 --sport 1024:65534 -j ACCEPT

#FTP
#iptables -A INPUT -p TCP --dport  21  --sport 1024:65534 -j ACCEPT
#iptables -A INPUT -p TCP --dport 65400:65410 --sport 1024:65534 -j ACCEPT

/*******************************************************************************************************************

* 以上是 NAT 主機裡的 iptables 設定值

*******************************************************************************************************************/

 

 Web Server 的 路由分析

使用預設值

0:	from all lookup local
32766:	from all lookup main
32767:	from all lookup default

/*******************************************************************************************************************

* 以上是 web server 裡的路由設定值

*******************************************************************************************************************/

 

 Web Server 的 iptables 設定分析

主要是做本機的防火牆

#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/scripts; export PATH

# Firewall iptables 

iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state  RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT

AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
  iptables -A INPUT -i eth0 -p icmp --icmp-type $tyicmp -j ACCEPT
done

#ssh
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22  -j ACCEPT

#web
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80  -j ACCEPT

#dns
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 53  -j ACCEPT
iptables -A INPUT -m state --state NEW -m udp -p udp --dport 53  -j ACCEPT

#mail
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 25  -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT

#ftp
iptables -A INPUT -p TCP -i eth0 -s 219.85.20.40 --dport 21 --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i eth0 -s 219.85.20.40 --dport 65400:65410 --sport 1024:65534 -j ACCEPT

iptables -A INPUT -p TCP -i eth0 -s 114.33.129.88 --dport 21 --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i eth0 -s 114.33.129.88 --dport 65400:65410 --sport 1024:65534 -j ACCEPT

/*******************************************************************************************************************

* 以上是 web server 裡的 iptables 設定值

*******************************************************************************************************************/

為了避免重開機遺失設定,需要另外寫成 shell scripts 檔案,掛載在 /etc/rc.local 開機執行