星期三, 十二月 31, 2008

IPTABLES + Traffic Sharping 腳本

最近家裡裝了一台 PentiumM 1.3G 的 Mini-ATX 小主板, 板子只花2千多元 (晚一個月就有3xxx 的 Atom了, 可惜). 這台主機的工作主要是:
  • 網路芳鄰 (Samba)
  • 老婆的合唱團論壇(Phpbb3)
  • VPN (pptpd)
  • NAT + DHCP + Firewall
  • 動物專用機 (mldonkey)
會用這片的原因有以下幾個:
  1. 這 Server 如果沒意外的話, 會 24HR 不關機, 所以省電我是的第一優先。
  2. PentiumM 1.3G 效能不弱, 雖然目前還沒有壓力測試過, 不過在網芳全速下 + IPTABLES + Traffic Sharping 腳本, 可讓 NAT 出去進來的資料不會受太大的影響。
  3. 這種 Mini-ATX 通常風扇聲不會太大, 我還想改裝成靜音風扇XD
重點是在下面的 Script, 使用以下的 Script 後, 主要功能是將這台電腦轉成 Firewall + NAT + Traffic Sharping 的功能, Traffic Sharping 作用像是 Windows 上的 cFosSpeed, 調整封包的優先順序來達到最佳化網路速度的功能.


#!/bin/bash

#######################################
#
# FTP bind 0.0.0.0
#
#
#######################################

# 請先輸入您的相關參數,不要輸入錯誤了!
  EXTIF="ppp0"              # 這個是可以連上 Public IP 的網路介面
  INIF="eth0"               # 內部 LAN 的連接介面;若無請填 ""
  INNET="192.168.2.0/24 192.168.10.0/24"    # 內部 LAN 的網域,若沒有內部 LAN 請設定為 ""
  export EXTIF INIF INNET

ifup $INIF
hdparm -m 16 -c 3 -A -a 256 -d 1 /dev/hda

modules="speedstep-centrino ppp-compress-18 ppp-compress-21 ppp-compress-24 ppp-compress-26"

for mod in $modules
do
testmod=`lsmod | grep "${mod} "`
  if [ "$testmod" == "" ]; then
    modprobe $mod
  fi
done

echo 1 > /sys/module/snd_ac97_codec/parameters/power_save
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
hal-disable-polling --device /dev/cdrom 'hal'
echo "conservative" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 第一部份,針對本機的防火牆設定!###########################
# 1. 先設定好核心的網路功能:
  echo "1" > /proc/sys/net/ipv4/tcp_syncookies
  echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/log_martians; do
        echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo "0" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo "0" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
        echo "0" > $i
  done

# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
  PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
  iptables -F
  iptables -X
  iptables -Z
  iptables  -P INPUT    DROP
  #iptables  -P INPUT    ACCEPT
  iptables  -P OUTPUT   ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

  #iptables -A INPUT -i $INIF -s 192.168.2.0/24 -j ACCEPT
  #iptables -A INPUT -i $INIF -s 192.168.10.0/24 -j ACCEPT
 
  iptables -A INPUT  -s 192.168.2.0/24 -j ACCEPT
  iptables -A INPUT  -s 192.168.10.0/24 -j ACCEPT
 
# 3. 啟動額外的防火牆 script 模組
  if [ -f /usr/local/virus/iptables/iptables.deny ]; then
        sh /usr/local/virus/iptables/iptables.deny
  fi
  if [ -f /usr/local/virus/iptables/iptables.allow ]; then
        sh /usr/local/virus/iptables/iptables.allow
  fi
  if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
        sh /usr/local/virus/httpd-err/iptables.http
  fi
 
  #iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

# 4. 允許某些類型的 ICMP 封包進入
  AICMP="0 3 3/4 4 11 12 14 16 18"
  for tyicmp in $AICMP
  do
     iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
  done

# 5. 允許某些服務的進入,請依照您自己的環境開啟

#iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 17563 -j DNAT --to 192.168.2.1:17563
#iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 9788 -j DNAT --to 192.168.2.1:9788

#iptables -t nat -A PREROUTING -p udp -i $EXTIF --dport 7446 -j DNAT --to 192.168.2.1:7446
#iptables -t nat -A PREROUTING -p udp -i $EXTIF --dport 17567 -j DNAT --to 192.168.2.1:17567
#iptables -t nat -A PREROUTING -p udp -i $EXTIF --dport 9788 -j DNAT --to 192.168.2.1:9788

# iptables -A INPUT -p TCP -i $EXTIF --dport  22  -j ACCEPT   # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport  25  -j ACCEPT   # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --sport  53  -j ACCEPT   # DNS
# iptables -A INPUT -p TCP -i $EXTIF --sport  53  -j ACCEPT   # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 110  -j ACCEPT   # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443  -j ACCEPT   # HTTPS

iptables -A INPUT -p TCP -i $EXTIF --dport  80  -j ACCEPT   # WWW
iptables -A INPUT -p TCP -i $EXTIF --dport  21  -j ACCEPT   # FTP
#iptables -A INPUT -p TCP -i $EXTIF --dport  222  -j ACCEPT   # ssh
iptables -A INPUT -p TCP -i $EXTIF --dport  113  -j ACCEPT   # auth

iptables -A INPUT -p TCP -i $EXTIF --dport  1723  -j ACCEPT   # pptp

iptables -A INPUT -p TCP -i $EXTIF --dport  443  -j ACCEPT   # pptp

iptables -A INPUT -p gre -i $EXTIF  -j ACCEPT   # pptp

##################### mldonkey #####################################

#tcp        0      0 192.168.2.1:4000        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:4001        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:4080        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:6000        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:18617       0.0.0.0:*               LISTEN      7461/mlnet
#udp        0      0 192.168.2.1:18617       0.0.0.0:*                           7461/mlnet
#udp        0      0 192.168.2.1:6004        0.0.0.0:*                           7461/mlnet
#udp        0      0 192.168.2.1:2684        0.0.0.0:*                           7461/mlnet




iptables -A INPUT -p TCP -i $EXTIF --dport  6890  -j ACCEPT   # rtorrent
iptables -A INPUT -p TCP -i $EXTIF --dport  6000  -j ACCEPT   # mldonkey
iptables -A INPUT -p TCP -i $EXTIF --dport  18617  -j ACCEPT   # mldonkey

iptables -A INPUT -p UDP -i $EXTIF --dport  18617  -j ACCEPT   # mldonkey
iptables -A INPUT -p UDP -i $EXTIF --dport  2684  -j ACCEPT   # mldonkey
iptables -A INPUT -p UDP -i $EXTIF --dport  6004  -j ACCEPT   # mldonkey

# 第二部份,針對後端主機的防火牆設定!##############################
# 1. 先載入一些有用的模組
  modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
  for mod in $modules
  do
        testmod=`lsmod | grep "${mod} "`
        if [ "$testmod" == "" ]; then
                modprobe $mod
        fi
  done

# 2. 清除 NAT table 的規則吧!
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  iptables -t nat -P PREROUTING  ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT      ACCEPT

# 3. 開放成為路由器,且為 IP 分享器!
  if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
      for innet in $INNET
      do
        iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
      done
    fi
  fi
  # 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
  # 可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍
 
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
          

# 4. 內部伺服器的設定:

#iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 6881 -j DNAT --to 192.168.2.1:6881
#iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 6882 -j DNAT --to 192.168.2.1:6882

################################# FTP ##################################


#iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 21 -j DNAT --to 192.168.2.1:21
#iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to 192.168.1.1:80
################################# mlDonkey ##################################
#tcp        0      0 192.168.2.1:4000        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:4001        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:4080        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:6000        0.0.0.0:*               LISTEN      7461/mlnet
#tcp        0      0 192.168.2.1:18617       0.0.0.0:*               LISTEN      7461/mlnet
#udp        0      0 192.168.2.1:18617       0.0.0.0:*                           7461/mlnet
#udp        0      0 192.168.2.1:6004        0.0.0.0:*                           7461/mlnet
#udp        0      0 192.168.2.1:2684        0.0.0.0:*                           7461/mlnet

iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 6890 -j DNAT --to 192.168.2.1:6890  #rtorrent

iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 6000 -j DNAT --to 192.168.2.1:6000
iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 18617 -j DNAT --to 192.168.2.1:18617

iptables -t nat -A PREROUTING -p udp -i $EXTIF --dport 18617 -j DNAT --to 192.168.2.1:18617
iptables -t nat -A PREROUTING -p udp -i $EXTIF --dport 2684 -j DNAT --to 192.168.2.1:18033
iptables -t nat -A PREROUTING -p udp -i $EXTIF --dport 6004 -j DNAT --to 192.168.2.1:6004

iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 443 -j DNAT --to 192.168.2.1:222
#iptables -t nat -A PREROUTING -p tcp  --dport 443 -j REDIRECT --to-ports 1723

################################## TC #######################################

TC=/sbin/tc
IPTABLES=/sbin/iptables

$IPTABLES -t mangle -F
$TC qdisc del dev ppp0 root
$TC qdisc del dev ppp0 ingress

$TC qdisc add dev ppp0 root handle 1: htb default 14
$TC class add dev ppp0 parent 1: classid 1:1 htb rate 230kbps burst 4k prio 0
$TC class add dev ppp0 parent 1:1 classid 1:11 htb rate 16kbps ceil 230kbps burst 8k prio 1
$TC class add dev ppp0 parent 1:1 classid 1:12 htb rate 16kbps ceil 230kbps burst 8k prio 2
$TC class add dev ppp0 parent 1:1 classid 1:13 htb rate 8kbps ceil 230kbps burst 8k prio 3
$TC class add dev ppp0 parent 1:1 classid 1:14 htb rate 8kbps ceil 230kbps burst 8k prio 4
$TC class add dev ppp0 parent 1:1 classid 1:15 htb rate 4kbps ceil 230kbps burst 8k prio 5

$TC qdisc add dev ppp0 parent 1:11 handle 11: pfifo
$TC qdisc add dev ppp0 parent 1:12 handle 12: sfq perturb 10
$TC qdisc add dev ppp0 parent 1:13 handle 13: sfq perturb 10
$TC qdisc add dev ppp0 parent 1:14 handle 14: sfq perturb 10
$TC qdisc add dev ppp0 parent 1:15 handle 15: sfq perturb 10

$TC filter add dev ppp0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
$TC filter add dev ppp0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
$TC filter add dev ppp0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
$TC filter add dev ppp0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14
$TC filter add dev ppp0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:15

$TC qdisc add dev ppp0 handle ffff: ingress
$TC filter add dev ppp0 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate 1126kbps burst 32k drop
#flowid :1

$IPTABLES -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 1
$IPTABLES -t mangle -A OUTPUT -p tcp -m length --length :64 -j RETURN

$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

$IPTABLES -t mangle -A POSTROUTING  -m tos --tos Minimize-Delay -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING  -m tos --tos Minimize-Delay -j RETURN

# Ping
$IPTABLES -t mangle -A POSTROUTING  -p icmp -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p icmp -j RETURN

## DNS
$IPTABLES -t mangle -A POSTROUTING  -p udp -m udp --dport 53 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p udp -m udp --dport 53 -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p udp -m udp --sport 53 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p udp -m udp --sport 53 -j RETURN

## FTP
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport ftp -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport ftp -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport ftp -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport ftp -j RETURN

$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport ftp-data -j MARK --set-mark 5
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport ftp-data -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport ftp-data -j MARK --set-mark 5
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport ftp-data -j RETURN

## SSH
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 22 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 22 -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 22 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 22 -j RETURN

## Telnet
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 23 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 23 -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 23 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 23 -j RETURN

## SSL
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 443 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 443 -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 443 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 443 -j RETURN

## MSN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 1863 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 1863 -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 1863 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 1863 -j RETURN

# WWW
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 80 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --dport 80 -j RETURN
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 80 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING  -p tcp -m tcp --sport 80 -j RETURN

# L7(eDonkey/BT)
#$IPTABLES -t mangle -A POSTROUTING -m layer7 --l7proto edonkey  -j MARK --set-mark 5
#$IPTABLES -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent  -j MARK --set-mark 5

## High Throughput
$IPTABLES -t mangle -A POSTROUTING  -m tos --tos Maximize-Throughput -j MARK --set-mark 5
$IPTABLES -t mangle -A POSTROUTING  -m tos --tos Maximize-Throughput -j RETURN

## Normal Packet
$IPTABLES -t mangle -A POSTROUTING  -m mark --mark 0 -j MARK --set-mark 4
$IPTABLES -t mangle -A POSTROUTING  -m mark --mark 0 -j RETURN


STRING="`date`"
touch "/tmp/$STRING"


Reference:
    鳥哥的 NAT 教學


0 意見:

 
template hacks by: [ METAMUSE ]