📄 1629.html
字号:
<TR>
<TD vAlign=top align=middle width="60%">
<TABLE cellSpacing=0 cellPadding=0 width="100%"
background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
<TBODY>
<TR>
<TD vAlign=top width="80%">
<DIV align=center>
<FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
</FORM>
<TABLE cellSpacing=0 cellPadding=0 width="95%"
border=0><TBODY>
<TR>
<TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif"
height=30></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=3 width="95%"
align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top>
<p><FONT class=normalfont><B><font color=blue>透明防火墙架设的完全攻略(bridge+iptables+squid)</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:作者<br>来自:Linux知识宝库<br>联系方式:无名<br><br>架设透明代理和防火墙是linux平台上很热的话题,在水木上也有相关文章,但完全的攻略在公网上也很少,最近架了一台,前后花去一个多星期(我这人手脚慢,别笑,中间笑话也颇多)觉得还是把过程写下来的好,可以让人依葫芦画瓢。<br>
<br>
先把网络环境说一下,一个200人左右的局域网,一个C class,一台路由器做NAT(一个公网ip)。网络环境还是很简单的,目的就是在路由器和局域网间加一台透明防火墙进去,同时完成cache server的功能。我不想让防火墙做nat,一是因为已经有了一台路由器,要物尽其用。二是 nat其实也是很耗资源的事(尤其当下面的clients特别多时,对router cpu的要求还是很高的,我就碰到过一台cisco 75XX 路由器拖1000个用户5分钟死一次机的事,后来不得已架了一台PIX做NAT)还是分分开的好。三是万一cache server 趴下了,只要把链路重新旁接一下,网络照样用(顶多性能不好),不会影响用户。<br>
<br>
防火墙的平台为一P4 2.4G server, 512M内存,2×80GHD,两块NIC。安装的是RH8.0 kernel 2.4.20(原来想装gentoo的,但要命的1.4到现在才刚到RC3,等不及了,偷了一把懒~_~)<br>
<br>
先下载bridge做桥接,bridge的作用就是让两块网卡变成一个桥设备,让两端的网络端口完全透明地转发packets,而让 iptables起到blocking的作用。下载地址为http://bridge.sourceforge.net(什么?sourceforge?不知道上不去啊!没办法,因为众所周知的原因,大伙找https proxy绕上去吧!)需下载bridge-utils-0.9.6.tar.gz和 bridge-nf-0.0.7-against-2.4.19.diff。(这个很重要,否则iptables无法拦截转发过来的packets)<br>
<br>
再到http://netfilter.samba.org下载iptables,并到www.linuxhq.xom下载最新的kernel及patch。<br>
<br>
在/usr/src下释放kernel,进入/usr/src/linux,并把bridge的patch打上,patch –p1 < bridge-nf-0.0.7-against-2.4.19.diff.<br>
<br>
最后还有个问题,此时用ifconfig看到的流量,在过了4G之后就会被置0,然后从头开始,很不爽。这是因为 'RX bytes' and 'TX bytes'等变量的数据类型为 unsigned long,即2^32,到了4G就重置,其实把它们改成 unsigned long long(2^64)就可以了。更改<br>
/usr/src/linux/include/linux/netdevice.h 和../linux/net/core/dev.c,以下是打patch时的记录,找到文件改掉相应代码即可。<br>
<br>
diff -urN linux-orig/include/linux/netdevice.h linux/include/linux/netdevice.h <br>
--- linux-orig/include/linux/netdevice.h <br>
+++ linux/include/linux/netdevice.h <br>
@@ -96,10 +96,10 @@ <br>
<br>
<br>
struct net_device_stats <br>
{ <br>
- unsigned long rx_packets; /* total packets received */ <br>
- unsigned long tx_packets; /* total packets transmitted */ <br>
- unsigned long rx_bytes; /* total bytes received */ <br>
- unsigned long tx_bytes; /* total bytes transmitted */ <br>
+ unsigned long long rx_packets; /* total packets received */ <br>
+ unsigned long long tx_packets; /* total packets transmitted */ <br>
+ unsigned long long rx_bytes; /* total bytes received */ <br>
+ unsigned long long tx_bytes; /* total bytes transmitted */ <br>
unsigned long rx_errors; /* bad packets received */ <br>
unsigned long tx_errors; /* packet transmit problems */ <br>
unsigned long rx_dropped; /* no space in linux buffers */ <br>
<br>
diff -urN linux-orig/net/core/dev.c linux/net/core/dev.c <br>
--- linux-orig/net/core/dev.c <br>
+++ linux/net/core/dev.c <br>
@@ -1689,7 +1689,7 @@ <br>
int size; <br>
<br>
<br>
if (stats) <br>
- size = sprintf(buffer, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu %8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu", <br>
+ size = sprintf(buffer, "%6s:%8llu %7llu %4lu %4lu %4lu %5lu %10lu %9lu %8llu %7llu %4lu %4lu %4lu %5lu %7lu %10lu", <br>
dev->name, <br>
stats->rx_bytes, <br>
stats->rx_packets, stats->rx_errors, <br>
<br>
这样编译后,ifconfig的4G重置问题就被消除了。<br>
<br>
下面就是重新编译kernel了,make menuconfig.....<br>
注意,除了要把该编译进去的驱动编进去(象NIC什么的,我第一次编时就漏了一块网卡,汗ing)还要把最重要的iptables给enable 起来,进入Network Options,选中Network Packet filtering (replaces ipchains),这样就会打开IP: Netfilter Configuration --> 子菜单,进入,选中里面所有的选项,然后回到 Network Options菜单,选中“802.1d Ethernet Bridging” 和 “netfilter (firewalling) support”两个选项(一看就知道很重要。)<br>
退出,开编。<br>
make dep<br>
make modules<br>
make modules_install<br>
make bzImage<br>
完成后cp /usr/src/linux/arch/i386/bzImage /boot/bzImage.bridge<br>
然后把System.map拷至/boot下再在lilo或grub中更改相应配置即可(这就不细说了,重编kernel的文章到处都有。)<br>
<br>
重起,如果正常,开始下一步,tar –xzvf bridge-utils-0.9.6.tar.gz. <br>
cd ./bridge-utils-0.9.3<br>
make <br>
make install(编译bridge并安装,具体的安装目录可在make文件生成时指定。)<br>
完毕后可以先试试bridge的基本命令。如brctl addbr mybridge (创建bridge mybridge,然后用ifconfig查看会发现多了一个mybridge端口)<br>
brctl addif mybridge eth0 <br>
brctl addif mybridge eth1 (把eth0和eth1包含到mybridge中)<br>
然后需要对各端口做以下动作<br>
ifconfig eth0 0.0.0.0 promisc <br>
ifconfig eth1 0.0.0.0 promisc(打开混杂模式)<br>
这时桥接即已成功,从router和局域网转发过来的消息开始通过机器,这时你会发觉满屏的tcp/ip转发消息让你无法下手,硬盘也狂转,这是 syslogd和klogd做的怪,log的priviledge设得太低,改掉它。telnet 进入机器(这时你只能telnet,console上已经泛滥成灾。)kill 掉syslogd和klogd,在/etc/syslog.conf中屏蔽掉*.info至 /var/log/messages的rules(一开始我不知道这个,结果第一天下午连到网络上去,第二天上午一看,/var/log下的 messages居然有2.7G,My God),并修改/etc/init.d/syslog,在daemon klogd 一项后加上-2 -c 4 (提高klogd的消息转发级别),重起syslogd,哈哈,整个世界清净了!!!<br>
<br>
其实我们也可以写个启动脚本放在/etc/init.d中,如下:<br>
#!/bin/bash<br>
<br>
. /etc/init.d/functions<br>
<br>
<br>
return=$rc_done<br>
<br>
<br>
start() {<br>
echo "Starting service bridge tranfw"<br>
brctl addbr tranfw || return=$rc_failed<br>
brctl addif tranfw eth0 || return=$rc_failed<br>
brctl addif tranfw eth1 || return=$rc_failed<br>
ifconfig eth0 0.0.0.0 promisc || return=$rc_failed<br>
ifconfig eth1 0.0.0.0 promisc || return=$rc_failed<br>
brctl sethello tranfw 1 || return=$rc_failed<br>
brctl setmaxage tranfw 4 || return=$rc_failed<br>
brctl setfd tranfw 4 || return=$rc_failed<br>
ifconfig tranfw 192.168.9.11 broadcast 192.168.9.255 promisc up || return=$rc_failed<br>
/sbin/route add default gw 192.168.9.1 netmask 0.0.0.0 metric 1 <br>
echo -e "$return"<br>
}<br>
<br>
stop() {<br>
echo "Shutting down service bridge tranfw"<br>
brctl delif tranfw eth0 || return=$rc_failed<br>
brctl delif tranfw eth1 || return=$rc_failed<br>
brctl delbr tranfw || return=$rc_failed<br>
echo -e "$return"<br>
}<br>
<br>
status(){<br>
ifconfig tranfw<br>
brctl show tranfw<br>
}<br>
<br>
restart(){<br>
$0 stop && $0 start || return=$rc_failed<br>
}<br>
<br>
case "$1" in<br>
start)<br>
start<br>
;;<br>
stop)<br>
stop<br>
;;<br>
restart)<br>
restart<br>
;;<br>
status)<br>
status tranfw<br>
RETVAL=$?<br>
;;<br>
*)<br>
echo $"Usage: $0 {start|stop|status|restart}"<br>
RETVAL=1<br>
<br>
esac<br>
<br>
exit $RETVAL<br>
<br>
这样启动时就自己起来了。<br>
<br>
下一步,我们可以开始配iptables了<br>
tar –xjvf iptables-1.2.7.tar.bz2<br>
cd ./iptables-1.2.7<br>
make<br>
make install<br>
安装很简单。关键是如何用,我懒,抄了个脚本就开用了,如下:<br>
#!/bin/bash<br>
#Flush all rules from the chains<br>
iptables -F<br>
#Delete all user created chains (mainly KEEP_STATE chain)<br>
iptables -X<br>
<br>
#############################################################<br>
##Create special chain KEEP_STATE<br>
iptables -N KEEP_STATE<br>
iptables -F KEEP_STATE<br>
##Drop bad states<br>
iptables -A KEEP_STATE -m state --state INVALID -j DROP<br>
iptables -A KEEP_STATE -m state --state RELATED,ESTABLISHED -j ACCEPT<br>
#############################################################<br>
<br>
#Drop RST/ACKs to limit OS detection through pinging<br>
iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "RST/ACK: "<br>
iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -j DROP<br>
<br>
#Deny pings from outside<br>
iptables -A FORWARD -p icmp --icmp-type 0/0 -d 192.168.9.0/24 -j ACCEPT<br>
iptables -A FORWARD -p icmp --icmp-type 0/0 -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "Drop Echo Reply: "<br>
iptables -A FORWARD -p icmp --icmp-type 0/0 -j DROP<br>
<br>
#Drop potential SQL Worm<br>
iptables -A FORWARD -p tcp -s 192.168.9.0/24 --dport 1433 -j ACCEPT<br>
iptables -A FORWARD -p tcp --dport 1433 -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "Possible SQL Worm: "<br>
iptables -A FORWARD -p tcp --dport 1433 -j DROP<br>
<br>
#Pass all boxes to the keep_state chain<br>
iptables -A FORWARD -j KEEP_STATE<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -