MAN | HOME
返回列表 发帖

一些iptables实例

一些iptables实例

将80端口的服务全部转发到3128端口。用于实现透明代理
  iptables -t nat -A PREROUTING -p tcp --dport 80 \
   -j REDIRECT --to-ports 3128

  //REJECT, 类似于DROP,但向发送该包的主机回复由--reject-with指定的信息,
  // 从而可以很好地隐藏防火墙的存在
  iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

  a.内部IP访问internet
  //SNAT--这个target是用来做源网络地址转换的,就是重写包的源IP地址。当我们有几
  //个机子共享一个Internet 连接时,就能用到它了。先在内核里打开ip转发功能,
  //然后再写一个SNAT规则,就可以把所有从本地网络出去的包的源地址改为Internet连
  //接的地址了。
  iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT \
    --to-source 194.236.50.155-194.236.50.160:1024-32000

  b.外部主机访问内网主机
  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
一个mail是:answer3ai@gmail.com的家伙

From: http://blog.chinaunix.net/u/17709/showart_206941.html

外网:eth0 123.45.67.89

内网:eth1 10.0.0.1 LAN上的计算机IP地址都在10.0.0.2~~10.0.0.254之间。

(1)一个rc.local的例子,在rc.local中加入如下命令


echo 1 > /proc/sys/net/ipv4/ip_forward #启动IP转发
echo 1 > /proc/sys/net/ipv4/ip_dynaddr #启动动态IP地址
#Policies(Default)设置默认策略为拒绝
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#User-defined chain for ACCEPTed TCP packets用户自定义链,链名为“okay”

iptables -N okay

iptables -A okay –p TCP - - syn –j ACCEPT

iptables -A okay –p TCP -m state - -state ESTABLISHED,RELATED –j ACCEPT

iptables -A okay –p TCP –j DROP

#INPUT chain rules

# Rules for incoming packets from LAN

iptables -A INPUT -p ALL -i eth1 -s 10.0.0.0/8 -j ACCEPT #LAN中的地址可接受

iptables -A INPUT -p ALL -i lo -s 127.0.0.1 -j ACCEPT #允许接受本身的数据包

iptables -A INPUT -p ALL -i lo -s 10.0.0.1 -j ACCEPT #允许接受本身的数据包

iptables -A INPUT -p ALL -i lo -s 123.45.67.89 -j ACCEPT #允许接受本身的数据包

iptables -A INPUT -p ALL -i eth1 –d 10.0.0.255 -j ACCEPT #允许接受LAN内的广播包

# Rules for incoming packets from the Internet

# packets for established connections

iptables -A INPUT -p ALL -d 123.45.67.89 -m state –state ESTABLISHED,RELATED –j ACCEPT

# TCP rules 由okay链处理

iptables -A INPUT -p TCP -i eth0 -s 0/0 --destination-port 21 –j okay

iptables -A INPUT -p TCP -i eth0 -s 0/0 --destination-port 22 –j okay

iptables -A INPUT -p TCP -i eth0 -s 0/0 --destination-port 80 –j okay

iptables -A INPUT -p TCP -i eth0 -s 0/0 --destination-port 113 –j okay

# UDP rules 定义开放的UDP端口

iptables -A INPUT -p UDP -i eth0 -s 0/0 --destination-port 53 –j ACCEPT

iptables -A INPUT -p UDP -i eth0 -s 0/0 --destination-port 2074 –j ACCEPT

iptables -A INPUT -p UDP -i eth0 -s 0/0 --destination-port 4000 –j ACCEPT

# ICMP rules

iptables -A INPUT -p ICMP -i eth0 -s 0/0 --destination-port 8 –j ACCEPT

iptables -A INPUT -p ICMP -i eth0 -s 0/0 --destination-port 11 –j ACCEPT

# FORWARD chain rules

#Accept the packets we want to forward

iptables -A FORWARD -i eth1 -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# OUTPUT chain rules

# Only output packets with local addresses (no spoofing)

iptables -A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT

iptables -A OUTPUT -p ALL -s 10.0.0.1 -j ACCEPT

iptables -A OUTPUT -p ALL -s 123.45.67.89 -j ACCEPT

# POSTROUTING chain rules 网关的IP伪装

iptables -t nat –A POSTROUTING –o eth0 –j SNAT –to-source 123.45.67.89


(2)网关的IP伪装:静态地址 使用SNAT,动态地址(拨号) 使用MASQUERADE

例子:

MASQUERADE必须提供接口名(eth0,ppp0等)来指明路径,好像静态地址也可以使用MASQUERADE:

iptables -t nat -A POSTROUTING –o eth0 –j MASQUERADE

SNAT也必须指明实际的IP如下所示:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 12.12.12.12

(3)端口转发

例子:将对防火墙计算机(-d 15.15.15.15)的所有Web服务重定向到LAN上的某台计算机(10.0.0.25)

iptables -t nat -A PREROUTING -p tcp -d 15.15.15.15 –dprot 80 –j DNAT –to-destination 10.0.0.25
一个mail是:answer3ai@gmail.com的家伙

TOP

增加规则

本例中的规则将会阻止来自某一特定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)端口也应被禁止
一个mail是:answer3ai@gmail.com的家伙

TOP

返回列表