Chinaunix首页 | 论坛 | 博客
  • 博客访问: 351218
  • 博文数量: 51
  • 博客积分: 916
  • 博客等级: 准尉
  • 技术积分: 539
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 15:37
文章分类

全部博文(51)

文章存档

2014年(1)

2012年(49)

2011年(1)

我的朋友

分类: LINUX

2012-07-20 17:18:28


  1. set -o nounset # Treat unset variables as an error
  2. PRIVATE_IP=192.168.5.8 #ppp0 address
  3. PUBLIC_IP=192.168.0.204 #eth2 address

  4. #iptables -t nat -A POSTROUTING -s $PRIVATE_IP -j SNAT --to-source $PUBLIC_IP #snat

  5. iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE #masquerade

  6. # iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 40022 -j DNAT --to-destination 192.168.1.2:22 #dnat
  7. # iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth2 -p tcp --dport 80 #port map

  8. # iptables -t nat -D POSTROUTING 1

# This is the last ruler , it can make you firewall better
iptables -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable​


######

  1. set -o nounset                              # Treat unset variables as an error

  2. PRIVATE_IP=192.168.5.8 #ppp0 address

  3. PUBLIC_IP=192.168.0.204 #eth2 address


  4. #iptables -t nat -A POSTROUTING -s $PRIVATE_IP -j SNAT --to-source $PUBLIC_IP #snat


  5. iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE #masquerade


  6. # iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 40022 -j DNAT --to-destination 192.168.1.2:22 #dnat

  7. # iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth2 -p tcp --dport 80 #port map


  8. # iptables -t nat -D POSTROUTING 1


####### open port#####

iptables –P INPUT –j DROP

iptables –A INPUT –p tcp –dport 80 –j ACCEPT


####new table test

  1. iptables –N test (新建一个test表)  

  2.  

  3. iptables –A test DROP  

  4.  

  5. iptables –A test –p tcp –dport 80 –j ACCEPT(允许80端口被访问)  

  6.  

  7. iptables –A INPUT –j test  

  8.  

  9. iptables –A OUTPUT –j test  

  10.  

  11. iptables –A FORWARD –j test  

############port map 把服务器的25端口映射到192.168.0.6这台计算机上

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 25 -j DNAT --to-destination   92.168.0.6:21  

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.6 -p tcp -m tcp --dport 25-j SNAT --to-source 192.168.0.1 

######

iptables -A INPUT -p icmp --icmp-type echo-request -i ppp0 -j DROP

 iptables -A test -p icmp --icmp-type echo-request -i ppp0 -j  DROP

############

/sbin/iptables-save > iptables – save

################

四种NATiptables实现:

1. Full Cone NAT: 所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当 X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限 制,因此这种方式虽然足够简单,但却不那么安全。

2. Restricted Cone NAT: 它 是Full Cone的受限版本:所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不 同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部主机发送UDP请求 报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安全性。

3. Port Restricted Cone NAT: 它是Restricted Cone NAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才 能以Y中的信息作为目标地址和目标端口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制, 从而较Restrictd Cone更具安全性。

4. Symmetric NAT:这是一种比所有 Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的 UDP报文中的目标地址及端口的,即与目标Tuple无关;在Symmetric NAT中,目标Tuple则成为了NAT设备建立转换关系的一个重要考 量:只有来自于同一个内部Tuple 、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple,否则的话,NAT将为之分配一个新的外部 Tuple;打个比方,当内部主机以相同的内部Tuple对2个不同的目标Tuple发送UDP报文时,此时NAT将会为内部主机分配两个不同的外部 Tuple,并且建立起两个不同的内、外部 Tuple转换关系。与此同时,只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回UDP报 文,这里对外部返回报文来源的限制是与Port Restricted Cone一致的。不难看出,如果说Full Cone是要求最宽松NAT UDP 转换方式,那么,Symmetric NAT则是要求最严格的NAT方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。

NAT类型检测

前提条件:有一个公网的Server并且绑定了两个公网IP(IP-1,IP-2)。这个Server做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

客 户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发 送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务 器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就不能P2P了(检测停止)。

当客户端能 够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的(LocalIP,LocalPort)比较。如果完全 相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检测停止)。否则客户端在NAT后要做进一步的NAT类型 检测(继续)。

第二步:检测客户端NAT是否是Full Cone NAT?

客户端建立 UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的 请求往回发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。 如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服 务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停 止)。

第三步:检测客户端NAT是否是Symmetric NAT?

客户端建立 UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后 立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这 个客户端可以进行UDP通信)。

用同样的方法用一个socket向服务器的 (IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。

比 较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这 样的客户端无法进行UDP-P2P通信(检测停止)。否则是Restricted Cone NAT,是否为 Port Restricted Cone NAT有待检测(继续)。

第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

客 户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端 口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复 这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的 响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

  1. /-"Full Cone NAT":/  

  2.  

  3. iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 202.96.209.111  

  4.  

  5. iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.1.1  

  6.  

  7. /-"Port Restricted Cone NAT":/  

  8.  

  9. iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 202.96.209.111  

  10.  

  11. /-"Restricted Cone NAT":/  

  12.  

  13. iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 202.96.209.111  

 

  1. iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.1.1  

  2.  

  3. iptables -A FORWARD -d 202.96.209.111 -j ACCEPT  

  4.  

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

  6.  

  7. iptables -I FORWARD 1 -s 85.214.128.86 -j ACCEPT(加入对点IP,作弊型连通)  

#######################3

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
 address X.X.X.X #网卡的ip
 netmask 255.255.255.0
 gateway X.X.X.X #网卡的网关

auto eth0:1
iface eth0:1 inet static
 address 192.168.0.1 #要绑定的ip
 netmask 255.255.255.0

下面是iptables的脚本,这是实际脚本的简版。
#! /bin/sh
iptables -F
iptables -F -t nat
iptables -X

FW_IP="X.X.X.X" #iptables主机的ip地址
LO_IP="127.0.0.1"
LAN_IP="192.168.0.1" #内网的网关
LAN_NET="192.168.0.0/24" #内网
OUT_NET="a.b.c.d/X" #允许进入iptables主机的网络  

###################
#bad tcp rules #禁止坏包(极有可能是扫描或攻击的包)
###################
iptables -N bad_tcp_packets
iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
iptables -A bad_tcp_packets -p tcp -m state --state INVALID -j DROP

###################
#INPUT rules #允许到iptables主机的链接,外网网段可以自己增加
###################
#ssh http rules
iptables -A INPUT -p tcp -j bad_tcp_packets
iptables -A INPUT -s $LO_IP -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -s $OUT_NET -d $FW_IP -m multiport --dport 22,80 -j ACCEPT

#icmp rules #允许所有地址ping我的iptables主机
iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j ACCEPT

###################
#OUTPUT rules #允许iptables所有向外的链接
###################
iptables -A OUTPUT -p tcp -j bad_tcp_packets
iptables -A OUTPUT -s $FW_IP -j ACCEPT
iptables -A OUTPUT -s $LAN_IP -j ACCEPT
iptables -A OUTPUT -s $LO_IP -j ACCEPT

###################
#FORWARD rules #由iptables转发的规则,除了坏包都允许通过
###################
iptables -A FORWARD -p tcp -j bad_tcp_packets

###################
#default policy #默认规则,放在这是为了用ssh远程重启iptables的时候不会断开链接
###################
iptables -P FORWARD ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

##########################################
#nat tables #ip伪装的实现
##########################################
iptables -t nat -A POSTROUTING -s $LAN_NET -j SNAT --to $FW_IP

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

#end


################3

目标:利用端口转发,当服务器接收到881端口请求以后,将其转到 10.10.2.200:881上,10.10.2.200再将数据返回给请求连接。

  Eth0:连接ADSL,即ppp0接口

  Eth1:连接内部网络,ip为10.10.1.1

  10.10.2.200为win2k服务器,其端口881提供网络服务。

  iptbles脚本:

  iptables -t nat -A PREROUTING -p tcp -m tcp --dport 881 -j DNAT --to-destination 10.10.2.200:881 ;将881请求

  发至10.10.2.00:881端口

  iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.200 -p tcp -m tcp --dport 881 -j SNAT --to-source

  10.10.1.1 ;返回a.b.b.d时数据源来自同一子网,就将其源地址更改为10.10.1.1,从eth0发出,并在连接跟踪表中查出a.b.c.d

  从ppp0进来的,又由ppp0将此数据发出。

  当然不要忘了加一条允许881端口访问的语句。

  iptables –A INPUT –p tcp –dport 881 –i ppp0 –j ACCEPT

  可不可把服务器放在局域内,用端口转发来实现呢?答案当然是肯定的,既然能把881端口转发,那么21,80这些个端口更不在话,并且很多服务器软件都可以自定义端口,那就在得玩了,只要有合适的端口,即使给局域网每一个用户开一个ftp服务器也是可的。你想要实现什么服务都可以,当然是基于端口转发的。

  局域网内10.10.2.101是win2k,提供www服务,端口为800

  通过服务器进行访问。

  iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 10.10.2.101:800

  iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source

  10.10.1.1

  iptables –A INPUT –p tcp –dport 800 –i ppp0 –j ACCEPT

  由于是基于端口转发实现的,所以服务器上只需装个iptables来转发数据就行了,一切服务由内部服务器完成,这样的话,我linux服务器才真正的算是个防火墙。​



阅读(2719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~