一个高效、安全、通用的防火墙共享上网脚本

发表于:2007-07-04来源:作者:点击数: 标签:
很多人反复在问 Linux 如何设置才能实现共享上网,干脆写一个步骤出来吧 [b:77c4f4ee07]1、vi/usr/local/sbin/firewall[/b:77c4f4ee07] [code:1:77c4f4ee07] #!/bin/bash #ProjectbyPlatinum,2005-05-12 #SetMODELANorADSL MODE=ADSL #Setdefaultgateway如果

很多人反复在问Linux如何设置才能实现共享上网,干脆写一个步骤出来吧

[b:77c4f4ee07]1、vi /usr/local/sbin/firewall[/b:77c4f4ee07]
[code:1:77c4f4ee07]
#! /bin/bash
# Project by Platinum, 2005-05-12"

# Set MODE (LAN or ADSL)
MODE="ADSL"

# Set default gateway (如果MODE==ADSL,此项可以忽略)
GATEWAY="外网网关"

# Set Interface WAN (如果MODE==ADSL,此项可以忽略)
WAN_IP="外网IP地址"
WAN_ETH="外网网卡"
WAN_MASK="外网掩码"

# Set Interface LAN
LAN_IP="内网IP地址"
LAN_NET="内网网络地址"
LAN_ETH="内网网卡"
LAN_MASK="内网掩码"

# Set manager
MANAGER_IP="内网管理员IP"
MANAGER_MAC="内网管理员MAC"

# Initialize modules
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward

# Initialize Interface LAN
ifconfig $LAN_ETH $LAN_IP netmask $LAN_MASK

# Initialize policy
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -F
iptables -t nat -F

# Deny ACK attack
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP

# Initialize Rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i $LAN_ETH -s $MANAGER_IP -m mac --mac-source $MANAGER_MAC -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

case "$MODE" in
   LAN)
      # Initialize Interface WAN
      ifconfig $WAN_ETH $WAN_IP netmask $WAN_MASK
      iptables -t nat -A POSTROUTING -s $LAN_NET -o $WAN_ETH -j SNAT --to $WAN_IP
   ;;
   ADSL)
      iptables -t nat -A POSTROUTING -s $LAN_NET -o ppp0 -j MASQUERADE
      GATEWAY=`ifconfig ppp0|grep inet|awk '{print $3}'|awk -F: '{print $2}'`
   ;;
esac

ip route replace default via $GATEWAY
[/code:1:77c4f4ee07]

[b:77c4f4ee07]2、chmod 700 /usr/local/sbin/firewall[/b:77c4f4ee07]
  只有root权限才能读写执行

[b:77c4f4ee07]3、echo "/usr/local/sbin/firewall" >> /etc/rc.local[/b:77c4f4ee07]
  让系统启动后自动执行脚本

[b:77c4f4ee07]4、reboot[/b:77c4f4ee07]
  重启系统

自己根据自己的情况改一下就可以了,应该不难懂

[color=red:77c4f4ee07]
注意:
如果是直接设置IP上网,MODE选择LAN
如果是用PPPOE拨号上网,MODE选择ADSL,且保证在执行这个脚本之前已经拨号
[/color:77c4f4ee07]

 双眼皮的猪 回复于:2005-05-12 08:55:57
我靠....
00:58,斑竹真是煞费苦心啊....
顶顶顶....

 采风 回复于:2005-05-12 09:21:40
脚本这个东西偶就纳闷,一句话就能写明白的东西要写一百句。。。 :roll:

 platinum 回复于:2005-05-12 09:23:42
[quote:8ae00c010d="采风"]脚本这个东西偶就纳闷,一句话就能写明白的东西要写一百句。。。 :roll:[/quote:8ae00c010d]
这个修改起来非常方便,而且很智能啊! :mrgreen: 
不知道好表说不好,小心我揭你老底 :twisted:

 zxz0220 回复于:2005-05-12 09:26:20
版主辛苦了,感动ing ,支持!!!

 saiy828 回复于:2005-05-12 09:49:44
谢谢  收藏

 寂寞烈火 回复于:2005-05-12 10:59:29
学习

 platinum 回复于:2005-05-12 11:01:18
[quote:334ff7f9a3="寂寞烈火"]学习[/quote:334ff7f9a3]
写的不好,烈火哥多指点指点 :em06:

 万里北国 回复于:2005-05-12 17:02:17
支持!

 惠繪洋 回复于:2005-05-12 17:35:57
很好的東西, 一可收藏, 二可學習. Yeah.... :D

 linker_yxj 回复于:2005-05-12 18:40:13
# Set Interface WAN
WAN_IP="外网卡地址"
WAN_ETH="eth0"
WAN_MASK="外网卡掩码地址" 

我是ADSL,没有固定IP怎么办?

# Set manager
MANAGER_IP="内网管理员IP"
MANAGER_MAC="XX:XX:XX:XX:XX:XX" 
这句是什么意思?

 platinum 回复于:2005-05-12 18:58:23
[quote:1af1685357="linker_yxj"]# Set Interface WAN
WAN_IP="外网卡地址"
WAN_ETH="eth0"
WAN_MASK="外网卡掩码地址" 

我是ADSL,没有固定IP怎么办?
[/quote:1af1685357]
ADSL可以不设置WAN_IP和WAN_MASK,MODE要写成ADSL

[quote:1af1685357]
# Set manager 
MANAGER_IP="内网管理员IP" 
MANAGER_MAC="XX:XX:XX:XX:XX:XX" 
这句是什么意思?
[/quote:1af1685357]
这个是允许内网某个IP完全访问Linux,且绑定MAC,其他人无权访问

 windowsnt 回复于:2005-05-12 21:57:36
4、reboot
  重启系统 

不好

 platinum 回复于:2005-05-12 22:24:12
[quote:087d1937a8="windowsnt"]4、reboot
  重启系统 

不好[/quote:087d1937a8]
可做可不做,随你啦 :mrgreen:

 lotsunhim 回复于:2005-05-13 02:11:31
如果我要指定两个内网管理员IP,规则怎么写呢?再加多一条上去吗。

 wind521 回复于:2005-05-13 09:37:28
顶一把

 云海天涯 回复于:2005-05-13 14:23:40
反正我也没有做过,也许以后能用的着的!

 hellolinux 回复于:2005-05-13 16:52:29
唉,看不懂.

 oid2000 回复于:2005-05-14 00:31:39
顶一个!

 零二年的夏天 回复于:2005-05-14 09:10:47
白金兄是为大家提供一个很好的思路,也是方法。
但是具体的你的环境如何,需要什么规则还是需要具体处理的。
随随便便用别人的脚本不是好习惯。

-----------------------
白兄辛苦!;)

 platinum 回复于:2005-05-14 10:22:29
[quote:cb935e877d="零二年的夏天"]白金兄是为大家提供一个很好的思路,也是方法。
但是具体的你的环境如何,需要什么规则还是需要具体处理的。
随随便便用别人的脚本不是好习惯。

-----------------------
白兄辛苦!;)[/quote:cb935e877d]
 :shock: 
今天你不教课啦?看你早上一下灌这么多 :em17:

 網中人 回复于:2005-05-14 13:15:48
算不錯了. 
不過, ICMP 好像沒能通過, 在某些複雜一點的網絡環境下, 或會有意想不到的"驚喜"....  ^_^

 phiazat 回复于:2005-05-14 13:29:22
版主辛苦了,感动ing

 platinum 回复于:2005-05-14 17:11:17
[quote:138a51fd90="網中人"]算不錯了. 
不過, ICMP 好像沒能通過, 在某些複雜一點的網絡環境下, 或會有意想不到的"驚喜"....  ^_^[/quote:138a51fd90]
ICMP没能通过?怎讲?

 xiaojianredhat 回复于:2005-05-14 23:11:27
谢谢platinum      老师,呵呵

 xiaojianredhat 回复于:2005-05-14 23:33:06
ip route replace default via $GATEWAY 
怎么解释

 網中人 回复于:2005-05-14 23:33:08
[quote:9fd20249d8="platinum"]
ICMP没能通过?怎讲?[/quote:9fd20249d8]
那你跟我說, 哪一行會讓 ICMP 通過?

 platinum 回复于:2005-05-14 23:47:15
[quote:2fa84a2fe3="網中人"]
那你跟我說, 哪一行會讓 ICMP 通過?[/quote:2fa84a2fe3]
case "$MODE" in 
   LAN) 
      # Initialize Interface WAN 
      ifconfig $WAN_ETH $WAN_IP netmask $WAN_MASK 
      iptables -t nat -A POSTROUTING -s $LAN_NET -o $WAN_ETH -j SNAT --to $WAN_IP 
   ;; 
   ADSL) 
      iptables -t nat -A POSTROUTING -s $LAN_NET -o ppp0 -j MASQUERADE 
      GATEWAY=`ifconfig ppp0|grep inet|awk '{print $3}'|awk -F: '{print $2}'` 
   ;; 
esac 

其中POSTROUTING允许了内网NAT出去,况且filter表的FORWARD链没做限制,难道这样还不让icmp协议通过吗?

 網中人 回复于:2005-05-14 23:50:19
icmp 一般是外面送回的, 
那才叫 control messages 啊........

 platinum 回复于:2005-05-14 23:52:37
内网是可以ping出去的,这样能否证明是允许icmp通过的呢?

 網中人 回复于:2005-05-14 23:54:36
ping 只用到 type8 與 type0
且是受 -m state --state ESTABLISHED 所影響, type0 才得以回來.

其它的 type & error code 呢???

 platinum 回复于:2005-05-15 00:06:12
[quote:a49b66c893="網中人"]ping 只用到 type8 與 type0
且是受 -m state --state ESTABLISHED 所影響, type0 才得以回來.

其它的 type & error code 呢???[/quote:a49b66c893]
首先,这个脚本里面只有INPUT链做了--state ESTABLISHED
然后刚才我又做了一个试验,去掉了那行,仍然可以ping出
可见,ping出去是发送type 8,pong的时候回送type 0不是通过INPUT链的--state ESTABLISHED来完成的

 網中人 回复于:2005-05-15 00:09:46
INPUT 是送進來這台機, 你在於 localhost 試試?
若是在 lan 後的話, 你的 FORWARD 本就是 ACCEPT, 能回來, 是因為出去有被 MASQUEARADE...

你上次在跟人家討論時, 不是引用過 Source Quench 這個 type 嗎?
想想看, 若 ISP router 送回 Source Quench, 如何才可穿過你的 firewall ?
又, 既然 masq 了, ICMP 會送回哪裡? 走 INPUT 還是 DORWARD ?

p.s.
以下是一些嘮叨, 講過這次, 以後就不再提了.
查過你的文章, 一年多前我就有跟你有過 iptables 相關的討論了.
但總感覺你對很多東西, 只知其然不知其所以然...
我也在 QQ 多次建議你先補 tcp/ip 基礎, 書單也幫你列好了.
不過, 似乎你並沒有去做, 唉...
若繼續下去, 我想你的水平較難再上一個台階了,
就算上層的技巧用得多嫻熟, 也只能如此了.

sorry, 說實話或不好聽, 說忠言就更逆耳. 不過, 我保證只說這次了. 以後好自為之吧.

 platinum 回复于:2005-05-15 00:17:38
是的,TCP/IP的知识很有欠缺,又是shell、又是TCP/IP、又是工作,确实没什么进展,却又总想做些东西,所以确实有些浮躁的感觉
以后我会继续努力的,谢谢网哥教诲 :|

 cx6445 回复于:2005-05-15 18:16:29
TCP/IP基础不难的,又不是要编程实现,IPTABLES要用到的知识看几天就成了

 guliny 回复于:2005-05-16 15:53:07
网中人这兄弟,做学问的钻研精神,确实是让人受益多多的,从你的网站上学习了NAT的知识,讲得通俗易懂,让我更深入的学习了linux的相关知识,呵,一直没有机会向你说一声谢谢,在这里,向你说一声谢谢啦!
platinum ,自由分享的精神,也真得大家尊敬!

 guliny 回复于:2005-05-16 16:26:11
呵,网中人兄弟近来很忙吧,有一阵子没有看见你的网站进行更新了;
呵,期待着你的新的更新哟!

 jeffreyli 回复于:2005-05-18 18:22:54
版主精神可嘉啊,,,,


谢谢了! :em02:

 chrisyan 回复于:2005-05-23 14:23:22
还要多谢版主,能够为大家尽力就好,谁也不保证能够完全正确吧,呵呵,这才需要大家互相讨论学习的。
比较佩服网大哥的技术,图片上是你的儿子吧?

 *linux* 回复于:2005-06-25 17:09:31
巴是
总算找到了
谢谢了

原文转自:http://www.ltesting.net