Pages

Thursday, 3 January 2013

iptables 快速入门教程

iptables 是何物?简而言之,就是 Linux 的防火墙配置工具,而这防火墙的核心是 Linux 的 Netfilter 模块,底层的东西就不讨论了,但 iptables 这工具对于 Linux 来说是灰常重要,可以说是命脉之一,因此是必须掌握的,整理了一份快速入门的资料分享下。
语法(常用)

iptables 表类 参数 链 条件 -j 动作

如:
iptables -t filter -A OUTPUT --sport 22 -j DROP
1
   
iptables -t filter -A OUTPUT --sport 22 -j DROP

    表类(与下面的链一起记忆)

-t 或 --table table     表类型,不指定默认为 filter 。

    参数(常用)

-F [chain]     清除指定链和表中的所由规则,假如不指定链,那么所有链都将被清空。
-X [chain]     删除指定的用户定义链,必需保证链中的规则都不在使用时才能删除,若没有指定链,则删除所有用户链。
-Z [chain [rulenum]]     将指定链中所由的规则包字节计数器清零。
-A chain     在所选链尾加入一条或多条规则
-D chain rulenum     删除指定规则
-R chain rulenum     在所选链中替换一条匹配规则
-I chain [rulenum]     在指定链后加入一条或多条规则
-L [chain]     列出指定链中的所有规则,如果没有指定链,将列出链中的所有规则。
-P chain     设置默认策略
-N chain     新建一个链
-E oldchain newchain     把用户自定义的链 oldchain 重命名为 newchain
-n 或 --numeric     以数字方式显示,不进行解析。
-v 或 --verbose     详细信息
-x 或 --exact     计数器的精确值,不做单位换算。
--line-numbers     显示行号

注: chain 指的是下面的链

    链

这里跟表有对应关系,可以一起记忆为 三表五链
filter
允许否     INPUT
流入     mangle
修改报文数据     PREROUTING
路由前
FORWARD
转发     OUTPUT
发送
OUTPUT
发送     INPUT
流入
nat
地址转换     PREROUTING
路由前     FORWARD
转发
POSTROUTING
路由后     POSTROUTING
路由后
OUTPUT
发送        

    条件(常用)

-s ip     指定源地址或者地址范围,可以是 IP 或 NETWORK/NETMASK 。
-d ip     指定目的地址或者地址范围,可以是 IP 或 NETWORK/NETMASK 。
-i interface     流入网络接口,如 eth0 。
-o interface     对外网络接口,如 eth0 。
-p protocol     预设协议,常用的有 tcp/udp/icmp/all 。
--dport port     目标端口 要先指定 -p
--sport port     源端口 要先指定 -p

    动作

DROP     丢弃包
REJECT     拒绝包,丢弃包同时给发送者发送没有接受的通知。
ACCEPT     允许包通过
LOG     包的有关信息记录到日志
DNAT     目标 nat
SNAT     源 nat
MASQUERADE     地址伪装
REDIRECT     重定向
MARK     标记
RETURN     返回

    补充
    $ /etc/init.d/iptables save
    $ iptables-save > path/to/backup/iptables.bak
    $ iptables-restore < path/to/backup/iptables.bak

    行1,保存规则,不然重启后恢复原样。
    行2,规则另存为,备份规则。
    行3,规则导入,备份还原。

        实战

    基础匹配
    iptables -A INPUT -p ! tcp iptables -A INPUT -p tcp --sport www iptables -A INPUT -p tcp --sport 80 iptables -A INPUT -p tcp --dport 22:80
      
    iptables -A INPUT -p ! tcp
    iptables -A INPUT -p tcp --sport www
    iptables -A INPUT -p tcp --sport 80
    iptables -A INPUT -p tcp --dport 22:80

    行1,指定匹配 TCP 以外的协议, ! 表非。
    行2-3,匹配单一指定源端口。
    行4,指定端口范围22到80端口。

    多端口匹配扩展
    iptables -A INPUT -p tcp -m multiport --source-port 22,53,80 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80 iptables -A INPUT -p tcp -m multiport --port 22,53,80
      
    iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
    iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
    iptables -A INPUT -p tcp -m multiport --port 22,53,80

    行1,匹配多个源端口
    行2,匹配多个目的端口
    行3,匹配多个端口,无论是源还是目的端口
    注: -m multiport 仅适用于 -p tcp 或 -p udp 。

    TCP 匹配扩展
    iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK iptables -p tcp --syn
      
    iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
    iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
    iptables -p tcp --syn

    行1,SYN, ACK, FIN 的标志都要被检查,但是只有设置了 SYN 的才匹配。
    行2,表示 ALL(SYN, ACK, FIN, RST, URG, PSH) 标志都被检查,但只有设置了 SYN 和 ACK 的才匹配。
    行3, --syn 代表 --tcp-flags SYN,RST,ACK SYN

    使用用户自定义链
    iptables -N new_chain iptables -A new_chain -s 0/0 -d 0/0 -p icmp -j DROP iptables -A INPUT -s 0/0 -d 0/0 -j new_chain
      
    iptables -N new_chain
    iptables -A new_chain -s 0/0 -d 0/0 -p icmp -j DROP
    iptables -A INPUT -s 0/0 -d 0/0 -j new_chain

    行1,创建一个用户自定义名叫 new_chain 的链
    行2,在此链中设置了一条规则
    行3,向默认的 INPUT 链添加一条规则,使所有包都由 new_chain 处理。

    删除指定规则
    $ iptables -L INPUT --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited $ iptables -D INPUT 5 $ iptables -L INPUT --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh

      
    $ iptables -L INPUT --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
    2    ACCEPT     icmp --  anywhere             anywhere
    3    ACCEPT     all  --  anywhere             anywhere
    4    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
    5    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
    $ iptables -D INPUT 5
    $ iptables -L INPUT --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
    2    ACCEPT     icmp --  anywhere             anywhere
    3    ACCEPT     all  --  anywhere             anywhere
    4    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh

    行1,列出 INPUT 链的所有规则且显示序号
    行9,删除 INPUT 链序号5的规则
    行10,重新列出 INPUT 链的所有规则确认删除成功

    iptables 实现 nat:
    iptables -t nat -A POSTROUTING -s NETWORK/PREFIX -j SNAT --to-source Internet_IP iptables -t nat -A PREROUTING -d INternet_fa -p tcp --dport 80 -j DNAT --to-destination NEI_IP

      
    iptables -t nat -A POSTROUTING -s NETWORK/PREFIX -j SNAT --to-source Internet_IP
    iptables -t nat -A PREROUTING -d INternet_fa -p tcp --dport 80 -j DNAT --to-destination NEI_IP

    行1,先进行源地址转换
    行2,然后进行目标地址转换
    注:如果地址不是固定的,使用 MASQUERADE 来伪装地址。
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


    限速
    iptables -A FORWARD -m limit --limit 300/hour iptables -A INPUT -m limit --limit-burst 10
      
    iptables -A FORWARD -m limit --limit 300/hour
    iptables -A INPUT -m limit --limit-burst 10

    行1,限制每小时允许通过300个数据包
    行2,限制同一时间涌入的数据包不得超过10个,否则丢弃,默认值为5。
    更详细的限速可以参考这篇文章
    基于状态的匹配扩展(连接跟踪)

    每个网络连接包括以下信息:源和目的地址、源和目的端口号,称为套接字对(cocket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些叫做状态(stateful)。能够监测每个连接状态的防火墙叫做状态包过滤防火墙,除了能完成普通包过滤防火墙的功能外,还在自己的内存中维护一个跟踪连接状态的表,所以拥有更大的安全性。

    语法:iptables -m state --state [!] state [,state,state,state]

    --state 后的取值有
    NEW     该包想要开始一个连接(重新连接或将连接重定向)。
    RELATED     该包属于某个已经建立的连接所建立的新连接。例如 FTP 的数据传输连接和控制连接之间就是 RELATED 关系。
    ESTABLISHED     该包属于某个已经建立的连接。
    INVALID     该包不匹配于任何连接,通常这些包会被DROP。

    iptables -A INPUT -m state --state RELATED,ESTABLISHED iptables -A INPUT -m state --state NEW -i ! eth0 iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
      
    iptables -A INPUT -m state --state RELATED,ESTABLISHED
    iptables -A INPUT -m state --state NEW -i ! eth0
    iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT

    行1,匹配已经建立的连接或由已经建立的连接所建立的新连接,即匹配所有的TCP回应包。
    行2,匹配所有从非 eth0 接口来的连接请求包。
    行3-4,一个被动(Passive)FTP 连接模式的典型连接跟踪
    行4-5,一个主动(Active)FTP 连接模式的典型连接跟踪

    日志记录
    iptables -A FORWARD -m tcp -p tcp -j LOG iptables -A FORWARD -m icmp -p icmp -f -j LOG iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:" iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-level 7 --log-prefix "New net syn:"
      
    iptables -A FORWARD -m tcp -p tcp -j LOG
    iptables -A FORWARD -m icmp -p icmp -f -j LOG
    iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
    iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
    iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-level 7 --log-prefix "New net syn:"

    行1-2,分别开启 TCP 和 ICMP 的日志记录,记录在系统日志中,通过 dmesg 等可以查看。
    行3,开启源端口为80并指定了源 IP 和目标 IP 的 TCP 转发日志记录
    行4,开启日志并自定义日志的前缀
    行5, 指定 log level 为7,参考系统日志 level .

相关帖子:http://briteming.blogspot.co.uk/2012/07/iptables.html
http://briteming.blogspot.co.uk/2012/02/sshiptables.html
-------------------------------------------------


Iptables is a firewall, installed by default on the Ubuntu Server. On regullar ubuntu install, iptables is installed but allows all traffic (thus firewall is ineffective / inactive)
There is a wealth of information available about iptables, but much of it is fairly complex, and if you want to do a few basic things, this How To is for you.
iptables是一款防火墙软件。它在Ubuntu系统中是默认安装的。通常情况下,iptables随系统一起被安装,但没有对通信作任何限制,因此防火墙并没有真正建立起来。
尽管关于iptables的资料非常丰富,但大都比较复杂。如果您只想作些简单的设置,那么本文比较适合您的要求。

目录

[隐藏]

[编辑] Basic Commands 基本命令

进入iptables
# sudo iptables -L
列出目前的ip策略. 如果您刚刚配置好服务器,您是没有设置ip规则的,您要自己设置。
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
使用命令
# sudo iptables -L
查看现有的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

[编辑] Allowing Established Sessions 允许已建立的连接接收数据

We can allow established sessions to receive traffic:
可以使用下面的命令,允许已建立的连接接收数据:
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


lll

[编辑] Allowing Incoming Traffic on Specific Ports 开放指定的端口

You could start by blocking traffic, but you might be working over SSH, where you would need to allow SSH before blocking everything else.
To allow incoming traffic on port 22 (traditionally used by SSH), you could tell iptables to allow all TCP traffic on port 22 of your network adapter.
刚开始时您不妨阻断所有通信,但考虑到您将来可能要使用SSH,那么您要让iptables在使用默认规则丢弃报文之前,允许SSH报文通过。
要开放端口22(SSH的默认端口),您要告诉iptables允许接受到的所有目标端口为22的TCP报文通过。
# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
Specifically, this appends (-A) to the table INPUT the rule that any traffic to the interface (-i) eth0 on the destination port for ssh that iptables should jump (-j), or perform the action, ACCEPT.
执行上面的命令,一条规则会被追加到INPUT规则表的末尾(-A表示追加)。根据这条规则,对所有从接口eth0(-i指出对通过哪个接 口的报文运用此规则)接收到的目标端口为22的报文,iptables要执行ACCEPT行动(-j指明当报文与规则相匹配时应采取的行动)。
Lets check the rules: (only the first few lines shown, you will see more)
我们来看看规则表中的情况:(这里只列出了开始的几行,您应该会看到更多内容)
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
Now, let's allow all web traffic
现在我们开放端口80:
# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
Checking our rules, we have
此时的规则表中的内容如下:
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
We have specifically allowed tcp traffic to the ssh and web ports, but as we have not blocked anything, all traffic can still come in.
通过上述命令,我们已经代开了SSH和web服务的相应的端口,但由于没有阻断任何通信,因此所有的报文都能通过。

[编辑] Blocking Traffic 阻断通信

Once a decision is made about a packet, no more rules affect it. As our rules allowing ssh and web traffic come first, as long as our rule to block all traffic comes after them, we can still accept the traffic we want. All we need to do is put the rule to block all traffic at the end. The -A command tells iptables to append the rule at the end, so we'll use that again.
对每一个报文,iptables依次测试每一条规则,看报文与规则是否相匹配。一旦找到一条匹配的规则,就根据此规则中指定的行动,对报文 进行处置,而对后面的规则不再进行测试。因此,如果我们在规则表的末尾添加一条规则,让iptables丢弃所有报文,但由于有了前面几条规则,ssh和 web的正常通信不会受到影响。
# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere
Because we didn't specify an interface or a protocol, any traffic for any port on any interface is blocked, except for web and ssh.
在上面的规则中,没有明确指出针对哪个接口或哪种协议使用此规则,所以从每个接口接收到的除ssh和web之外的所有报文都会被丢弃。

[编辑] Editing iptables 编辑iptables

The only problem with our setup so far is that even the loopback port is blocked. We could have written the drop rule for just eth0 by specifying -i eth0, but we could also add a rule for the loopback. If we append this rule, it will come too late - after all the traffic has been dropped. We need to insert this rule onto the fourth line.
进行至此,仍有一个问题,就是环回接口也被阻断了。刚才添加DROP规则的时候其实就可以使用-i eth0来解决这一问题。然而我们也可以为环回接口添加一条新规则来解决这个问题。但是不能将新规则追加到末尾,因为前一条规则已经把所有报文都丢弃了, 而应该把它插到DROP规则前面,即规则表中第四行的位置。
# iptables -I INPUT 4 -i lo -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
The last two lines look nearly the same, so we will list iptables in greater detail.
规则表中的最后两行几乎一样,为了看看它们到底有什么不同,我们可以使用
# iptables -L -v

[编辑] Logging 记录

In the above examples none of the traffic will be logged. If you would like to log dropped packets to syslog, this would be the quickest way:
在前面的例子中,没有任何报文会被记录到日志中。如果您希望将被丢弃的报文记录到syslog中,最简单的方法是:
# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
See Tips section for more ideas on logging.
更多关于日志记录的信息,请参照Tips(技巧)这一节。

[编辑] Saving iptables 保存设置

If you were to reboot your machine right now, your iptables configuration would disapear. Rather than type this each time you reboot, however, you can save the configuration, and have it start up automatically. To save the configuration, you can use iptables-save and iptables-restore.
机器重启后,iptables中的配置信息会被清空。您可以将这些配置保存下来,让iptables在启动时自动加载,省得每次都得重新输入。iptables-saveiptables-restore 是用来保存和恢复设置的。

[编辑] Configuration on startup 开机自动加载配置

Save your firewall rules to a file
先将防火墙规则保存到/etc/iptables.up.rules文件中
# iptables-save > /etc/iptables.up.rules
Then modify the /etc/network/interfaces script to apply the rules automatically (the bottom line is added)
然后修改脚本/etc/network/interfaces,使系统能自动应用这些规则(最后一行是我们手工添加的)。
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
You can also prepare a set of down rules and apply it automatically
当网络接口关闭后,您可以让iptables使用一套不同的规则集。
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-restore < /etc/iptables.down.rules

[编辑] Tips 技巧


[编辑] If you manually edit iptables on a regular basis 如果你经常手动编辑iptables

The above steps go over how to setup your firewall rules and presume they will be relatively static (and for most people they should be). But if you do a lot of development work, you may want to have your iptables saved everytime you reboot. You could add a line like this one in /etc/network/interfaces:
大多数人并不需要经常改变他们的防火墙规则,因此只要根据前面的介绍,建立起防火墙规则就可以了。但是如果您要经常修改防火墙规则,以使其 更加完善,那么您可能希望系统在每次重启前将防火墙的设置保存下来。为此您可以在/etc/network/interfaces文件中添加一行:
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules
The line "post-down iptables-save > /etc/iptables.up.rules" will save the rules to be used on the next boot.
"post-down iptables-save > /etc/iptables.up.rules"会将设置保存下来,以便下次启动时使用。

[编辑] Using iptables-save/restore to test rules 使用iptables-save/restore测试规则

If you edit your iptables beyond this tutorial, you may want to use the iptables-save and iptables-restore feature to edit and test your rules. To do this open the rules file in your favorite text editor (in this example gedit).
使用iptables-save和iptables-restore可以很方便地修改和测试防火墙规则。首先运行iptables-save将规则保存到一个文件,然后用编辑器编辑该文件。
# iptables-save > /etc/iptables.test.rules
# gedit /etc/iptables.test.rules
You will have a file that appears similiar to (following the example above):
如果您根据前面的例子建立了防火墙规则,iptables-save将产生一个类似于如下内容的文件:
# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006
*filter
:INPUT ACCEPT [368:102354]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92952:20764374]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
COMMIT
# Completed on Sun Apr 23 06:19:53 2006
Notice that these are iptables commands minus the iptable command. Feel free to edit this to file and save when complete. Then to test simply:
文件内容其实就是各种iptables命令,只不过把命令名iptables省略了。您可以随意对这个文件进行编辑,然后保存。接着使用以下命令测试修改后的规则:
# iptables-restore < /etc/iptables.test.rules
After testing, if you have not added the iptables-save command above to your /etc/network/interfaces remember not to lose your changes:
之前您如果没有在/etc/network/interfaces文件中添加iptables-save命令,那么测试之后,别忘了把您所作的修改保存起来。
# iptables-save > /etc/iptables.up.rules

[编辑] More detailed Logging 关于日志记录的更多细节

For further detail in your syslog you may want create an additional Chain. This will be a very brief example of my /etc/iptables.up.rules showing how I setup my iptables to log to syslog:
您可以创建额外的规则链,以便在syslog中作更加详细的记录。以下是我/etc/iptables.up.rules文件中的一个简单例子:
# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006
*filter
:INPUT ACCEPT [273:55355]
:FORWARD ACCEPT [0:0]
:LOGNDROP - [0:0]
:OUTPUT ACCEPT [92376:20668252]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j LOGNDROP
-A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7
-A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7
-A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7
-A LOGNDROP -j DROP
COMMIT
# Completed on Sun Apr 23 05:32:09 2006
Note a new CHAIN called LOGNDROP at the top of the file. Also, the standard DROP at the bottom of the INPUT chain is replaceed with LOGNDROP and add protocol descriptions so it makes sense looking at the log. Lastly we drop the traffic at the end of the LOGNDROP chain. The following gives some idea of what is happening:
  • --limit sets the number of times to log the same rule to syslog
  • --log-prefix "Denied..." adds a prefix to make finding in the syslog easier
  • --log-level 7 sets the syslog level to informational (see man syslog for more detail, but you can probably leave this)
可以看到,文件前面多了一条名为LOGNDROP的规则链。此外,INPUT链最后一条规则中的DROPLONGDROP替代。并且在后面我添加了一些内容来描述报文所使用的协议,这可以让记录更容易理解。最后,在LOGNDROP链的末尾,报文被丢弃。
  • --limit 对由此规则引发的记录事件的频率进行限制。
  • --log-prefix "Denied..." 在每条记录前加上一个前缀,以便查找。
  • --log-level 7 将记录的详细程度设为“informational”等级(详情请见man syslog,您也可以直接使用此处的设置)。

[编辑] Disabling the firewall 禁用防火墙

If you need to disable the firewall temporarily, you can flush all the rules using
可以通过清除所有规则来暂时停止防火墙: (警告:这只适合在没有配置防火墙的环境中,如果已经配置过默认规则为deny的环境,此步骤将使系统的所有网络访问中断)
# sudo iptables -F

[编辑] Easy configuration via GUI 通过GUI快速配置

A newbie can use Firestarter (a gui), available in repositories (Synaptic or apt-get) to configure her/his iptable rules, without needing the command line knowledge. Please see the tutorial though... Configuration is easy, but may not be enough for the advanced user. However, it should be enough for the most home users... The (read:my) suggested outbound configuration is "restrictive", with whitelisting each connection type whenever you need it (port 80 for http, 443 for secure http -https-, 1863 for msn chat etc) from the "policy" tab within firestarter. You can also use it to see active connections from and to your computer... The firewall stays up once it is configured using the wizard. Dialup users will have to specify it to start automatically on dial up in the wizard.
Firestarter是一款图形界面的防火墙工具,您可以从软件库中得到它。(用“新立得”或者apt-get安装)使用 Firestarter并不需要掌握命令行方式下的配置方法。想了解它的用法,请阅读相应的教程…… Firestarter使用简单,虽然可能无法实现某些较为复杂的功能,但仍可满足大多数家庭使用的要求。对于从您的主机发送到网络的报 文,firestarter推荐使用“restrictive”配置方案。这种方案要求您在清单中指明哪些报文是可以通过的,除此之外的所有报文都将被丢 弃。您可以在firestarter的“policy”选项卡中改变配置方案。您也可以使用firestarer查看当前有哪些活动连接…… 当配置向导运行结束后,防火墙就建立起来了。拨号用户必须在配置向导中进行设定,以使防火墙在拨号后自动建立起来。
Homepage for firestarter: http://www.fs-security.com/ (again, available in repositories, no compiling required)
Tutorial: http://www.fs-security.com/docs/tutorial.php
Personal note: Unfortunately, it does not have the option to block (or ask the user about) connections of specific applications/programs... Thus, my understanding is that once you enable port 80 (i.e. for web access), any program that uses port 80 can connect to any server and do anything it pleases...
Firestarter主页:http://www.fs-security.com/ (再次声明,firestarter已经收入软件库,不需要您自己编译)
firestarer教程: http://www.fs-security.com/docs/tutorial.php
注意事项:这款软件不会阻止(或者询问用户是否阻止)特定的程序访问网络。因此,根据我的使用经验,一旦您开启端口80(web服务),任何程序都可以使用此端口进行通信。

[编辑] Further Information 更多技术细节

 from https://help.ubuntu.com/community/IptablesHowTo
-----------------------------------------------------


1、开放指定端口
#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT  (注意:如果22端口未加入允许规则,SSH链接会直接断开。)
iptables -A FORWARD -j REJECT
2、屏蔽指定IP(可选)
如果有些已知IP是经常爆你的服务器的话,可以用规则将其屏蔽。
#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
3、保存规则&开机启动
service iptables save
chkconfig --level 345 iptables on
4、后续:查看与删除已经添加的规则
iptables -L -n
将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
-----------------------------------------------------
iptables只开放指定端口、iptables屏蔽指定ip、ip段及解封、删除已添加的iptables规则等iptables的基本应用。
1、安装iptables防火墙:
CentOS执行:
  • yum install iptables
Debian/Ubuntu执行:
  • apt-get install iptables

2、清除已有iptables规则:


  • iptables -F
  • iptables -X
  • iptables -Z

 3、开放指定的端口:#允许本地回环接口(即运行本机访问本机)

  • iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
  • iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
  • iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
  • iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
  • iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
  • iptables -A INPUT -p tcp --dport 21 -j ACCEPT
  • iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
  • iptables -A INPUT -j REJECT  (注意:如果22端口未加入允许规则,SSH链接会直接断开。)
  • iptables -A FORWARD -j REJECT

4、屏蔽IP:

  • #如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
  • iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
  • iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
  • iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
  • iptables -I INPUT -s 123.45.6.0/24 -j DROP

5、查看已添加的iptables规则:

  • iptables -L -n
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M)
n:只显示IP地址和端口号,不将ip解析为域名

6、删除已添加的iptables规则:

将所有iptables以序号标记显示,执行:
  • iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
  • iptables -D INPUT 8

7、iptables的开机启动及规则保存:

CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:
  • chkconfig --level 345 iptables on
将其加入开机启动。
CentOS上可以执行:service iptables save保存规则。
另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。
需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则:
创建/etc/network/if-post-down.d/iptables 文件,添加如下内容:
  • #!/bin/bash
  • iptables-save > /etc/iptables.rules
执行:chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。
创建/etc/network/if-pre-up.d/iptables 文件,添加如下内容:
  • #!/bin/bash
  • iptables-restore < /etc/iptables.rules
执行:chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限
 -------------------------------------------------------------

IPTables

1. 引言

CentOS 内置了一个非常强劲的防火墙,统称为 iptables,但更正确的名称是 iptables/netfilter。iptables 是一个用户空间的模块。作为用户,你在命令行就是通过它将防火墙规则放进缺省的表里。netfilter 是一个核心模块,它内置于内核中,进行实际的过滤。iptables 有很多前端图像界面可以让用户新增或定义规则,但它们很多时不及使用命令行般有灵活性,而且限制用户了解实际发生的事情。我们将会学习 iptables 的命令行界面。
在我们正式应付 iptables 前,我们必须对它的运作有一个基本的理解。iptables 利用到 IP 地址、协议(tcp、udp、icmp)及端口这些概念。我们不需要成为这些方面的专家(因为我们可以找到所需的信息),但对它们有一般的理解会有帮助。
iptables 将规则放进缺省的规则链(INPUT、OUTPUT 及 FORWARD),而所有流量(IP 封包)都会被相关的规则链检查,根据当中的规则判断如何处理每个封包,例如:接纳或丢弃它。这些动作称为目标,而最常见的两个缺省目标就是 DROP 来丢弃封包;或 ACCEPT 来接纳封包。
规则链
我们可以在过滤表的 3 条缺省规则链内加入规则,来处理通过这些规则链的封包。它们分别是:
  • INPUT – 所有以主机为目的地的封包。
  • OUTPUT – 所有源自主机的封包。
  • FORWARD – 这些封包的目的地或来源地都不是主机,但路经主机(由它选路)。假若你的主机是一个路由器,这条规则链将会被应用。
我们将会花费最多时间处理 INPUT 规则链,藉以过滤进入我们的机器的封包 —— 亦即是将坏蛋拒诸门外。
规 则是以列表的方式被加进每条规则链。每个封包会被头一条规则开始检查,才至最后一条。假若封包与其中一条规则吻合,相应的动作便会被执行,例如接纳 (ACCEPT)或丢弃(DROP)封包。一旦有吻合的规则,这个封包便会按照规则来处理,而不再被规则链内的其它规则所检查。假如封包通过所有检查而不 符合任何规则链内的任何一条规则,那应这条规则链的缺省动作将会被执行。这就是所谓的缺省政策,可以设置为接纳(ACCEPT)或丢弃(DROP)封包。
规则链拥有缺省政策这个概念带来两个基本的可能性,而我们必须考虑它们才能决定如何组织我们的防火墙。
1. 我们可以缺省一个政策来丢弃(DROP)所有封包,然后刻意加入规则来接纳(ACCEPT)源自被信任的 IP 地址的封包,或者打开那些提供服务的端口,如:bittorrent、FTP 服务器、网页服务器、Samba 文件服务器等。
又或者,
2. 我们可以缺省一个政策来接纳(ACCEPT)所有封包,然后刻意加入规则来拦截(DROP)来自有问题的 IP 地址或系列的封包,也或者阻止封包进出只作私人用途或未提供服务的端口。
普遍来说,第一个方法多数用在 INPUT 规则链,因为我们会希望控制哪些东西可以访问我们的机器;而第二个方法多数用在 OUTPUT 规则链,因为我们多数信赖那些离开(源自)我们机器的封包。

2. 准备开始

在命令行上使用 iptables 需要 root 的权限,因此你必须化身为 root 用户来做下面的事情。
注意: 我们将会停用 iptables 及复位你的防火墙规则,因此假若你依赖你的 Linux 防火墙作为第一道防线,请特别留意这点。
iptables 应该缺省被安装在所有 CentOS 5.x 及 6.x 上。你可以这样来检查 iptables 是否已安装在你的系统上:

$ rpm -q iptables iptables-1.4.7-5.1.el6_2.x86_64 要知道 iptables 是否正在运作中,我们可以检查 iptables 这个模块是否已被装入,并利用 -L 这个选项来查看活动的规则:

# lsmod | grep ip_tables ip_tables 29288 1 iptable_filter x_tables 29192 6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination 从上面我们可看见一台 CentOS 6 系统的缺省规则。请留意访问 SSH 服务缺省是获允许的。
如果 iptables 并未被执行,你可以这样启用它:

# system-config-securitylevel

3. 创建一组简单的规则

注意: 此刻我们将会清除缺省的规则集。如果你是通过 SSH 远程连接到一台服务器来进行学习,你有可能会将自己拒诸这台机器之外。你必须将缺省的输入(input)政策改为接纳(accept),然后才清除现有规则,接著你要预先加入一条容许你自己访问机器的规则,避免你将自己封锁在外。
我们会采用一个以样例为本的方法来查看 iptables 的不同指令。在首个样例中,我们会创建一组简单的规则来设置一个「状态封包检验」(SPI)防火墙,容许对外的连接但拦截一切无用的对内连接:

# iptables -P INPUT ACCEPT # iptables -F # iptables -A INPUT -i lo -j ACCEPT # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -p tcp --dport 22 -j ACCEPT # iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT # iptables -L -v 你应该得到这样的输出:

Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 现在让我们逐一看看以上的 8 个指令,并理解我们实际做了什么:
  1. iptables -P INPUT ACCEPT 假如利用远程连接,我们必须临时将 INPUT 链的缺省政策改为 ACCEPT,否则当我们清除现有的规则集时,便会将自己封锁在服务器之外。
  2. iptables -F 我们利用 -F 选项来清除一切现存的规则,好让我们能够在崭新的状态下加入的规则。
  3. iptables -A INPUT -i lo -j ACCEPT 现在是时候加入一些规则了。我们利用 -A 选项来附加(新增)规则到某条链,而这里所指的是 INPUT 链。接著我们利用 -i 选项(interface「界面」之意)来指定那些符合或来自 lo(localhost、127.0.0.1)界面的封包。最后我们 -j(jump「跳至」)符合这条规则的目标动作:在这里是 ACCEPT。所以这条规则会导致所有转至 localhost 界面的对内封包获得接纳。一般来说这是必须的,因为很多软件预期能够与 localhost 适配器沟通。
  4. iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT 这是担负起大部份工作的规则,而我们再一次将它加进(-A)INPUT 链内。这里我们利用 -m 选项来装入一个模块(state)。state 模块能够查看一个封包并判断它的状态是 NEW、ESTABLISHED 抑或 RELATED。NEW 指进入的封包属于不是由主机初始化的新增连接。ESTABLISHED 及 RELATED 指进入的封包隶属于一条现存的连接,或者与现存的连接有关系。
  5. iptables -A INPUT -p tcp –dport 22 -j ACCEPT 现在我们加入一条规则来容许 SSH 通过 tcp 端口 22 来连接。这样做是要防止我们连接到远程系统的 SSH 连接意外地被封销。我们稍后会更详细解释这条规则。
  6. iptables -P INPUT DROP 这个 -P 选项设置某条规则链上的缺省政策。我们现在可以将 INPUT 链的缺省政策改为 DROP。意思就是,不符合任何一条规则的对内封包将会被丢弃。要是我们通过 SSH 远程连接而没有加入上一条规则,此刻我们便会被封锁于系统之外。
  7. iptables -P FORWARD DROP 同样地,在这里我们将 FORWARD 链的缺省政策设为 DROP,因为我们并不是用计算机作为路由器,所以理应没有任何封包路经它。
  8. iptables -P OUTPUT ACCEPT 而最后,我们将 OUTPUT 链的缺省政策设为 ACCEPT,因为我们想容许所有对外的流量(由于我们信任我们的用户)。
  9. iptables -L -v 最后,我们可以列出(-L)刚加入的规则,并检查它们是否被正确地装入。
我们需要做的最后一件事情,就是存储我们的规则,好让它们在下次开机时会自动被重新装入:

# /sbin/service iptables save 这 样做会执行 iptables 的 init 脚本,它会执行 /sbin/iptables-save 并将现有的 iptables 设置写进 /etc/sysconfig/iptables。开机时,iptables 的 init 脚本会通过 /sbin/iptables-restore 这个指令重新实施存储在 /etc/sysconfig/iptables 内的规则。
很明显的,在指令壳内输入这堆指令会颇乏味,因此运用 iptables 的最简易方法就是创建一个代你做以上一切的脚本。你可以将上面的指令输入到你喜欢的文字编辑器内并存储为 myfirewall,例如:

#!/bin/bash # # iptables 样例设置脚本 # # 清除 iptables 内一切现存的规则 # iptables -F # # 容让 SSH 连接到 tcp 端口 22 # 当通过 SSH 远程连接到服务器,你必须这样做才能群免被封锁于系统外 # iptables -A INPUT -p tcp --dport 22 -j ACCEPT # # 设置 INPUT、FORWARD、及 OUTPUT 链的缺省政策 # iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # # 设置 localhost 的访问权 # iptables -A INPUT -i lo -j ACCEPT # # 接纳属于现存及相关连接的封包 # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # # 存储设置 # /sbin/service iptables save # # 列出规则 # iptables -L -v 注: 我们可以在脚本内加入注释来提醒自己正在做什么。
现在令脚本可以被执行:

# chmod +x myfirewall 我们现在可以编辑这个脚本,并在指令壳内用以下指令来执行它:

# ./myfirewall

4. 界面

在上一个范本中,我们看见如何能接纳所有来自某个界面的封包,也就是 localhost 界面:

iptables -A INPUT -i lo -j ACCEPT 假设我们现在有两个独立的网络界面,分别是将我们连接到内部网络的 eth0 及连接到外部互联网的 ppp0 拨号调制解调器(或者 eth1 适配器)。我们或许会想接纳所有来自内部网络的对内封包,但依然过滤那些来自互联网的封包。我们可以这样做:

iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i eth0 -j ACCEPT 让特别留意 —— 假如你接纳来自互联网界面(例如 ppp0 拨号调制解调器)的所有封包:

iptables -A INPUT -i ppp0 -j ACCEPT 你便等同于停用了我们的防火墙!

5. IP 地址

将整个界面开放给对内的封包也许不够严谨,而你想拥有更多控制权来决定接纳什么及拒绝什么。现在假设我们拥有一群采用 192.168.0.x 私人网络的计算机。我们可以打开防火墙给来自某个被信任 IP 地址(例如 192.168.0.4)的对内封包:

# 接纳来自被信任 IP 地址的封包 iptables -A INPUT -s 192.168.0.4 -j ACCEPT # change the IP address as appropriate 将这个指令分解,我们首先附加(-A)一条规则到 INPUT 链,指明来源(-s)IP 地址是 192.168.0.4 的封包都应该被接纳(ACCEPT)(请亦留意我们如何利用 # 符号来解释我们的脚本,因为 # 之后的所有文字都会被视为注释)。
当 然,如果我们想接纳来自一系列 IP 地址的封包,我们可以为每个被位任的 IP 地址加入一条规则,而这样做的确是可行的。但是假如它们的数量很多,一次过加入一系列 IP 地址会比较简单。要这样做,我们可以利用一个子网掩码或标准的斜线记法来指定 IP 地址的范围。举个例说,如果我们想将防火墙开放给来自整个 192.168.0.x(当中 x=1 到 254)范围的封包,我们可以用下面其中一个方法来达致目的:

# 接纳来自被信任 IP 地址的封包 iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # using standard slash notation iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # using a subnet mask 最 后,除了过滤单一的 IP 地址外,我们亦可以配对该设备的 MAC 地址。要这应做,我们需要装入一个容许过滤 MAC 地址的模块(mac 模块)。较早前当我们用 state 模块来配对 ESTABLISHED 及 RELATED 封包时,我们看见模块扩展 iptables 功能的例子。在这里我们除了检查封包的 IP 地址外,更利用 mac 模块来检查来源地的 MAC 地址:

# 接纳来自被信任 IP 地址的封包 iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT 首先我们用 -m mac 来装入 mac 模块,然后我们用 --mac-source 来指定来源 IP 地址(192.168.0.4)的 MAC 地址。你要为每个需要过滤的以太网设备找出 mac 地址。以 root 的身份执行 ifconfig(无线设备用 iwconfig)可以将 mac 地址告诉你。
这 样可防止来源地的 IP 地址被伪装,因为只有真正源于 192.168.0.4(MAC 地址是 00:50:8D:5D:E6:32)的封包才会被接纳,而所有假扮源于该地址的封包都会被拦截。请注意,过滤 MAC 地址在互联网上不能使用,却绝对能正确地在本地网络里运作。

6. 端口及协议

由上面我们看见如何将新增规则在防火墙内,用来过滤符合某个界面或来源 IP 地址的封包。 这样做让我们能经过防火墙访问某些被信任的来源(主机)。现在我们看看如何过滤协议及端口,好叫我们能进一步区别要接纳及拦截那些对内的封包。
在 我们开始之先,我们须要知道个别服务所使用的协议及端口编号。让我们以 bittorrent 作为一个简单的样例。bittorrent 在 6881 端口上采用 tcp 协议,因此我们需要容许所有以 6881 为目标端口(它们到逹时所用的端口)的 tcp 封包。

# 接纳目标端口是 6881 号(bittorrent)的 tcp 封包 iptables -A INPUT -p tcp --dport 6881 -j ACCEPT 在这里我们附加(-A)一条规则到 INPUT 链,配对 tcp 协议(-p tcp)及从 6881 目标端口进入我们的机器(--dport 6881)。
注: 要配对目标或来源端口(--dport--sport),你必须先指定协议(tcp、udp、icmp、all)。
我们亦可以扩展以上的样例来包含一系列的端口,例如,接纳 6881 至 6890 端口上的所有 tcp 封包:

# 接纳目标端口是 6881-6890 号的 tcp 封包 iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT

7. 融会贯通

既然我们已经有基本认识,现在便可以合并这些规则。
UNIX/Linux 上一个受欢迎的服务就是容许远程登录的 SSH 服务。SSH 缺省使用 22 号端口及采用 tcp 协议。因此假若我们想允许远程登录,我们需要容许 tcp 连接到 22 号端口:

# 接纳目标端口是 22 号(SSH)的 tcp 封包 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 这 样做会开放 22 号端口(SSH)给所有对内的 tcp 连接,却会构成潜在的安全性威胁,因为骇客可以强行破入使用易猜测口令的户口。然而,假若我们知道那些通过 SSH 作远程登录的可信任机器的 IP 地址,我们便可以将访问权限制到那些来源 IP 地址。举个例说,如果我们只想将 SSH 的访问权开放给我们的私人网络(192.168.0.x),我们可以将来源 IP 地址限制在这个范围:

# 接纳来自私人网络,目标端口是 22 号(SSH)的 tcp 封包 iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT 利 用来源 IP 进行过滤容让我们能安全地开放 22 号端口上的 SSH 给可信任的 IP 地址来访问。举个例说,我们可以用这个方法允许工作与家用机器之间的登录。对于其它 IP 地址来说,这个端口(与及服务)就好像了关闭了一样,而服务亦依被停用,因此扫描端口的骇客多数会略过我们。

8. 总结

这里只是很初步地介绍 iptables 可以做的事情,但我希望这份教学文档提供了一个良好的基础,帮助各位创建更复杂的规则集.
--------------------------------------------
 iptables 的配置及关闭

用命令:
#/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT
#/sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT
#/etc/rc.d/init.d/iptables save

这样重启计算机后,防火墙默认已经开放了80和22端口
这里应该也可以不重启计算机:
#/etc/init.d/iptables restart
防火墙的关闭,关闭其服务即可:
查看防火墙信息:
#/etc/init.d/iptables status
关闭防火墙服务:
#/etc/init.d/iptables stop
永久关闭?不知道怎么个永久法:
#chkconfig –level 35 iptables off

看了好几个页面内容都有错,下面是正确方法:
#/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT
#/sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT 然后保存:
#/etc/rc.d/init.d/iptables save
再查看是否已经有了:
[root@vcentos ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:80
2 ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
服务器遭受到大量的大量SYN_RECV,80端号占死,网站打不开
没有硬防
有什么办法可以解决吗
1
sysctl -w net.ipv4.tcp_syncookies=1 #启用使用syncookies
sysctl -w net.ipv4.tcp_synack_retries=1 #降低syn重试次数
sysctl -w net.ipv4.tcp_syn_retries=1 #降低syn重试次数
sysctl -w net.ipv4.tcp_max_syn_backlog=6000 #最大半连接数
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.all.accept_redirects=0 #不接受重定向的icmp數據包
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_keepalive_time=60
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #禁止ICMP
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 #ICMP禁止广播 2.限制单位时间内连接数

iptables -N syn-flood
iptables -A FORWARD -p tcp –syn -j syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -A syn-flood -p tcp –syn -m limit –limit 3/s –limit-burst 1 -j ACCEP
iptables -A syn-flood -j DROP
iptables -A INPUT -i eth0 -p tcp ! –syn -m state –state NEW -j DROP
iptables -A INPUT -p tcp –syn -m state –state NEW -j DROP
3 如果还是不行,
iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –update –seconds 60 –hitcount 30 -j REJECT
iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –set -j ACCEP
如攻击过来的流量大于你的服务器的流量,那就没有什么办法了,如果流量不大,以上方法,可以暂时保证你的80可以访问
如果你的内核已经支持iptables   connlimit可以使用, iptables 设定部份,也可以使用 iptables -I FORWARD -p tcp –syn -m connlimit –connlimit-above 5 -j DROP

iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 5 -j REJECT
对付SYN FLOOD的话,真正起作用的是:
sysctl -w net.ipv4.tcp_syncookies=1        #启用使用syncookies
sysctl -w net.ipv4.tcp_synack_retries=1        #降低syn重试次数
其他IPTABLES的限制速度功能不能用来对付SYN FLOOD的(不能阻止拒绝服务,但是确实可以防止服务器CRASH)