4.13

现在真不知道在什么地儿写东西。任何地方都感觉有所顾忌,唯独这个角落略微隐蔽一点了。

Savannah的Open The Door又成为了一个新的、带有强烈情感唤起能力的音乐信标,深深驻扎在我脑子里。每次一听到它的旋律,我都会想起那个在杭州的夜晚 ,挫败的我带着遗憾坐进了去火车站的出租车。我终究还是没有见到她,她不见我。

“天蝎”,我现在一般用这个词来代指她,在与形形色色的人提到我的过往的时候。在这个星座论肆虐的年代,双鱼的我本与她是绝配,100%契合的完美情侣。分手后双方都不曾忘记对方,还要因为对方开始新 的恋情而勃然大怒,而且奇怪的是吃醋的那方理直气壮、被撒气的那方把恋情藏着掖着、偷偷摸摸 ,似乎做了极其不忠诚的事情 。 其实我们那时候从来没有分开,即使分手也没有把我们分开。

 

只不过,不能在一起的恋人,终究还是要分道扬镳。跟狮子分手后的一个月时间里,我情绪变化极其剧烈 ,在跟天蝎提及狮子的时候说法也变了几次,天蝎似乎认为我说了谎,不止一次。自此似乎就真的有了裂痕 ,我苦笑着在签名里写道,这还真他妈是买一送一。

 

也不知道为什么要在这样一个充满阳光的下午写这样的东西。回到成都4天了,也不敢在微博上公开说回来很高兴。我怕在上海的那个女孩子看到会难受,其实我真的挺舍不得她的  。 写到这里,我倒真的觉得自己这种既风流又多情的人是个孽障。

Uncategorized

Xen环境下的内存与CPU分配:性能优化

 

导读:在Xen环境下,内存与CPU分配是可以动态改变的。通过动态更改内存与CPU分配,可以达到优化虚拟机性能的目的。
【TechTarget中国原创】在Xen环境下,硬件的管理并不是仅仅告诉它可以使用哪些PCI设备就可以完事。在准虚拟环境下,内存与CPU分配是可以动态改变的。通过动态更改内存与CPU分配,可以达到优化虚拟机性能的目的。在本文中,TechTarget中国的特约虚拟化专家Sander van Vugt将描述这方面的所有信息。
 
  启动物理服务器时,所有的内存资源都会默认被分配给Domain0。然后,其它虚拟机启动时,会从Domain0获取内存资源。如果虚拟机是在完全虚拟化模式下运行,hypervisor将无法与虚拟内核对话,当前的内存分配也将无法改变。不过,如果是在准虚拟化模式(paravirtualization)下,Xen的hypervisor就可以动态更变内存分配。采用准虚拟化模式时,一定要确保Domain0至少可以分得一定的内存资源,以免它内存不足。对于Domain0的内存分配最小值,我建议设置为512MB。
  要为Domain0预留内存,可以为内核添加一个启动项:dom0_mem= 。例如,dom0_mem=512M。打开Grub配置文件进行此设置。在Grub配置文件中,你会看到启动Xen内核的启动项。它大体如下:
  title XEN
  root (hd0,0)
  kernel /xen.gz
  module /vmlinuz-
  2.6.16 .46-0.14-xen root=/dev/system/root vga=0×314 
  resume=/dev/system/swap splash=silent showopts
  module /initrd-
  2.6.16 .46-0.14.xen
  在此配置文件中的第一个“module”行后面添加dom0_mem启动项。添加之后应该是这样:
  title XEN
   root (hd0,0)
   kernel /xen.gz
   module /vmlinuz-
   2.6.16 .46-0.14-xen root=/dev/system/root vga=0×314 
        resume=/dev/system/swap splash=silent showopts   dom0_mem=512M
   module /initrd-
   2.6.16 .46-0.14.xen
  设置好Domain0的内存分配后,就可以管理你的虚拟机内存分配了。启动一个虚拟机时,通常它会从Domain0获取内存资源。内存一旦分配给虚拟机,Domain0将无法再收回,即使所有虚拟机都被停止也不能收回。正是因为这个原因,所以为Domain0设置内存最小值非常重要。
  要想更改虚拟机的内存分配,可以利用两个xm命令:
xm mem-set:此命令可以更改一台虚拟机的当前内存分配;
xm mem-max:此命令可以限定一台虚拟机的内存使用最大值。不过,更改最大值之后需要重启才能生效。
  更改内存分配之后,一定要使用xm list命令检查设置是否生效和正确:
 
  CPU管理
  与内存一样,你也可以管理虚拟机的CPU分配。如果虚拟机使用的是准虚拟化,CPU的分配也可以动态更改。为虚拟机分配CPU时,不一定要根据服务器中的物理CPU数目来分。如果你愿意,是可以这么做。不过,这样做是绝对优化不了性能的。如果将虚拟机与指定的物理CPU绑定,会帮助你大大地提高虚拟机性能。除此之外,还可以调整CPU的运行队列(run queue),使某台虚拟机在CPU中具有更高的优先级。
  所有可运行的虚拟CPU(VCPU)都是由物理CPU中的本地运行队列管理的。这个队列是按优先级进行排序的,队列中的每个VCPU平分CPU资源。VCPU的优先级状态有两种值:over和under。Over表示它占用的CPU资源超过了资源平分值,under表示低于这个平分值。如果VCPU的当前状态为under,调度程序下次则会优先服务该VCPU。如果调度程序发现在其CPU上没有虚拟机为under状态,则会看其它CPU中是否有VCPU状态为under,如果发现,则立即服务该VCPU。通过这种方式,所有CPU都会平均分配CPU资源。
  通过设置weight和cap参数值,管理员可以管理CPU的优先级。Weight参数用于分配CPU cycle,是一个相对值。一个weight为128的VCPU比一个weight为64的VCPU获得的CPU cycle多一倍。因此,利用这个参数可以决定哪个VCPU获得更多,哪个获得更少。第二个设置CPU的参数是cap,它设置的是domain获得的CPU cycle百分数,是一个绝对值。如果设置为100,就表示那个VCPU会100%地占用物理CPU的可用cycle。如果cap为50,则表示该VCPU占用的CPU cycle绝不会超过总量的一半。
  在如下命令示例中, id为3的虚拟机weight为128,允许使用两个物理CPU的所有CPU cycle:
  xm sched-credit -d 3 -w 128 -c 200
  对于虚拟CPU,还要做的一个重要工作就是CPU分配。默认情况下,虚拟CPU与物理CPU是没有固定联系的。要提高性能,就需要为它们建立一个这样的联系,这个工作很简单易行。为虚拟CPU和物理CPU建立“联系”的主要好处是可以防止虚拟CPU到处游荡。如果没有“联系”,调度程序会为虚拟CPU选择一个物理CPU。当某个物理CPU处于繁忙状态时,虚拟CPU就会被转移,由另一个物理CPU服务。这个工作对性能的影响是很大的。因此,将虚拟CPU与物理CPU绑定是个不错的办法。
  
  绑定虚拟CPU时,首先利用xm list命令查看当前配置。然后,在你要查看CPU详细信息的domain中使用xm vcpu-list命令,命令输出结果如下:
  lin:~ # xm vcpu-list 2
 
  这个命令显示,ID 2 domain当前使用了一个CPU(ID 0),该CPU当前在物理CPU 0。为了确认它的状态,可以使用如下命令:
  
  xm vcpu-pin 2 0 1
  如果你再使用xm vcpu-list命令,你会看见CPU Affinity由原来的“any cpu”变为了CPU 1。
  注意,这个设置是无法被写入的。意思是,每次重启虚拟机之后,你都必须再重新设置。
  最后,你还可以更改虚拟机分配的CPU数量。要更改此设置,既可以利用虚拟机管理器(Virtual Machine Manager)进行,也可以使用xm vcpu-set命令。例如,将domain 1分配的VCPU数改为4个,则:
  xm vcpu-set 1 4
  使用该命令时,你会发现它有时不起作用。这是因为,虚拟机的操作系统还必须支持动态更改CPU数量,不然就不能这样更改了。所以,在虚拟机的配置文件中更改其VCPU数更有效,而且不会因为重启虚拟机而失效。
  综述
  对于虚拟机的性能优化,内存与CPU设置很重要,本文已阐述了其原因。此外,你还了解了如何调整虚拟机在物理CPU中的优先级。
 原文地址 http://www.searchsv.com.cn/ShowContent_13922_560.htm
Linux ,

[存档]Setup your cloud server in 3 minutes with Xen 4.1 on Ubuntu 11.10

Ubuntu support xen officially since 11.10. It is really easy to install the packages. Although some issues should be fixed manually, it is a painless experience. Here’s the steps to setup your cloud server in 3 minutes with Xen 4.1 on Ubuntu 11.10.

1. Install xen hypervisor and utilities
sudo apt-get install xen-hypervisor-4.1-amd64 xen-utils-4.1 xenwatch xen-tools xen-utils-common xenstore-utils

sudo apt-get install virtinst virt-viewer virt-manager

2. Restart os, choose the xen kernel, verify xen installation
# xm info
# brctl show

3. Config your xend 
$ sudo vim /etc/xen/xend-config.sxp

comment out (xend-unix-server yes) at the file, that means make sure the following line exists or been added :
(xend-unix-server yes)

#vi ~/.bashrc , add the following line:

export VIRSH_DEFAULT_CONNECT_URI="xen:///"

4. Restart, choose the xen kernel, and verify libvirt

# virsh version

Compiled against library: libvir 0.8.3
Using library: libvir 0.8.3
Using API: Xen 3.0.1
Running hypervisor: Xen 4.0.0

Conguratulations, all packages installed successfully.

5. Run virtual machine manager to manage your vms.

# virt-manager

Then you will see the screen virtual machine manager screen:

 

Create virtual machine in virt-manager,

 

 

 

 

error occur when finish creation, and show something like:
if ret is None:raise libvirtError(‘virDomainCreateLinux() failed’, conn=self)
….
/usr/lib64/xen/bin/qemu-dm: ….

that means qemu-dm could not be found, try to fix it:

#mkdir /usr/lib64/xen -p
#cp /usr/lib/xen-4.1/* -r /usr/lib64/xen/

then continue to finish creation of the virtual machine, still error occured, and show something like:
libvirtError: POST operation failed: xend_post: error from xen daemon: (xend.err …
or something like this:

libvirtError: POST operation failed: xend_post: error from xen daemon: <Fault 3: >

check the error log,  it will give you some clues:
# less /var/log/xen/xend.log

the log shows error occured and logged at /var/log/xen/qemu-dm-demo.log, check it:
# less /var/log/xen/qemu-dm-demo.log

it says /usr/share/qemu/keymaps/en-us could not be found, the keymaps really does not exist in my disk.
and find it at /usr/share by :
#ls /usr/share/qemu (and press Tab, it shows qemu-linaro exist)

so just copy it to fix:
#cp -r /usr/share/qemu-linaro/ /usr/share/qemu

then continue to finish the vm creation. Wow, it works!

 

Linux , ,

7.21 日志

近两个月没写日志,有点生疏。自从做完自己的CS视频后,就有点放空的感觉,回家后不知道干嘛,时常去优酷看下自己的视频,自己给自己顶一下,估计这视频的50多个“顶”,有20多都是我自己凑的数。不过想想也没什么无耻的,自己呕心沥血两个半月做出来的,总该给自己点鼓励不是,要不以后自己怎么做东西。

不过由于这段放空期,反倒想了挺多。比起以前来,少了些许忧郁,多了两分理智。虽然现在还是有些迷茫,不知道以后的路怎么走,但终究还是决定先静下心来把工作搞好。有个饭碗端着始终比饿着肚子空想的好。前些天做了个突破,连短发都没留过的我,去剃了个光头。走在大街上,面对有些路人异样的眼光,兀自笑得很开心。

我决定消失在一些人的视线里。这个世界妥协太多,我一有机会尽量还是站着吧。有时候觉得年纪越大越自卑,于是到老的时候不得不卑躬屈膝拄着拐杖行走。想到这点,我倒是很是怀念小时候敢挺直腰板对我爸的厂长说“我是你爷爷”的我。

暂时不交际了,切换到geek模式。这并不是逃避,是蛰伏。

我还是那么爱Trance,Britpop我也爱,听Windsor Drive唱上两句就能让我舒坦得闭上眼睛。

我看上三星的i9100已经3个月了,作为月光族,并且是在还债中的月光族,表示压力很大。我发誓,这是最后一次。

Uncategorized

还是iptables

 

 

 

对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的。因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的。Linux提供了一个非常优秀的防火墙工具—netfilter/iptables。它完全免费、功能强大、使用灵活、可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行。本文将简单介绍使用netfilter/iptables实现防火墙架设和Internet连接共享等应用。

netfilter/iptabels应用程序,被认为是Linux中实现包过滤功能的第四代应用程序。netfilter/iptables包含在2.4以后的内核中,它可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。netfilter/iptables从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更加强大。下文将netfilter/iptabels统一称为iptables。

可以用iptables为Unix、Linux和BSD个人工作站创建一个防火墙,也可以为一个子网创建防火墙以保护其它的系统平台。iptales只读取数据包头,不会给信息流增加负担,也无需进行验证。要想获得更好的安全性,可以将其和一个代理服务器(比如squid)相结合。

基本概念

典型的防火墙设置有两个网卡:一个流入,一个流出。iptables读取流入和流出数据包的报头,将它们与规则集(Ruleset)相比较,将可接受的数据包从一个网卡转发至另一个网卡,对被拒绝的数据包,可以丢弃或按照所定义的方式来处理。

通过向防火墙提供有关对来自某个源地址、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用iptables系统提供的特殊命令iptables建立这些规则,并将其添加到内核空间特定信息包过滤表内的链中。关于添加、去除、编辑规则的命令,一般语法如下:

iptables [-t table] command [match] [target]

1.表(table)

[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三个可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter作为缺省表。各表实现的功能如表1所示。

 

 

 

表1 三种表实现的功能

 

 

 

2.命令(command)

command部分是iptables命令最重要的部分。它告诉iptables命令要做什么,例如插入规则、将规则添加到链的末尾或删除规则。表2是最常用的一些命令及例子。

 

 

 

表2 命令的功能和样例

 

 

 

3.匹配(match)

iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源地址、目的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。这里将介绍可用于采用任何协议的信息包的通用匹配。表3是一些重要且常用的通用匹配及示例说明。

 

 

 

表3 通用匹配及示例说明

 

 

 

4.目标(target)

目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。表4是常用的一些目标及示例说明。

除表4外,还有许多用于建立高级规则的其它目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。

 

 

 

表4 目标及示例说明

 

 

 

应用iptables

与ipchains和ipfwadm不同的是,iptables可以配置有状态的防火墙。iptables可以检测到源地址和目的地址、源端口和目的端口及流入数据包的顺序,即iptables记住了在现有连接中,哪些数据包已经被允许接收。这使得暂时性的端口只有在需要时才会被打开,并且会拒绝所有永久性占用端口的请求,大大地加强了安全性。同时,那些被更改了报头的数据包,即使包含有一个被允许的目的地址和端口,也会被检测到并被丢弃。此外,有状态的防火墙能够指定并记住为发送或接收信息包所建立连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。

1.启动和停止iptables

下面将正式使用iptables来创建防火墙。启动和停止iptables的方法取决于所使用的Linux发行版,可以先查看所使用Linux版本的文档。

一般情况下,iptables已经包含在Linux发行版中,运行iptables –version来查看系统是否安装了iptables。在Red Hat 9.0中,安装的版本是iptables v1.2.7a。如果系统没有安装iptables,则可以从http://www.netfilter.org下载。

2.查看规则集

上面仅对iptables的用法做了一个简单介绍,使用中可以运行man iptables来查看所有命令和选项的完整介绍,或者运行iptables -help来查看一个快速帮助。要查看系统中现有的iptables规划集,可以运行以下命令:

iptables --list

下面是没有定义规划时iptables的样子:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

如上例所示,每一个数据包都要通过三个内建的链(INPUT、OUTPUT和FORWARD)中的一个。

filter是最常用的表,在filter表中最常用的三个目标是ACCEPT、DROP和REJECT。DROP会丢弃数据包,不再对其进行任何处理。REJECT会把出错信息传送至发送数据包的主机。

 

 

 

图1 Red Hat 9.0中安全设置的GUI工具

 

 

 

在Red Hat 9.0中,提供一个GUI程序来让用户对系统的安装级别进行简单的配置。该工具的启动方法是:主选单→系统设置→安全工具(如图1所示)。在此将安全级别设为“高级”,并选择使用默认的防火墙规则。点击确定后,再用iptables -list显示,发现iptables与没有定义规则前已经有很大不同,如下所示:

[root@workstation root]# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
......

现实中一般不使用这个GUI工具,因为它的功能有限,也不够透明。相比较而言,SuSE 9.0中相应的配置工具要好得多,它可以在GUI下对防火墙进行更加细化的配置(比如增加了IP转发和伪装等功能的配置)。尽管这样,一般还是自己来增加和删除规则。

 

 

 

图2 SuSE 9.0中YaST配置工具中的防火墙设置

 

 

 

3.增加规则

本例中的规则将会阻止来自某一特定IP范围内的数据包,因为该IP地址范围被管理员怀疑有大量恶意攻击者在活动:

# iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP

也可以很轻易地阻止所有流向攻击者IP地址的数据包,该命令稍有不同:

# iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP

注意这里的A选项,如前所述,使用它说明是给现有的链添加规则。

4.删除规则

网络上的恶意攻击者总是在变化的,因此需要不断改变IP。假设一个网上攻击者转移到新的IP地址,而其老的IP地址被分配给一些清白的用户,那么这时这些用户的数据包将无法通过你的网络。这种情况下,可以使用带-D选项的命令来删除现有的规则:

# iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP

5.缺省的策略

创建一个具有很好灵活性、可以抵御各种意外事件的规则需要大量的时间。对于那些没有时间这样做的人,最基本的原则是“先拒绝所有的数据包,然后再允许需要的”。下面来为每一个链设置缺省的规则:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT

这里选项-P用于设置链的策略,只有三个内建的链才有策略。这些策略可以让信息毫无限制地流出,但不允许信息流入。很多时候需要接收外部信息,则可使用以下命令:

# iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT

6.SYN的使用

不能关闭所有端口,也不能只指定某些端口处于打开状态,那么怎样才能设置一个有效的规则,既可以允许普通用户正常通过,又可以阻止恶意攻击者访问网络呢?

刚开始使用iptables的人可以充分利用syn标识来阻止那些未经授权的访问。iptables只检测数据包的报头,事实上,除iptables以外,很多其它有用的数据包分析都是基于报头的。比如,在进行Web冲浪时,一个请求从你的PC发送至其它地方的Web服务器上,该服务器会响应请求并发回一个数据包,同时得到你系统上的一个临时端口。与响应请求不同的是,服务器并不关心所传送的内容。可以利用这种特点来设置规则,让它阻止所有没有经过你系统授权的TCP连接:

# iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP

这里的-i指的是网卡,-p则是指协议,–syn则表示带有syn标识设置的TCP数据包。SYN用于初始化一个TCP连接,如果自己机器上没有运行任何服务器,别人也就不会向你发送SYN数据包。

7.有状态的数据包的检测

前边的例子把每一个数据包看成是独立的,而不是相互关联的,依靠的是数据包的头信息。iptables会检查数据包的源和目的IP地址、源和目的端口、流入数据包的顺序号、TCP先后顺序的信息及头标记(SYN、ACK、FIN、RST等)的状态,即它会跟踪整个连接会话,从而使整个过滤过程是相互关联的。

8.共享一个Internet连接

网络地址翻译和IP伪装都可以实现多台主机共享一个Internet连接,这个局域网可以是Linux和Windows系统组成的多系统局域网。假设现在有一台机器,配有两个网卡,其中eth0为“公共”网卡,eth1为“私有”网卡,即eth0被分配了一个静态的、可路由的IP地址,而eth1被分配了一个私有的、不能路由的IP,该IP是属于该局域网子网的。要实现上述功能,需要向nat和filter表中添加一些链:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT

这显示了有状态的数据包检测的价值。请注意,这里是如何实现流入数据包只有在属于一个已经存在的连接时才被允许,而所有来自局域网内流向外的数据包则都允许通过。第一条规则让所有流出的信息看起来都是来自防火墙机器的,而并不会显示出防火墙后面还有一个局域网。

下面的命令为FORWARD和POSTROUTING链设置缺省的策略,在使用伪装时,有一个缺省的POSTROUTING DROP策略非常重要,否则就可能有心怀恶意的用户突破网关后伪装自己的身份。

# iptables -t filter -P FORWARD DROP
# iptables -t nat -P POSTROUTING DROP

下面的命令为拨号连接设置,它可以动态地分配IP地址:

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

9.运行服务器时的情况

有时也会把服务器放置在防火墙后面,这时iptables就需要知道从哪儿通过数据包,设置如下所示:

# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80
# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25

10.规则的保存

到现在为止,所有的例子都是在命令行中进行的。在测试新的规则时,这是一种很好的方式,但一旦测试结果令人满意,就可以将它们保存为脚本。可以使用 iptables-save 命令来实现:

$ iptables-save > iptables-script

信息包过滤表中的所有规则都被保存在文件iptables-script中。无论何时再次引导系统,都可以使用iptables-restore命令将规则集从该脚本文件恢复到信息包过滤表。恢复命令如下所示:

$ iptables-restore iptables-script

如果愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化Shell脚本中。

下面的例子并不是一个完整的脚本,它只是描述了如何使用变量及提供了一些附加的规则样例。

#!/bin/sh
#为变量赋值
IPTABLES=/sbin/iptables
LAN_NET="192.168.1.0/24"
IFACE= "eth0"
LO_IFACE="lo"
LO_IP="127.0.0.1"
#加载所需的内核
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
#缺省情况下,IP转发都处于不可用状态,将其设置为可用状态:
echo "1" > /proc/sys/net/ipv4/ip_forward
#使IP的动态分配功能可用
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
#每次重启这个脚本时,最好清除以前所设的规则
$IPTABLES -P INPUT DROP
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -F -t nat
#只允许在LAN中使用SSH连接
$IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT
#允许loopback!
$IPTABLES -A INPUT -i lo -p all -j ACCEPT
$IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
#丢弃那些流入的宣称是来自本地机器的数据包
#丢弃那些流出的不是出自本地机的数据包
$IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP
$IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP
#限制一些流出的信息
$IPTABLES -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP
$IPTABLES -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP
#此外,31335、27444、27665、20034 NetBus、9704、137-139(smb)端口也应被禁止。

 

Linux ,

一些iptables的配置

 

iptables官方网站:http://netfilter.org/

数据包经过防火墙的路径

图1比较完整地展示了一个数据包是如何经过防火墙的,考虑到节省空间,该图实际上包了三种情况:

来自外部,以防火墙(本机)为目的地的包,在图1中自上至下走左边一条路径。

由防火墙(本机)产生的包,在图1中从“本地进程”开始,自上至下走左边一条路径

来自外部,目的地是其它主机的包,在图1中自上至下走右边一条路径。

图1

如果我们从上图中略去比较少用的mangle表的图示,就有图2所显示的更为清晰的路径图.

图2

 

禁止端口的实例

  • 禁止ssh端口

只允许在192.168.62.1上使用ssh远程登录,从其它计算机上禁止使用ssh

#iptables -A INPUT -s 192.168.62.1 -p tcp –dport 22 -j ACCEPT

#iptables -A INPUT -p tcp –dport 22 -j DROP

  • 禁止代理端口

#iptables -A INPUT -p tcp –dport 3128 -j REJECT

  • 禁止icmp端口

除192.168.62.1外,禁止其它人ping我的主机

#iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp –icmp-type echo-request -j ACCEPT 
#iptables -A INPUT -i eth0 -p icmp –icmp-type echo-request –j ?DROP

或 
#iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp –icmp-type 8 -j ACCEPT 
#iptables -A INPUT -i eth0 -p icmp -m icmp –icmp-type 8 -j DROP

注:可以用iptables –protocol icmp –help查看ICMP类型

还有没有其它办法实现?

  • 禁止QQ端口

#iptables -D FORWARD -p udp –dport 8000 -j REJECT

 

强制访问指定的站点

图3

 

要使192.168.52.0/24网络内的计算机(这此计算机的网关应设为192.168.52.10)强制访问指定的站点,在做为防火墙的计算机(192.168.52.10)上应添加以下规则:

1. 打开ip包转发功能 

echo 1 > /proc/sys/net/ipv4/ip_forward

2. 在NAT/防火墙计算机上的NAT表中添加目的地址转换规则:

iptables -t nat -I PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 202.96.134.130:80

iptables -t nat -I PREROUTING -i eth0 -p udp –dport 80 -j DNAT –to-destination 202.96.134.130:80

3. 在NAT/防火墙计算机上的NAT表中添加源地址转换规则: 

iptables -t nat -I POSTROUTING -o eth1 -p tcp –dport 80 -s 192.168.52.0/24 -j SNAT –to-source 202.96.134.10:20000-30000

iptables -t nat -I POSTROUTING -o eth1 -p udp –dport 80 -s 192.168.52.0/24 -j SNAT –to-source 202.96.134.10:20000-30000

4. 测试:在内部网的任一台计算机上打开浏览器,输入任一非本网络的IP,都将指向IP为202.96.134.130的网站.

发布内部网络服务器

 

 

图4

要使因特网上的计算机访问到内部网的FTP服务器、WEB服务器,在做为防火墙的计算机上应添加以下规则:

1. echo 1 > /proc/sys/net/ipv4/ip_forward

2. 发布内部网web服务器
iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 –dport 80 -j DNAT –to-destination 192.168.52.15:80
iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.15 –sport 80 -j SNAT –to-source 202.96.134.10:20000-30000 

3. 发布内部网ftp服务器
iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 –dport 21 -j DNAT –to-destination 192.168.52.14:21
iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.14 –sport 21 -j SNAT –to-source 202.96.134.10:40000-50000  

4. 注意:内部网的计算机网关要设置为防火墙的ip(192.168.52.1)

5. 测试: 用一台IP地址为202.96.134.0段的计算机虚拟因特网访问,当在其浏览器中访问http://202.96.134.10时,实际应看到的是192.168.52.15的的web服务;

当访问ftp://202.96.134.10时,实际应看到的是192.168.52.14上的的ftp服务

 

智能DNS

图5

1. echo 1 > /proc/sys/net/ipv4/ip_forward

2. 在NAT服务器上添加以下规则:

在PREROUTING链中添加目的地址转换规则:
iptables -t nat -I PREROUTING -i eth0 -p tcp –dpor 53 -j DNAT –to-destination 202.96.134.130

iptables -t nat -I PREROUTING -i eth0 -p udp –dpor 53 -j DNAT –to-destination 202.96.134.130

在POSTROUTING链中添加源地址转换规则:
iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p tcp –dpor 53 -j SNAT –to-source 202.96.134.10:40000-50000

iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p udp –dpor 53 -j SNAT –to-source 202.96.134.10:40000-50000

3. 测试

在内部网任一台计算机上,将DNS设置为任意的外网IP,就可以使用DNS测试工具如nslookup来解析DNS服务器202.96.134.130上的名称.

 

端口映射

见上节透明代理设置

#iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 –dport 80 -j REDIRECT –to-ports 3128

 

通过NAT上网

  • 典型NAT上网

一般做为NAT的计算机同时也是局域网的网关,假定该机有两块网卡eth0、eth1,eth0连接外网,IP为202.96.134.134;eth1连接局域网,IP为192.168.62.10

1. 先在内核里打开ip转发功能

#echo 1 > /proc/sys/net/ipv4/ip_forward

2.?使局域网用户能访问internet所要做的nat

#iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT –to?202.96.134.134

如果上网的IP是动态IP,则使用以下规则:

#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.62.0/24 -j MASQUERADE

如果是通过ADSL上网,且公网IP是动态IP,则使用以下规则:

#iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.62.0/24 -j MASQUERADE

3. 使internet用户可以访问局域网内web主机所要做的nat

#iptables -t nat -A PREROUTING -p tcp -d 202.96.134.134 –dport 80 -j DNAT –to-destination 192.168.62.10

注:局域网内的客户端需将默认网关、DNS设为防火墙的IP

  • 在我们的网络机房实现NAT共享上网

工作环境:上层代理192.168.60.6(4480),只授予教师机(192.168.62.111)使用该代理的权限

目标:不使用squid代理上网,而是使用NAT的方式上网

方法:

1) 确保停止教师机(192.168.62.111)的squid或其它代理服务

2) 客户端网关、DNS均指向192.168.62.111,浏览器代理设置为192.168.60.6(4480)。测试在当前情况下能否上网

3) 在教师机(192.168.62.111)上添加如下iptables规则:

#iptables -t nat -A POSTROUTING -p tcp -d 192.168.60.6/32 –dport 4480 -j SNAT –to-source 192.168.62.111:10000-30000

解释:对于目的地为192.168.60.6、目的端口为4480的TCP包,在经过防火墙路由后,将其源地址转换为192.168.62.111,端口转换为10000-30000间的某个端口。

4) 客户端测试能否上网

IP规则的保存与恢复

iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载

使用命令iptables-save来保存规则。一般用

iptables-save > /etc/sysconfig/iptables

生成保存规则的文件 /etc/sysconfig/iptables,

也可以用

service iptables save

它能把规则自动保存在/etc/sysconfig/iptables中。

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

iptables 指令语法

iptables [-t table] command [match] [-j target/jump]

[-t table] 指定规则表

-t 参数用来,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。个规则表的功能如下:

nat:此规则表拥有 PREROUTING 和 POSTROUTING 两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT、DNAT),这个规则表除了作网址转换外,请不要做其它用途。

mangle:此规则表拥有 PREROUTING、FORWARD 和 POSTROUTING 三个规则链。除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。

filter: 这个规则表是默认规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。

command 常用命令列表:

命令 -A, –append
范例 iptables -A INPUT …
说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。

命令 -D, –delete
范例 iptables -D INPUT –dport 80 -j DROP
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

命令 -R, –replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则,规则被取代后并不会改变顺序。

命令 -I, –insert
范例 iptables -I INPUT 1 –dport 80 -j ACCEPT
说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。

命令 -L, –list
范例1 iptables -L INPUT
说明 列出某规则链中的所有规则。
范例2 iptables -t nat -L 
说明 列出nat表所有链中的所有规则。

命令 -F, –flush
范例 iptables -F INPUT
说明 删除filter表中INPUT链的所有规则。

命令 -Z, –zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令 -N, –new-chain
范例 iptables -N allowed
说明 定义新的规则链。

命令 -X, –delete-chain
范例 iptables -X allowed
说明 删除某个规则链。

命令 -P, –policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包, 默认的处理方式。

命令 -E, –rename-chain
范例 iptables -E allowed disallowed
说明 修改某 自定义规则链的名称。

[match] 常用封包匹配参数

参数 -p, –protocol
范例 iptables -A INPUT -p tcp
说明 匹配通讯协议类型是否相符,可以使用 ! 运算符进行反向匹配,例如:
-p !tcp 
意思是指除 tcp 以外的其它类型,如udp、icmp …等。
如果要匹配所有类型,则可以使用 all 关键词,例如:
-p all

参数 -s, –src, –source
范例 iptables -A INPUT -s 192.168.1.1
说明 用来匹配封包的来源 IP,可以匹配单机或网络,匹配网络时请用数字来表示 子网掩码,例如:
-s 192.168.0.0/24
匹配 IP 时可以使用 ! 运算符进行反向匹配,例如:
-s !192.168.0.0/24。

参数 -d, –dst, –destination
范例 iptables -A INPUT -d 192.168.1.1
说明 用来匹配封包的目的地 IP,设定方式同上。

参数 -i, –in-interface
范例 iptables -A INPUT -i eth0
说明 用来匹配封包是从哪块网卡进入,可以使用通配字符 + 来做大范围匹配,例如:
-i eth+ 
表示所有的 ethernet 网卡
也可以使用 ! 运算符进行反向匹配,例如:
-i !eth0

参数 -o, –out-interface
范例 iptables -A FORWARD -o eth0
说明 用来匹配封包要从哪 块网卡送出,设定方式同上。

参数 –sport, –source-port
范例 iptables -A INPUT -p tcp –sport 22
说明 用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:
–sport 22:80
表示从 22 到 80 端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用 –multiport 参数,详见后文。匹配端口号时,可以使用 ! 运算符进行反向匹配。

参数 –dport, –destination-port
范例 iptables -A INPUT -p tcp –dport 22
说明 用来匹配封包的目的地端口号,设定方式同上

参数 –tcp-flags
范例 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
说明匹配 TCP 封包的状态标志,参数分为两个部分,第一个部分列举出想 匹配的标志,第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。TCP 状态标志包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) 、PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行匹配。匹配标志时,可以使用 ! 运算符行反向匹配。

参数 –syn
范例 iptables -p tcp –syn
说明 用来表示TCP通信协议中,SYN位被打开,而ACK与FIN位关闭的分组,即TCP的初始连接,与 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算符,可用来 匹配非要求连接封包。

参数 -m multiport –source-port
范例 iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110
说明用来匹配不连续的多个源端口,一次最多可以匹配 15 个端口,可以使用 ! 运算符进行反向匹配。

参数 -m multiport –destination-port
范例 iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
说明用来 匹配不连续的多个目的地端口号,设定方式同上

参数 -m multiport –port
范例 iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
说明 这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80目的地端口号为 110,这种封包并不算符合条件。

参数 –icmp-type
范例 iptables -A INPUT -p icmp –icmp-type 8
说明用来匹配 ICMP 的类型编号,可以使用代码或数字编号来进行 匹配。请打 iptables -p icmp –help 来查看有哪些代码可用。

参数 -m limit –limit
范例 iptables -A INPUT -m limit –limit 3/hour
说明 用来匹配某段时间内封包的平均流量,上面的例子是用来 匹配:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封 包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,以避免因骇客使用洪水攻击法,导致服务被阻断。

参数 –limit-burst
范例 iptables -A INPUT -m limit –limit-burst 5
说明 用来匹配瞬间大量封包的数量,上面的例子是用来匹配一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。

参数 -m mac –mac-source
范例 iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
说明 用来匹配封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 POSTROUTING 规则链上,这是因为封包要送到网 卡后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包匹配时,并不知道封包会送到哪个网络接口去。

参数 –mark
范例 iptables -t mangle -A INPUT -m mark –mark 1
说明 用来匹配封包是否被表示某个号码,当封包被 匹配成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最大不可以超过 4294967296。

参数 -m owner –uid-owner
范例 
iptables -A OUTPUT -m owner –uid-owner 500
说明 用来匹配来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法 匹配出来自其它主机的封包。

参数 -m owner –gid-owner
范例 iptables -A OUTPUT -m owner –gid-owner 0
说明 用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数 -m owner –pid-owner
范例 
iptables -A OUTPUT -m owner –pid-owner 78
说明 用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。

参数 -m owner –sid-owner
范例 
iptables -A OUTPUT -m owner –sid-owner 100
说明 用来匹配来自本机的封包,是否为某特定 连接(Session ID)的响应封包,使用时机同上。

参数 -m state –state
范例 
iptables -A INPUT -m state –state RELATED,ESTABLISHED
说明 用来匹配连接状态, 连接状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该封包的连接编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的连接。
NEW 表示该封包想要起始一个连接(重设连接或将连接重导向)。
RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA 连接必定是源自某个 FTP 连接。

[-j target/jump] 常用的处理动作:

-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:

ACCEPT: 将封包放行,进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链(natostrouting)。

REJECT: 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个封包会要求对方关闭 连接),进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。 范例如下:
iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset

DROP: 丢弃封包不予处理,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。

REDIRECT: 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。 这个功能可以用来实现透明代理或用来保护 web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

MASQUERADE: 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则 链(manglepostrouting)。这个功能与SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP会从网卡直接读取,当使用拨 号接连时,IP通常是由ISP公司的DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE –to-ports 1024-31000

LOG: 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续匹配其规则。例如:
iptables -A INPUT -p tcp -j LOG –log-prefix "INPUT packets"

SNAT: 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT –to-source?194.236.50.155-194.236.50.160:1024-32000 

DNAT: 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination 192.168.1.1-192.168.1.10:80-100

MIRROR: 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

QUEUE: 中断过滤程序,将封包放入队列,交给其它程序处理。通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。

RETURN: 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

MARK: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续匹配其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 2

iptables实例

单个规则实例

iptables -F?
# -F 是清除的意思,作用就是把 FILTRE TABLE 的所有链的规则都清空

iptables -A INPUT -s 172.20.20.1/32 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT
#在 FILTER 表的 INPUT 链匹配源地址是172.20.20.1的主机,状态分别是NEW,ESTABLISHED,RELATED 的都放行。

iptables -A INPUT -s 172.20.20.1/32 -m state –state NEW,ESTABLISHED -p tcp -m multiport –dport 123,110 -j ACCEPT
# -p 指定协议,-m 指定模块,multiport模块的作用就是可以连续匹配多各不相邻的端口号。完整的意思就是源地址是172.20.20.1的主机,状态分别是NEW, ESTABLISHED,RELATED的,TCP协议,目的端口分别为123 和 110 的数据包都可以通过。

iptables -A INPUT -s 172.20.22.0/24 -m state –state NEW,ESTABLISHED -p tcp -m multiport –dport 123,110 -j ACCEPT

iptables -A INPUT -s 0/0 -m state –state NEW -p tcp -m multiport –dport 123,110 -j DROP
#这句意思为源地址是0/0的 NEW状态的的TCP数据包都禁止访问我的123和110端口。

iptables -A INPUT -s ! 172.20.89.0/24 -m state –state NEW -p tcp -m multiport –dport 1230,110 -j DROP
# "!"号的意思 取反。就是除了172.20.89.0这个IP段的地址都DROP。

iptables -R INPUT 1 -s 192.168.6.99 -p tcp –dport 22 -j ACCEPT
替换INPUT链中的第一条规则

iptables -t filter -L INPUT -vn
以数字形式详细显示filter表INPUT链的规则

 

#——————————-NAT IP————————————–
#以下操作是在 NAT TABLE 里面完成的。请大家注意。

iptables -t nat -F
iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp –dport 90 -j DNAT –to 172.20.11.1:800

#-A PREROUTING 指定在路由前做的。完整的意思是在 NAT TABLE 的路由前处理,目的地为192.168.102.55 的 目的端口为90的我们做DNAT处理,给他转向到172.20.11.1:800那里去。

iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT –to 192.168.102.55

#-A POSTROUTING 路由后。意思为在 NAT TABLE 的路由后处理,凡是目的地为 172.20.11.1 的,我们都给他做SNAT转换,把源地址改写成 192.168.102.55 。

 

iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP 
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP 
iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP 
iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP

# 上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,因为出入eth1的包的ip应该是公共IP

iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP 
iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP 
iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP

# 防止广播包从IP代理服务器进入局域网: 

iptables -A INPUT -p tcp -m tcp –sport 5000 -j DROP 
iptables -A INPUT -p udp -m udp –sport 5000 -j DROP 
iptables -A OUTPUT -p tcp -m tcp –dport 5000 -j DROP 
iptables -A OUTPUT -p udp -m udp –dport 5000 -j DROP

# 屏蔽端口 5000

iptables -A INPUT -s 211.148.130.129 -i eth1 -p tcp -m tcp –dport 3306 -j DROP 
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp –dport 3306 -j ACCEPT 
iptables -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p tcp -m tcp –dport 3306 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp –dport 3306 -j DROP

# 防止 Internet 网的用户访问 MySQL 服务器(就是 3306 端口)

iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset

#REJECT, 类似于DROP,但向发送该包的主机回复由–reject-with指定的信息,从而可以很好地隐藏防火墙的存在

www的iptables实例

#!/bin/bash

export PATH=/sbin:/usr/sbin:/bin:/usr/bin

#加载相关模块

modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ipt_limit

echo 1 >;/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 >;/proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 >;/proc/sys/net/ipv4/conf/all/accept_redirects
echo 1 >;/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 >;/proc/sys/net/ipv4/conf/all/log_martians
echo 1 >;/proc/sys/net/ipv4/tcp_syncookies
iptables -F
iptables -X
iptables -Z

## 允许本地回路?Loopback – Allow unlimited traffic
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

## 防止SYN洪水?SYN-Flooding Protection
iptables -N syn-flood
iptables -A INPUT -i ppp0 -p tcp –syn -j syn-flood
iptables -A syn-flood -m limit –limit 1/s –limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP

## 确保新连接是设置了SYN标记的包?Make sure that new TCP connections are SYN packets 
iptables -A INPUT -i eth0 -p tcp ! –syn -m state –state NEW -j DROP

## 允许HTTP的规则
iptables -A INPUT -i ppp0 -p tcp -s 0/0 –sport 80 -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -s 0/0 –sport 443 -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -d 0/0 –dport 80 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -d 0/0 –dport 443 -j ACCEPT

## 允许DNS的规则
iptables -A INPUT -i ppp0 -p udp -s 0/0 –sport 53 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -d 0/0 –dport 53 -j ACCEPT

## IP包流量限制?IP packets limit
iptables -A INPUT -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j DROP

## 允许SSH
iptables -A INPUT -p tcp -s ip1/32 –dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s ip2/32 –dport 22 -j ACCEPT

## 其它情况不允许?Anything else not allowed
iptables -A INPUT -i eth0 -j DROP

一个包过滤防火墙实例

环境:redhat9 加载了string time等模块

eth0 接外网──ppp0 
eth1 接内网──192.168.0.0/24

#!/bin/sh 

modprobe ipt_MASQUERADE 
modprobe ip_conntrack_ftp 
modprobe ip_nat_ftp 
iptables -F 
iptables -t nat -F 
iptables -X 
iptables -t nat -X 
###########################INPUT键################################### 
iptables -P INPUT DROP 
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -p tcp -m multiport –dports 110,80,25 -j ACCEPT 
iptables -A INPUT -p tcp -s 192.168.0.0/24 –dport 139 -j ACCEPT 
#允许内网samba,smtp,pop3,连接 
iptables -A INPUT -i eth1 -p udp -m multiport –dports 53 -j ACCEPT 
#允许dns连接 
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT 
iptables -A INPUT -p gre -j ACCEPT 
#允许外网vpn连接 
iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -i ppp0 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP 
#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃 
iptables -A INPUT -s 192.186.0.0/24 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP 
#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃 
iptables -A INPUT -p icmp -m limit –limit 3/s -j LOG –log-level INFO –log-prefix "ICMP packet IN: " 
iptables -A INPUT -p icmp -j DROP 
#禁止icmp通信-ping 不通 
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE 
#内网转发 
iptables -N syn-flood 
iptables -A INPUT -p tcp –syn -j syn-flood 
iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst 6 -j RETURN 
iptables -A syn-flood -j REJECT 
#防止SYN攻击 轻量 
#######################FORWARD链########################### 
iptables -P FORWARD DROP 
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -m multiport –dports 80,110,21,25,1723 -j ACCEPT 
iptables -A FORWARD -p udp -s 192.168.0.0/24 –dport 53 -j ACCEPT 
iptables -A FORWARD -p gre -s 192.168.0.0/24 -j ACCEPT 
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT 
#允许 vpn客户走vpn网络连接外网 
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT 
iptables -I FORWARD -p udp –dport 53 -m string –string "tencent" -m time –timestart 8:15 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
#星期一到星期六的8:00-12:30禁止qq通信 
iptables -I FORWARD -p udp –dport 53 -m string –string "TENCENT" -m time –timestart 8:15 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
#星期一到星期六的8:00-12:30禁止qq通信 
iptables -I FORWARD -p udp –dport 53 -m string –string "tencent" -m time –timestart 13:30 –timestop 20:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
iptables -I FORWARD -p udp –dport 53 -m string –string "TENCENT" -m time –timestart 13:30 –timestop 20:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
#星期一到星期六的13:30-20:30禁止QQ通信 
iptables -I FORWARD -s 192.168.0.0/24 -m string –string "qq.com" -m time –timestart 8:15 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
#星期一到星期六的8:00-12:30禁止qq网页 
iptables -I FORWARD -s 192.168.0.0/24 -m string –string "qq.com" -m time –timestart 13:00 –timestop 20:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
#星期一到星期六的13:30-20:30禁止QQ网页 
iptables -I FORWARD -s 192.168.0.0/24 -m string –string "ay2000.net" -j DROP 
iptables -I FORWARD -d 192.168.0.0/24 -m string –string "宽频影院" -j DROP 
iptables -I FORWARD -s 192.168.0.0/24 -m string –string "色情" -j DROP 
iptables -I FORWARD -p tcp –sport 80 -m string –string "广告" -j DROP 
#禁止ay2000.net,宽频影院,色情,广告网页连接 !但中文 不是很理想 
iptables -A FORWARD -m ipp2p –edk –kazaa –bit -j DROP 
iptables -A FORWARD -p tcp -m ipp2p –ares -j DROP 
iptables -A FORWARD -p udp -m ipp2p –kazaa -j DROP 
#禁止BT连接 
iptables -A FORWARD -p tcp –syn –dport 80 -m connlimit –connlimit-above 15 –connlimit-mask 24 -j DROP 
#只允许每组ip同时15个80端口转发 
####################################################################### 
sysctl -w net.ipv4.ip_forward=1 &>/dev/null 
#打开转发 
####################################################################### 
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null 
#打开 syncookie (轻量级预防 DOS 攻击) 
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null 
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数) 
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null 
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节) 
####################################################################### 
iptables -I INPUT -s 192.168.0.50 -j ACCEPT 
iptables -I FORWARD -s 192.168.0.50 -j ACCEPT 
#192.168.0.50是我的机子,全部放行!

squid+iptables

[原创] squid+iptables实现网关防火墙
http://www.chinaunix.net 作者:jackylau 发表于:2007-05-27 10:40:01
【发表评论】【查看原文】【Proxy服务器讨论区】【关闭】

需求说明:此服务器用作网关、MAIL(开启web、smtp、pop3)、FTP、DHCP服务器,内部一台机器(192.168.0.254)对外提供dns服务,为了不让无意者轻易看出此服务器开启了ssh服务器,故把ssh端口改为2018.另把proxy的端口改为60080

eth0:218.28.20.253,外网口

eth1:192.168.0.1/24,内网口

[jackylau@proxyserver init.d]$cat /etc/squid/squid.conf(部份如下)
http_port 192.168.0.1:60080
httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl allow_lan src 192.168.0.0/24
http_access allow allow_lan
visible_hostname proxyserver
[jackylau@proxyserver init.d]$ cat firewall 
#!/bin/sh
# Author: jackylau <squidipt@yahoo.com.cn>;
# chkconfig: 2345 08 92
# description: firewall
# Time on 2005.08.02

# killproc
# Set ENV
INET_IP="218.28.20.253"
INET_IFACE="eth0"
LAN_IP="192.168.0.1"
LAN_IP_RANGE="192.168.0.0/24"
LAN_BROADCAST_ADDRESS="192.168.0.255"
LAN_IFACE="eth1"
LO_IFACE="lo"
LO_IP="127.0.0.1"
IPTABLES="/sbin/iptables"

start(){
echo -n $"Starting firewall:"
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

echo "1" >; /proc/sys/net/ipv4/ip_forward

# Set policies
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Add bad_tcp_packets, allowed and icmp_packets
$IPTABLES -N bad_tcp_packets
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N allowed
$IPTABLES -N icmp_packets

# bad_tcp_packets 
$IPTABLES -A bad_tcp_packets -p tcp ! –syn -m state –state NEW -j LOG –log-level INFO –log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p TCP ! –syn -m state –state NEW -j DROP

# allowed 
$IPTABLES -A allowed -p TCP –syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT

# TCP rules
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 20 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 25 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 110 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 2018 -j allowed

# UDP rules
$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 67 -j ACCEPT

# ICMP rules
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 11 -j ACCEPT

# INPUT chain
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
$IPTABLES -A INPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix "IPT INPUT packet died: "

# FORWARD chain
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix "IPT FORWARD packet died: "

# OUTPUT chain
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT

$IPTABLES -A OUTPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix "IPT OUTPUT packet died: "

# SNAT table
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT –to-source $INET_IP

# DNAT table
$IPTABLES -t nat -A PREROUTING -p ! icmp -d $INET_IP -dport 53 -j DNAT –to-destination 192.168.0.254:53

# REDIRECT 
$IPTABLES -t nat -A PREROUTING -i $LAN_IFACE -p tcp -s $LAN_IP_RANGE –dport 80 -j REDIRECT –to-ports 60080
touch /var/lock/subsys/firewall
}

stop(){
echo -n $"Stoping firewall:"
echo "0">;/proc/sys/net/ipv4/ip_forward
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
rm -f /var/lock/subsys/firewall
}

status(){
clear
echo "——————————————————————-"
$IPTABLES -L
echo "——————————————————————-"
$IPTABLES -t nat -L POSTROUTING
echo "——————————————————————-"
$IPTABLES -t nat -L PREROUTING
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "$0 [start|stop|restart|status]"
;;
esac
cp firewall /etc/init.d/
chmod 700 /etc/init.d/firewall
chkconfig –add firewall

rc.firewall脚本代码

#!/bin/sh
#
# rc.firewall – Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables
#
# Copyright (C) 2001?Oskar Andreasson <bluefluxATkoffeinDOTnet>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.?See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program or from the site that you downloaded it
# from; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA?02111-1307?USA
#

###########################################################################
#
# 1. 配置选项.
#

#
# 1.1 Internet 相关变量设置.
#

INET_IP="194.236.50.155"
INET_IFACE="eth0"
INET_BROADCAST="194.236.50.255"

#
# 1.1.1 DHCP相关设置
#

#
# 1.1.2 PPPoE相关设置
#

#
# 1.2 局域网相关变量设置.
#

LAN_IP="192.168.0.2" #防火墙连接局域网的IP地址
LAN_IP_RANGE="192.168.0.0/16" #局域网地址
LAN_IFACE="eth1" #防火墙连接局域网的网络接口

#
# 1.3 DMZ 非军事区相关变量设置.
#

#
# 1.4 本机相关变量设置.
#

LO_IFACE="lo" #本地接口名称
LO_IP="127.0.0.1" #本地接口IP 

#
# 1.5 IPTables 路径设置.
#

IPTABLES="/usr/sbin/iptables"

#
# 1.6 其它配置.
#

###########################################################################
#
# 2. 要加载的模块.
#

#
# 初始加载的模块
#

/sbin/depmod -a

#
# 2.1 需加载的模块
#

/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

#
# 2.2 不需加载的模块
#

#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc

###########################################################################
#
# 3. /proc 设置.
#

#
# 3.1 需要的proc配置
#

echo "1" > /proc/sys/net/ipv4/ip_forward

#
# 3.2 不需要的proc配置
#

#echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr

###########################################################################
#
# 4. 建立规则.
#

######
# 4.1 Filter表
#

#
# 4.1.1 建立策略
#

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#
# 4.1.2 创建自定义链Create userspecified chains
#

#
# 为不可靠的tcp包建立自定义链Create chain for bad tcp packets
#

$IPTABLES -N bad_tcp_packets

#
# 分别为ICMP, TCP 和 UDP协议建立自定义链Create separate chains for ICMP, TCP and UDP to traverse
#

$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets

#
# 4.1.3 在自定义链建立规则Create content in userspecified chains
#

#
# bad_tcp_packets链bad_tcp_packets chain
#
#这条链包含的规则检查进入包(incoming packet)的包头是否不正常或有没有其他问题,并进行相应地处理。但事实上,我们使用它只是为了过滤掉一些特殊的包:没有设置SYN位但又是NEW状态的TCP包,还有那些设置了SYN/ACK但也被认为是NEW状态的TCP包。这条链可以用来检查所有可能的不一致的东西

$IPTABLES -A bad_tcp_packets -p tcp –tcp-flags SYN,ACK SYN,ACK -m state –state NEW -j REJECT –reject-with tcp-reset

$IPTABLES -A bad_tcp_packets -p tcp ! –syn -m state –state NEW -j LOG –log-prefix "New not syn:"

$IPTABLES -A bad_tcp_packets -p tcp ! –syn -m state –state NEW -j DROP

#
# allowed链?allowed chain
#

$IPTABLES -A allowed -p TCP –syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

#
# TCP规则?TCP rules
#

$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 113 -j allowed

#
# UDP端口?UDP ports
#

#$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 53 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 123 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 2074 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 4000 -j ACCEPT

#
# 如果网络中存在Microsoft网络的话,你会遭遇洪水一样的广播信息,下面的指令将阻止这些广播并在日志中#记录.?In Microsoft Networks you will be swamped by broadcasts. These lines 
# will prevent them from showing up in the logs.
#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST –destination-port?135:139 -j DROP

#
# 如果有来自我们网络之外的DHCP请求的话,就会很快把我们的日志塞满,下面的指令If we get DHCP requests from the Outside of our network, our logs will 
# be swamped as well. This rule will block them from getting logged.
#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 –destination-port 67:68 -j DROP

#
#ICMP规则?ICMP rules
#

$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 11 -j ACCEPT

#
# 4.1.4 INPUT链?INPUT chain
#

#
# 排除不良TCP包?Bad TCP packets we don't want.
#

$IPTABLES -A INPUT -p tcp -j bad_tcp_packets

#
# 非internet网络部分的规则?Rules for special networks not part of the Internet
#

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT

#
# 有关本地DHCP的特殊规则?Special rule for DHCP requests from LAN, which are not caught properly
# otherwise.
#

$IPTABLES -A INPUT -p UDP -i $LAN_IFACE –dport 67 –sport 68 -j ACCEPT

#
# 来自因特网的进入包的规则 Rules for incoming packets from the internet.
#

$IPTABLES -A INPUT -p ALL -d $INET_IP -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

#
# 如果防火墙外存在Microsoft网络的话,你会遭遇洪水一样的多播信息,下面的指令将丢弃这些包,所以日志就不会被这些东西淹没# 记录If you have a Microsoft Network on the outside of your firewall, you may 
# also get flooded by Multicasts. We drop them so we do not get flooded by 
# logs
#

#$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP

#
# 将不满足上述规则的形为怪异的包记录在案 Log weird packets that don't match the above.
#

$IPTABLES -A INPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix "IPT INPUT packet died: "

#
# 4.1.5 FORWARD链?FORWARD chain
#

#
# 排除不良TCP包?Bad TCP packets we don't want
#

$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

#
# 接收想要转发的TCP包?Accept the packets we actually want to forward
#

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

#
# 将不满足上述规则的形为怪异的包记录在案?Log weird packets that don't match the above.
#

$IPTABLES -A FORWARD -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix "IPT FORWARD packet died: "

#
# 4.1.6?OUTPUT链?OUTPUT chain
#

#
# 排除不良TCP包?Bad TCP packets we don't want.
#

$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets

#
# 决定允许哪个IP包OUTPUT的规则?Special OUTPUT rules to decide which IP's to allow.
#

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT

#
# 将不满足上述规则的形为怪异的包记录在案?Log weird packets that don't match the above.
#

$IPTABLES -A OUTPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix "IPT OUTPUT packet died: "

######
# 4.2 nat表?nat table
#

#
# 4.2.1 设置策略?Set policies
#

#
# 4.2.2 创建用户自定义链?Create user specified chains
#

#
# 4.2.3 在用户自定义链中建立规则?Create content in user specified chains
#

#
# 4.2.4 PREROUTING链?PREROUTING chain
#

#
# 4.2.5 POSTROUTING链?POSTROUTING chain
#

#
# 允许简单的IP转发及网络地址转换?Enable simple IP Forwarding and Network Address Translation
#

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT –to-source $INET_IP

#
# 4.2.6 OUTPUT链?OUTPUT chain
#

######
# 4.3 mangle表?mangle table
#

#
# 4.3.1 设置策略?Set policies
#

#
# 4.3.2 创建用户自定义链?Create user specified chains
#

#
# 4.3.3 在用户自定义链中建立规则?Create content in user specified chains
#

#
# 4.3.4 PREROUTING链?PREROUTING chain
#

#
# 4.3.5 INPUT链?INPUT chain
#

#
# 4.3.6 FORWARD链?FORWARD chain
#

#
# 4.3.7 OUTPUT链?OUTPUT chain
#

#
# 4.3.8 POSTROUTING链?POSTROUTING chain
#

初始化

IPTABLES -X

IPTABLES -t nat -X

IPTABLES -t mangle -X

iptables -Z 

定义策略(默认规则)

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 -j ACCEPT

练习

1. 设置iptables规则,使某几台计算机能访问本机的web服务,其它计算机不能访问本机的web服务.

Linux

5.22 日志

视频的制作已经进入尾声了,我小心翼翼地把片头、正片、片尾分成3块来输出,只因为Adobe Media Encoder的各种不稳定,就算谨慎如此,今天也发生故障无数次,重启过数次系统,目前还正在输出正片部分的无损视频。等这三块分别输出完毕后,再调色(直接调色的话,AE和Premiere又会有各种故障)、拼成一整块,最后编码成H264的成品视频。今天下午的时候我也试过编码这一块的工作了,仍然是技术含量高、极易发生故障的环节。总结来说,做视频的人你们各种伤不起。

从3月10日开始截取demo素材,今天已经过去快2个半月。除去自己的懒惰因素,视频制作还真的是很难,力不从心的时候太多,也有太多的地方没有把自己原本想要表达或者展现的东西做出来,非常遗憾。做到最后,我觉得这部视频真的是十分烂,不敢拿出来见人了。不过终究还是要拿出来,不然我对不起关心这部视频的朋友们。以后如果再次休长假找不到事做,或许可能再重新做一部短的,慢工出一次细活,看能不能真正把自己想要表达的东西给完完全全展现出来。

好几个人问我,为CS视频花了这么多时间,如果有一天突然完成了、一下找不到忙的了,会不会很失落。这几乎是必然的,尤其是我这么忧郁的人,怎么可能不伤感,哈哈=,=忧郁的我还硬在字幕部分插入了一句装逼的忧郁话,不知道会不会被观众各种骂啊,哈哈。

25号早上就要出差,我表示这次出差真的是让我各种措手不及,相当于直接扔了条deadline在我面前,让我不得不赶在出差前把该做的给做了。第一次去广州,我觉得我应该不会在那边过得十分嗨,我太习惯川菜和川妹子了,我也太喜欢川菜和川妹子了,在那边我可如何是好。同时,我还要失去我的小房间、装有2T各种资料(邪恶的和正义的都有)的电脑、还有很多朋友。还好只去一个月,应该会过得十分快。

不知不觉已经戒烟大半月了。最近已经对抽烟完全无感,爸妈听到这个消息后也十分高兴,我妈高兴的是我不用被香烟伤害身体了,我爸则想得更多,他在猜想是不是因为我有女朋友了所以才戒烟。对此我表示,他又想多了,我戒烟完全无动机无预谋,唯一的原因就是,LEO和TK都戒了,这就是小团队成员互相之间的影响力。

这个日志是我在这个网站上第一篇比较正经的日志,也是最近2、3年来第一篇在QQ空间之外的地方首发的日志。TK一直对我在QQ空间写日志颇有微词,但其实在哪里写不是写,在QQ空间写图个方便,而且好友多、观众多、互动多,多好啊。你看,我在这个破地方写,连个看的人都没有,典型自娱自乐嘛。很久很久以前,我在live space上写过博客,后来因为没人看,荒废了;后来,我又在淫淫网写过,比QQ空间的人气旺多了,不过想不起来为什么又回QQ空间了,估计还是因为方便。现在开辟这个网站主要因为学习LAMP,顺便开个wordpress玩,不过正好可以给CS视频提供下空间,也算不错了。

正片部分马上输出完毕了,闪人!

日志 ,

视频快要完成

服务器快要重装,由此最近也没更新这个网站。

视频制作接近尾声,正在做字幕,希望不要太烂。

这段时间似乎已经忘掉她了,这种感觉真好。

不写了,继续做视频了。

日志

神清气爽

RT,今天精神状态不错 , 喉咙还有点不爽, 戒烟了反而喉咙一直感觉不适,不知道是心理作用还是怎么的。

Google上终于能靠feomepler这个关键词搜到这个站点了,非常装逼啊……

接下来全力以赴把CS视频做完,不能再耽误了。据说16号就要出差,我不想在外面的一个月每天都牵肠挂肚。要是到时候还没做完就悲剧了。

话说刚才蛋疼跑去百度了下feomepler,麻痹不仅没有搜到这个站,还把老子在色情站点发的帖子都给弄出来了!一辈子的污点啊有没有!!!老子恨百度!!!

日志 ,

最近精神状态极差。

比如此时此刻已经困到不行了。

相比之前坐班车睡觉的日子,现在是要困乏不少。

这段时间每天晚上还不得不集中精力做视频,经常忙到半夜。

某TK原谅我在上班时候打瞌睡吧。

另外,戒烟第三天,有时候仍然想抽,但还能轻松控制住。

日志