歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 網吧使用的Nat+Iptables+Squid的腳本

網吧使用的Nat+Iptables+Squid的腳本

日期:2017/3/6 15:48:47   编辑:關於Unix
#!/bin/bash # 飄飄的風於2003年7月26日修改,端口影射成功。 ###--------------------------------------------------------------------### #以下是定義變數 ###--------------------------------------------------------------------### PATH=/sbin:/usr/
  #!/bin/bash
  # 飄飄的風於2003年7月26日修改,端口影射成功。
  
  ###--------------------------------------------------------------------###
  #以下是定義變數
  ###--------------------------------------------------------------------###
  
  PATH=/sbin:/usr/sbin:/bin:/usr/bin
  RC_SQUID=/etc/rc.d/init.d/squid
  EXT_IF=eth1
  #外網接口,確定網卡,如果是撥號就用ppp0
  INT_IF=eth0
  LAN_IP_RANGE="192.168.0.0/24"
  STATIC_IP="80.234.71.88"
  TRUSTED_TCP_PORT="22 25 53 80 110 143 443 993 995 3389"
  TRUSTED_UDP_PORT="53 3389"
  ALLOWED_ICMP="0 3 3/4 4 11 12 14 16 18"
  
  ###--------------------------------------------------------------------###
  #確定iptables安裝情況
  ###--------------------------------------------------------------------###
  
  which iptables &>/dev/null || {
  echo
  echo "$(basename $0): iptables程序沒有找到"
  echo "請先安裝好這個程序."
  echo
  exit 1
  }
  
  ###--------------------------------------------------------------------###
  #廢掉ipchains,這是針對redhat以前的版本,新版已經把iptables嵌到內核裡了
  ###--------------------------------------------------------------------###
  
  lsmod | grep ipchains &>/dev/null && {
  echo "正在廢掉ipchains服務........."
  rmmod ipchains
  }
  
  ###--------------------------------------------------------------------###
  #裝載模塊modules
  ###--------------------------------------------------------------------###
  
  echo "模塊正在載人......"
  modprobe ip_tables &>/dev/null || {
  echo -n "$(basename $0): ip_tables模塊載人失敗"
  echo "請檢查"
  exit 3
  }
  for file in /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_conntrack_*.o
  do
  module=$(basename $file)
  modprobe ${module%.*} &>/dev/null
  done
  for file in /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_nat_*.o
  do
  module=$(basename $file)
  modprobe ${module%.*} &>/dev/null
  done
  
  # ------------- 端口開啟 ------------
  echo "開啟所要的端口...."
  iptables -N services
  for PORT in $TRUSTED_TCP_PORT; do
  iptables -A services -i $EXT_IF -p tcp --dport $PORT -j ACCEPT
  done
  for PORT in $TRUSTED_UDP_PORT; do
  iptables -A services -i $EXT_IF -p udp --dport $PORT -j ACCEPT
  done
  #----ipforwarding--------
  echo "打開foward功能"
  echo "1" > /proc/sys/net/ipv4/ip_forward
  
  #動態ip使用
  #
  #echo "1" > /proc/sys/net/ipv4/ip_dynaddr
  #這裡是動態ip實現nat共享必改之處
  
  ###---------------------------------------------------###
  #清除先前的設定
  ###---------------------------------------------------###
  echo "正在清除先前的設定......."
  #清除預定表filter中,所有規則鏈中的規則
  iptables -F
  #清除預定表filter中,使用者自定鏈中的規則
  iptables -X
  
  #清除預定表mangle中,所有規則鏈中的規則
  iptables -F -t mangle
  #清除預定表mangle中,使用者自定鏈中的規則
  iptables -X -t mangle
  
  #清除nat表中的規則
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  
  ###---------------------------------------------------###
  #設定預設規則
  ###---------------------------------------------------###
  #預設規則要麼為全部丟棄,要麼為全部接受
  #本列為全部丟棄,然後逐步開放,這是安全系數很高的設法
  #若目標為DROP,則policy設為ACCEPT;若目標為ACCEPT,則policy設為DROP
  
  iptables -P INPUT DROP
  iptables -P OUTPUT DROP
  iptables -P FORWARD DROP
  
  #TCP的設定
  #
  #我們丟棄壞的TCP包
  #
  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
  
  #局域網共享的實現
  #iptables -t nat -A POSTROUTING -o $EXT_IF -s $LAN_IP_RANGE -j SNAT --to-source $STATIC_IP
  iptables -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE
  echo "局域網共享的已實現,請試用局域網機器"
  
  #這一步實現局域網內部機對外部網開放
  #凡對$STATIC_IP:80連線者,則轉址到192.168.0.100:80
  iptables -t nat -A PREROUTING -d 80.234.71.88 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
  iptables -A FORWARD -p tcp -d 192.168.0.100 --dport 80 -j ACCEPT
  iptables -t nat -I POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp -d 192.168.0.100 --dport 80 -j SNAT --to 192.168.0.1
  #192.168.0.250裝有win2003,提供遠程桌面服務
  iptables -t nat -A PREROUTING -d 80.234.71.88 -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.250:3389
  iptables -A FORWARD -p tcp -d 192.168.0.250 --dport 3389 -j ACCEPT
  #允許內網機使用外網機的IP訪問內網機,把內網機的IP轉換成網關IP
  iptables -t nat -I POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp -d 192.168.0.250 --dport 3389 -j SNAT --to 192.168.0.1
  
  #允許要轉向的包
  iptables -A FORWARD -i $INT_IF -j ACCEPT
  iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
  #對於不管來自哪裡的ip碎片都進行控制,允許每秒通過100個碎片
  iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
  #icmp包通過的控制,防止icmp黑客攻擊
  iptables -A FORWARD -p udp -d $LAN_IP_RANGE -i $EXT_IF -j ACCEPT
  #這一條是針對oicq等使用udp服務而接收所有的udp包
  
  #開放主機的ssh port 22,使內部機以ssh連至外部
  iptables -A OUTPUT -o $EXT_IF -p tcp -s $STATIC_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
  iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 22 -d $STATIC_IP --dport 1024:65535 -j ACCEPT
  
  #防止外網用內網ip欺騙
  iptables -t nat -A PREROUTING -i $EXT_IF -s 192.168.0.0/16 -j DROP
  iptables -t nat -A PREROUTING -i $EXT_IF -s 10.0.0.0/8 -j DROP
  iptables -t nat -A PREROUTING -i $EXT_IF -s 172.16.0.0/12 -j DROP
  
  #-----------透明代理------------
  $RC_SQUID status | grep pid &>/dev/null && {
  echo "透明代理實現"
  INT_IP=$(ifconfig | grep $INT_IF -A 1 | awk '/inet/ {print $2}' | sed -e s/addr\://)
  if [ -z "$INT_IP" ]; then
  echo
  echo "$(basename $0): $INT_IF沒有IP存在"
  echo "請檢查$INT_IF是否正確配置了"
  echo
  exit 3
  fi
  }
  exit 0
  ## EOS

Copyright © Linux教程網 All Rights Reserved