歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix教程

FreeBSD+IPFILTER實現整網(N個Vlan)透明代理上網

FreeBSDVLANIPFILTER代理上網




1:前言
我們學校以前是用的教育網,所有辦公機器、機房用的都是公網地址,由於前段時間更換網絡出口,換為網通的寬帶,所以才作了代理,因為學校領導還沒完全確定以後還用不用教育網,所以要求下面機器原來的網絡設置不能改變,經過自己摸索,加上CU、freebsdchina上面的各位高手幫忙,現在已經全部搞定,實現了透明代理,下面的機器網絡設置跟以前用教育網的一樣,可以隨時再開通教育網,不敢獨享,拿出來給大家看看。
另外一點說明,原來的公網地址因為當作私有地址來用了,我下面貼出來的代碼均以10.0.*.*這些私網地址代替,這樣可能其他兄弟們用的時候更合適一些,外部網通個的公網地址我以a.b.c.d和a1.b1.c1.d1等代替,如果要參考我的使用可換為你們的公網ip。
2:系統安裝
用的是最新的5.3release,用最小化安裝,因為後面要自己編譯內核,就把內核sys裝上了,man也是需要的,其他的都不要,因為只作代理,所以連ports都不要。
3:/etc/rc.conf裡面的設置
這裡要說明一下:我們的內部地址總共用了12個c的地址,10.0.40.0/21和10.1.44.0/22。為了實現整網的機器都能透明的通過代理服務器上網,需要在路由器上把默認路由指向代理服務器的內網網卡地址,我們這裡的核心交換是cisco6509,就是一條語句:ip route 0.0.0.0 0.0.0.0 192.168.0.1,這樣做還不夠,還需要在代理服務器上添加路由,把數據包經由內網網卡返回。代理的內網卡地址我設置的192.168.0.1,它所在vlan網關是192.168.0.2,掩碼是255.255.255.252,這個vlan也就192.168.0.1這個地址可用J
下面是rc.conf的內容,我加入了一些優化的選項:

ifconfig_em0="inet a.b.c.d netmask 255.255.255.240"
ifconfig em0 a1.b1.c1.d1 netmask 255.255.255.255 alias
ifconfig_em1="inet 192.168.0.1 netmask 255.255.255.252"

sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
## 關閉SENDMAIL

portmap_enable="NO"
inetd_enable="NO"
kern_securelevel_enable="YES"
kern_securelevel="2"
syslogd_enable="YES"
syslogd_flags="-ss"

firewall_enable="NO"
gateway_enable="YES"

ipfilter_enable="YES"
ipfilter_program="/sbin/ipf"
ipfilter_rules="/etc/ipf.conf"
ipfilter_flags=""
#IPFilter作為kernel,而不是作為模塊

ipnat_enable="YES"
ipnat_program="/sbin/ipnat -CF -f"
ipnat_rules="/etc/ipnat.conf"

ipmon_enable="YES"
ipmon -o N > /tmp/nat.log &

static_routes="static1 static2"
route_static1="-net 10.0.40.0 -netmask 255.255.248.0 -gateway 192.168.0.2"
route_static2="-net 10.1.44.0 -netmask 255.255.252.0 -gateway 192.168.0.2"

4:我的ipf.conf文件:
這裡我把沖擊波等的一些端口給封了,外網網卡上所有來自於10.0.0.0/8等私網地址和發往這些地址的數據包肯定是非法的,所以也給禁止掉,因為我的代理還把內部的一些機器給nat出去對外提供服務,暫時只用了80端口,就只允許了80端口上的數據包經外網網卡進入,其他的都封掉,如果你還需要其他的,可相應的增加規則。

#############優化ipf.conf#########################

block in quick all with ipopts
block in quick all with frag
block in quick all with short

#################################################################
# Resist the attack of the virus
#################################################################
block in quick proto tcp/udp from any to any port 134 >< 140
block in quick proto tcp/udp from any to any port = 445
block in quick proto tcp/udp from any to any port = 593
block in quick proto tcp/udp from any to any port = 333
block in quick proto tcp/udp from any to any port = 5554
block in quick proto tcp/udp from any to any port = 9995
block in quick proto tcp/udp from any to any port = 9996
block in quick proto tcp/udp from any to any port = tftp
block in quick proto tcp/udp from any to any port = 554
block in quick proto tcp/udp from any to any port = 1434
block in quick proto tcp/udp from any to any port = 4444

#################################################################
# Loopback Interface
#################################################################

#----------------------------------------------------------------
# Allow everything to/from your loopback interface so you
# can ping yourself (e.g. ping localhost)
#----------------------------------------------------------------
pass in quick on lo0 all
pass out quick on lo0 all
################################################################

#################################################################
# Inside Interface
#################################################################
#----------------------------------------------------------------
# Allow out all TCP, UDP, and ICMP traffic & keep state
#----------------------------------------------------------------
pass out quick on em1 all head 1
pass out quick on em1 proto tcp from any to any keep state group 1
pass out quick on em1 proto udp from any to any keep state group 1
pass out quick on em1 proto icmp from any to any keep state group 1
block out quick on em1 all group 1
#----------------------------------------------------------------
# Allow in all TCP, UDP, and ICMP traffic & keep state
#----------------------------------------------------------------
pass in quick on em1 all head 2
pass in quick on em1 proto tcp from 10.0.40.0/24 to any port = 22 flags S keep state group 2
block in quick on em1 proto tcp from any to any port = 22 flags S keep state group 2
pass in quick on em1 proto tcp from any to any keep state group 2
pass in quick on em1 proto udp from any to any keep state group 2
pass in quick on em1 proto icmp from any to any keep state group 2
block in quick on em1 all group 2

#################################################################
# Outside Interface
#################################################################
#----------------------------------------------------------------
#Block out all traffic to the private address
#----------------------------------------------------------------
block out quick on em0 all head 11
block out quick on em0 from any to 192.168.0.0/16 group 11
block out quick on em0 from any to 172.16.0.0/12 group 11
block out quick on em0 from any to 10.0.0.0/8 group 11
block out quick on em0 from any to 127.0.0.0/8 group 11
block out quick on em0 from any to 0.0.0.0/8 group 11
block out quick on em0 from any to 169.254.0.0/16 group 11
block out quick on em0 from any to 192.0.2.0/24 group 11
block out quick on em0 from any to 204.152.64.0/23 group 11
block out quick on em0 from any to 224.0.0.0/3 group 11
block out quick on em0 from any to 20.20.20.0/24 group 11

#----------------------------------------------------------------
# Allow out all TCP, UDP, and ICMP traffic & keep state on it
# so that it's allowed back in.
#----------------------------------------------------------------
pass out quick on em0 proto tcp from any to any keep state group 11
pass out quick on em0 proto udp from any to any keep state group 11
pass out quick on em0 proto icmp from any to any keep state group 11
block out quick on em0 all group 11

#----------------------------------------------------------------
#Block in all traffice from the private address
#----------------------------------------------------------------
block in quick on em0 all head 12
block in quick on em0 from 192.168.0.0/16 to any group 12
block in quick on em0 from 172.16.0.0/12 to any group 12
block in quick on em0 from 10.0.0.0/8 to any group 12
block in quick on em0 from 127.0.0.0/8 to any group 12
block in quick on em0 from 0.0.0.0/8 to any group 12
block in quick on em0 from 169.254.0.0/16 to any group 12
block in quick on em0 from 192.0.2.0/24 to any group 12
block in quick on em0 from 204.152.64.0/23 to any group 12
block in quick on em0 from 224.0.0.0/3 to any group 12
block in quick on em0 from 20.20.20.0/24 to any group 12

#----------------------------------------------------------------
# Block all remaining traffic coming into the firewall
#----------------------------------------------------------------
pass in quick on em0 proto tcp from any to any port = 80 flags S keep state group 12
block in quick on em0 all group 12

#############The END############################################

5:我的ipnat.conf文件:

######################ipnat.conf###########################################
map em0 10.0.40.0/24 -> a.b.c.d/32 proxy port ftp ftp/tcp
map em0 10.0.40.0/24 -> a.b.c.d/32 portmap tcp/udp 1025:65500
map em0 10.0.40.0/24 -> a.b.c.d/32
map em0 10.0.41.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.0.41.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.0.41.0/24 -> a1.b1.c1.d1/32
map em0 10.0.42.0/24 -> a.b.c.d/32 proxy port ftp ftp/tcp
map em0 10.0.42.0/24 -> a.b.c.d/32 portmap tcp/udp 1025:65500
map em0 10.0.42.0/24 -> a.b.c.d/32
map em0 10.0.43.0/24 -> a.b.c.d/32 proxy port ftp ftp/tcp
map em0 10.0.43.0/24 -> a.b.c.d/32 portmap tcp/udp 1025:65500
map em0 10.0.43.0/24 -> a.b.c.d/32
map em0 10.0.44.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.0.44.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.0.44.0/24 -> a1.b1.c1.d1/32
map em0 10.0.45.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.0.45.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.0.45.0/24 -> a1.b1.c1.d1/32
map em0 10.0.46.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.0.46.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.0.46.0/24 -> a1.b1.c1.d1/32
map em0 10.0.47.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.0.47.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.0.47.0/24 -> a1.b1.c1.d1/32
map em0 10.1.44.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.1.44.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.1.44.0/24 -> a1.b1.c1.d1/32
map em0 10.1.45.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.1.45.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.1.45.0/24 -> a1.b1.c1.d1/32
map em0 10.1.46.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.1.46.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.1.46.0/24 -> a1.b1.c1.d1/32
map em0 10.1.47.0/24 -> a1.b1.c1.d1/32 proxy port ftp ftp/tcp
map em0 10.1.47.0/24 -> a1.b1.c1.d1/32 portmap tcp/udp 1025:65500
map em0 10.1.47.0/24 -> a1.b1.c1.d1/32
##說明一下,後面的是為了讓內網用戶也可以通過外部的地址來訪問我用rdr轉出去的內網的機器。
map em1 10.0.40.0/24 -> a1.b1.c1.d1/32
map em1 10.0.41.0/24 -> a1.b1.c1.d1/32
map em1 10.0.42.0/24 -> a1.b1.c1.d1/32
map em1 10.0.43.0/24 -> a1.b1.c1.d1/32
map em1 10.0.44.0/24 -> a1.b1.c1.d1/32
map em1 10.0.45.0/24 -> a1.b1.c1.d1/32
map em1 10.0.46.0/24 -> a1.b1.c1.d1/32
map em1 10.0.47.0/24 -> a1.b1.c1.d1/32
map em1 10.0.48.0/24 -> a1.b1.c1.d1/32
map em1 10.1.44.0/24 -> a1.b1.c1.d1/32
map em1 10.1.45.0/24 -> a1.b1.c1.d1/32
map em1 10.1.46.0/24 -> a1.b1.c1.d1/32
map em1 10.1.47.0/24 -> a1.b1.c1.d1/32
rdr em1 a1.b1.c1.d1/32 port 80 -> 10.0.43.70 port 80
rdr em0 a1.b1.c1.d1/32 port 80 -> 10.0.43.70 port 80
map em1 10.0.40.0/24 -> a.b.c.d/32
map em1 10.0.41.0/24 -> a.b.c.d/32
map em1 10.0.42.0/24 -> a.b.c.d/32
map em1 10.0.43.0/24 -> a.b.c.d/32
map em1 10.0.44.0/24 -> a.b.c.d/32
map em1 10.0.45.0/24 -> a.b.c.d/32
map em1 10.0.46.0/24 -> a.b.c.d/32
map em1 10.0.47.0/24 -> a.b.c.d/32
map em1 10.0.48.0/24 -> a.b.c.d/32
map em1 10.1.44.0/24 -> a.b.c.d/32
map em1 10.1.45.0/24 -> a.b.c.d/32
map em1 10.1.46.0/24 -> a.b.c.d/32
map em1 10.1.47.0/24 -> a.b.c.d/32
rdr em1 a.b.c.d/32 port 80 -> 10.0.40.59 port 80
rdr em0 a.b.c.d/32 port 80 -> 10.0.40.59 port 80
#########################The end############################################

6:優化內核
mkdir /usr/kern
cp /usr/src/sys/i386/conf/GENERIC /usr/kern/proxy
ln -s /usr/kern/proxy /usr/src/sys/i386/conf/proxy

cd /sys/i386/conf
ee proxy

options IPFILTER #ipfilter support
options IPFILTER_LOG #ipfilter logging
options IPFILTER_DEFAULT_BLOCK #block all packets by default

options TCP_DROP_SYNFIN

options PQ_LARGECACHE
## 為512k二級緩存的CPU提供支持
options SC_DISABLE_REBOOT
##屏蔽Ctrl+Del+Alt熱鍵重啟系統

#To make an SMP kernel,the netx two are needed
options SMP #Symmetric MultiProcess Kernel
device apic # I/O APIC
#如果沒有雙cpu就不需要了

#####加入對polling的支持##################################
#options DEVICE_POLLING
#options HZ=1193
在/sys/kern/kern_pool.c裡面找到#error一行刪掉。
在/etc/sysctl.conf裡面加入 kern.polling.enable=1
DEVICE_POLLING不能跟SMP同時使用,所以本服務器可省略。
###########################################################
其余的優化選項可參考其他內核優化的文章。

7:系統資源優化

ee /etc/sysctl.conf

#######################/etc/sysctl.conf############################################
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1
#### 某些加快網絡性能的協議,請參考RFC文章。

net.inet.ip.forwarding=1
##作路由必須打開
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
##安全方面的參數

kern.ipc.maxsockbuf=8388608
##最大的套接字緩沖區
kern.ipc.somaxconn=8192
##最大的等待連接完成的套接字隊列大小,高負載服務器和受到分布式服務阻塞攻擊的系統也許
會因為這個隊列被塞滿而不能提供正常服務。默認僅為128,根據機器和實際情況需要改動,太大就浪費了內存
kern.maxfiles=65536
##系統中允許的最多文件數量,缺省的是幾千個但如果你在運行數據庫或大的很吃描述符的進程可以把它設到1萬或2萬個
kern.maxfilesperproc=32768
##每個進程能夠同時打開的最大文件數量
net.inet.tcp.delayed_ack=0
##當一台計算機發起TCP連接請求時,系統會回應ACK應答數據包。該選項設置是否延遲ACK應答數據包,把它和包含數據的數據包一起發送,在高速網絡和低負載的情況下會略微提高性能,但在網絡連接較差的時候,對方計算機得不到應答會持續發起連接請求,反而會降低性能。
net.inet.tcp.sendspace=65535
##最大的待發送TCP數據緩沖區空間,應用程序將數據放到這裡就認為發送成功了,系統TCP堆棧保證數據的正常發送
net.inet.tcp.recvspace=65535
##最大的接受TCP緩沖區空間,系統從這裡將數據分發給不同的套接字,增大該空間可提高系統瞬間接受數據的能力以提高性能。
net.inet.udp.recvspace=65535
##最大的接受UDP緩沖區大小
net.inet.udp.maxdgram=57344
##最大的發送UDP數據緩沖區大小
net.local.stream.recvspace=32768
##本地套接字連接的數據接收空間
net.local.stream.sendspace=65535
##本地套接字連接的數據發送空間
net.inet.icmp.drop_redirect=1
net inet.icmp.log_redirect=1‘
net.inet.ip.redirect=0
#net.inet6.ip6.redirect=0
##屏蔽ICMP重定向功能
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0
##防止廣播風暴
net.inet.icmp.icmplim=100
##限制系統發送ICMP速率
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1
##安全參數,編譯內核的時候加了options TCP_DROP_SYNFIN才可以用
net.inet.tcp.always_keepalive=0
##設置為1會幫助系統清除沒有正常斷開的TCP連接,這增加了一些網絡帶寬的使用,但是一些死掉的連接最終能被識別並清除。死的TCP連接是被撥號用戶存取的系統的一個特別的問題,因為用戶經常斷開modem而不正確的關閉活動的連接。
net.inet.ip.intr_queue_maxlen=1000
##若看到net.inet.ip.intr_queue_drops這個在增加,就要調大net.inet.ip.intr_queue_maxlen,為0最好

####以下為防止dos攻擊#####
net.inet.tcp.msl=7500
##freebsd默認為30000
net.inet.tcp.blackhole=2
##接收到一個已經關閉的端口發來的所有包,直接drop,如果設置為1則是只針對TCP包
net.inet.udp.blackhole=1
##接收到一個已經關閉的端口發來的所有UDP包直接drop
########end#################

net.inet.ipf.fr_tcpidletimeout=7200
net.inet.ipf.fr_tcpclosewait=60
net.inet.ipf.fr_tcplastack=120
net.inet.ipf.fr_tcptimeout=120
net.inet.ipf.fr_tcpclosed=60
net.inet.ipf.fr_udptimeout=90
net.inet.ipf.fr_icmptimeout=35
net.inet.ipf.fr_tcphalfclosed=300
net.inet.ipf.fr_defnatage=600

net.inet.tcp.inflight.enable=1
## 為網絡數據連接時提供緩沖
net.inet.ip.fastforwarding=0
##如果打開的話每個目標地址一次轉發成功以後它的數據都將被記錄進路由表和arp數據表,節約路由的計算時間,但會需要大量的內核內存空間來保存路由表。

#kern.polling.enable=1
##打開POLLING功能
##SMP不能和polling一起用
#########################The end##################################################

8:設置rc.sysctl, rc.conf 和 sysctl.conf 權限:

chmod 600 /etc/rc.sysctl
chmod 600 /etc/rc.conf
chmod 600 /etc/sysctl.conf


9:優化啟動選項
##################編輯/boot/loader.conf優化啟動########

autoboot_delay="2"
## 設置啟動等待時間為2秒。

kern.ipc.nmbclusters="32768"
##設置系統的mbuf大小,系統的緩沖區

kern.ipc.maxsockets="16384"
## 增大線程間套接數量

net.inet.tcp.tcbhashsize="10240"
## 增大TCP控制塊數量

beastie_disable="YES"
## 關閉小惡魔圖像啟動菜單
#############################################


10:增強ipfilter功能

修改/sys/contrib/ipfilter/netinet/ip_nat.h,把裡面的LARGE_NAT前面的注釋去掉,改為#define LARGE_NAT

修改/sys/contrib/ipfilter/netinet/ip_state.h

IPSTATE_SIZE 64997
IPSTATE_MAX 45497

IP_STATE_MAX=IPSTATE_SIZE*0.7左右
第一個可以調到10萬左右
注意都要是質數
11:
##############打系統補丁以後重新編譯內核#############

cd /usr/src
fetch http://people.freebsd.org/~delphij/patch-SMP
patch < patch-SMP
重新編譯內核並重新啟動。
#這是針對5.3 SMP的delphij大哥做的補丁,

cd /sys/contrib/ipfilter/netinet/
patch < patch-ip_nat.c
#這個是針對ip_nat的一個補丁,也可以自己手動注釋,改了ip_nat的參數以後編譯內核會提示兩個變量沒有定義。

cd /usr/src
make buildkernel KERNCONF=proxy
make installkernel KERNCONF=proxy
reboot
這種編譯方法將保留原來的kernel為kernel.old,
這樣如果你做錯了什麼,就有機會通過boot:出現時輸入kernel.old來恢復。

######如果用config/make編譯內核的會在/usr/src產生很多中間文件#########
cd /usr/src/sys/i386/conf
/usr/sbin/config proxy
cd ../compile/proxy
make depend
make
make install
reboot
#########################################################################


12:自動備份日志
目前方法不太成熟,我曾經試過把nat.log清空,但是也許是因為系統正在頻繁的寫入該文件,所以我只能是先暫停記錄,備份完記錄以後再重新開始記錄,好在我是一個小時備份一個日志文件,拷貝這一小時的記錄不用很長時間的,所以基本上不會少記錄東西的,看到本文的兄弟們如果有更好的切實可行的方法,望告訴我一聲,多謝!

#################/usr/local/beifen.sh
#!/bin/sh
year=$(date +%Y)
month=$(date +%m)
date=$(date +%d)
time=$(date +%Y%m%d%H%M)
mkdir -p /usr/local/logbak/$year/$month/$date
killall ipmon
cp /var/nat.log /usr/local/logbak/$year/$month/$date/$time.log
cat > /var/nat.log<<END
END
/sbin/ipmon -o N > /var/nat.log &
#############################################

chmod +x /usr/local/beifen.sh

crontab -e
編輯一個文件:

0 0 * * * /usr/local/beifen.sh
0 1 * * * /usr/local/beifen.sh
0 2 * * * /usr/local/beifen.sh
0 3 * * * /usr/local/beifen.sh
2 3 * * 1 /sbin/reboot
0 4 * * * /usr/local/beifen.sh
0 5 * * * /usr/local/beifen.sh
0 6 * * * /usr/local/beifen.sh
0 7 * * * /usr/local/beifen.sh
0 8 * * * /usr/local/beifen.sh
0 9 * * * /usr/local/beifen.sh
0 10 * * * /usr/local/beifen.sh
0 11 * * * /usr/local/beifen.sh
0 12 * * * /usr/local/beifen.sh
0 13 * * * /usr/local/beifen.sh
0 14 * * * /usr/local/beifen.sh
0 15 * * * /usr/local/beifen.sh
0 16 * * * /usr/local/beifen.sh
0 17 * * * /usr/local/beifen.sh
0 18 * * * /usr/local/beifen.sh
0 19 * * * /usr/local/beifen.sh
0 20 * * * /usr/local/beifen.sh
0 21 * * * /usr/local/beifen.sh
0 22 * * * /usr/local/beifen.sh
0 23 * * * /usr/local/beifen.sh

13:後記
本文參考了網上太多的資料,已經記不清這裡的每一行選項都是參考的哪篇文章了,在此對曾經對我有幫助的文章的作者們標識誠摯的感謝!因為你們的無私,整個世界才能加快進步的步伐,本文大家可隨意轉載,注不注明作者都無所謂,因為這裡面畢竟幾乎全部都是參考大家的文章寫的,原創的甚少,我只是做了個整理、實驗的工作而已。
如果您願意就我文中的內容進行探討,可在本貼回復,或者email:[email protected],小弟洗耳恭聽,還是我自己的網站http://freebsd.jzu.cn上面的宣言寫的那句話:自由是FreeBSD的目的,共享是FreeBSD走向自由的必經之路^_^
文中所提的步驟就是我在調試我們的代理服務器過程中以ssh登錄以後作的,您完全可以在安裝完基本的系統以後以ssh登錄,根據您的實際網絡環境對我的文章進行修改以後復制粘貼即可,不需要一行一行的輸入,那樣太麻煩了J




Copyright © Linux教程網 All Rights Reserved