Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1040638
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类:

2010-11-30 16:01:49

这是一个几经转载的文章,因为马上可能会用到这个,所以先放博客中,为了以后好查找。 



linux端口映射

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DNAT       tcp  --  anywhere             anywhere            tcp dpt:16716 to:192.168.1.10:16716
DNAT       udp  --  anywhere             anywhere            udp dpt:16716 to:192.168.1.10:16716
DNAT       tcp  --  anywhere             anywhere            tcp dpt:10601 to:192.168.1.10:10601
DNAT       udp  --  anywhere             anywhere            udp dpt:10601 to:192.168.1.10:10601
DNAT       tcp  --  anywhere             anywhere            tcp dpt:12746 to:192.168.1.10:12746
DNAT       udp  --  anywhere             anywhere            udp dpt:12746 to:192.168.1.10:12746
DNAT       tcp  --  anywhere             anywhere            tcp dpt:20545 to:192.168.1.10:20545
DNAT       udp  --  anywhere             anywhere            udp dpt:20545 to:192.168.1.10:20545


0、

    以下是BC官方网站对UPnP的解释:

    UPnP(Universal Plug and Play),通用即插即用,是一组协议的统称,不能简单理解为UPnP=“自动端口映射”。在BitComet下载中,UPnP包含了2层意思:

    1、对于一台内网电脑,BitComet的UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将BitComet监听的端口从网关或路由器映射到内网电脑上。

    2、网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。

    其实对于一般的使用者来讲,简单的把UPnP理解为自动端口映 射就可以了。它就是一种基于TCP/IP协议的,针对设备彼此间的通讯而制订的新的Internet协议,目的就是希望未来所有联入Internet中的 设备能够不受网关阻碍的相互通信。


    二、哪些用户需要用UPnP功能?

    1、只有在需要使用一些支持UPnP功能的P2P软件的时候,如BT、电骡eMule、MSN等,我们才需要考虑UPnP这个东东。如果你根本就不用这些软件,仅仅是上网浏览的话,下文就没必要看了;

    2、如果你需要使用这些P2P软件,但你是外网用户,那么下文也可以不看了,因为你不需要做什么UPnP就可以正常使用这些P2P软件了;

    3、如果你是内网用户,但你已经手动为这些P2P软件进行了端口映射,如在使用BC下载时,在“用户列表”中已经看到“远程”,或者是使用电骡eMule连接服务器成功后,已经显示为高ID,那么下文也可以不看了。

    但需要注意的是,手动做的端口映射只是针对某个P2P软件起作用,如果再使用新的P2P软件的话,仍然需要针对新的P2P软件做相应的端口映射才可以;

    4、如果你是内网用户,需要使用这些P2P软件,而且并未进行手动端口映射,比如在使用BC进行下载时,“用户列表”中只有“本地”而没有“远程”,在使用电骡eMule的时候,显示的也是低ID,那么此时我们才需要考虑端口映射的问题!

    这时我们可以有两种选择:

    1、进行手动端口映射。

    2、打开UPnP功能,进行自动端口映射,也就是我们下面所讲的内容;

小结:UPnP自动端口映射的目的:

    以BC为例,手动端口映射和自动UPnP端口映射都是为了获得远程连接,因此凡是在“用户列表”里看见了“远程”的用户,都不需要进行端口映射或是UPnP!UPnP和端口映射只需要取其一,他们相当于达到目的的2种不同的方法而已。

    因此如果你的系统或者硬件不支持UPnP功能,大可不必伤心,按照第3点的链接文章中的方法手动做端口映射就可以了,效果是一样的

三、实现UPnP必须满足哪些条件:

    必须同时满足3个条件:

    1、Modem必须支持UPnP功能:是否具备此功能可查阅说明书或者直接咨询厂家。一般来讲,Modem还必须同时支持路由功能,除非你配备了单独的路由器;

    2、操作系统的支持:文章开头提到的那篇介绍UPnP的文章中,提到只有windows xp系统才支持UPnP功能,但微软的官方网站声称从Windows Me开始就已经支持UPnP功能了。但Windows Me这个操作系统我也没有用过,大家可以自行测试;

    3、软件必须支持UPnP功能:如BC、电骡eMule、MSN等软件都支持UPnP功能;

    顺便提一下,目前的几款视讯聊天软件各有其特殊性,象Netmeeting、QQ等就不支持UPnP功能,文章的最后会详细阐述一下这几款聊天软件的特殊性,此处不深入探讨,一笔带过;

    注意:以上3个条件必须同时满足,缺一不可,否则你只能考虑进行手动端口映射了;

    四、如何打开UPnP功能

    如果已经满足了上述的3个条件,那么我们就一步一步的讲解一下到底如何才能打开UPnP功能;

    1、在Modem中打开UPnP功能。

    不同型号的Modem设置界面和方法略有不同,如有些是在下拉菜单中选择Enable,但基本的原理都是一样的;

    有些文章提到,此时要把所有桥接的eoa连接都删除掉,我倒是认为大可不必如此。因为目前只有你的PPPOE连接是有效的,其它的几个eoa所对应的 VPI和VCI根本就是无效的,所以没有必要删除。但是否有些型号的Modem会比较特殊也很难讲,因此建议此时暂不删除,把全部设置进行完后,如果还是 没有打开UPnP,再尝试把eoa删除掉;

    当然,设置完后,一定要保存并重启Modem;

    2、在操作系统中打开UPnP功能:

    如果你使用的是XP SP2系统,则首先进入:控制面板->添加或删除程序->添加/删除windows组件中,在“网络服务”中勾选“UPnP用户界面”。

    确定后,系统会自动安装相应的组件,可能会提示你插入安装光盘,总之按照提示操作完成即可;

    接着打开Windows自带的防火墙,在“例外”选项卡中勾选“UPnP框架”。

    其实有个更加简单的方法可以同时完成以上两步:双击桌面上的网上邻居(注意是鼠标左键双击,不是右键查看属性),然后点击“显示联网的UPnP设备的图标”,系统会自动安装UPnP组件以及在防火墙中打开UPnP框架,实际上就是一次性完成上面两步的工作;

    如果你使用的是XP SP1系统,那么在“windows组件”中显示的是“通用即插即用”,而不是“UPnP用户界面”,选择此项即可。

    而且XP SP1系统的防火墙并没有UPnP框架的选项,需要手动进行端口添加,另一教程对此做了阐述,现引用过来:

    「请在防火墙设置中,点“高级”,然后自行添加如下两个端口:TCP端口类型,端口号为:2869,UDP端口类型,端口号为:1900 .由于你使用了NAT网关,所以你应该设置的是您连接到该网关的网卡的防火墙。而且网关内部均为内网,所以开启这两个端口,不会对系统造成安全隐患(除非 你的NAT网关被绕过,否则外部连接无法检测到该端口)。」

以上的防火墙设置只是针对windows自带的防火墙,如果你安装了其它的防火墙,必须在该防火墙中打开UPnP框架;

    3、在windows中打开相应的UPnP服务:

    进入“控制面板->管理工具->服务”,找到SSDP Discovery Service和Universal Plug and Play Device Host两项服务。

    右击相应的服务项,选择属性,启动这两项服务。

    做完以上工作后,如果操作正确,我们就可以在“网络连接”中看到多了一项网关,这表明添加UPnP已经成功;

    4、打开P2P软件中的UPnP功能:

    以BC和电骡eMule为例,相应的设置选项。

    到此为止,我们打开UPnP的工作才真正结束。

    以BC为例,成功添加UPnP功能后,在“全局日志”中我们会看到类似下面的几行:

    Windows XP UPnP Status: Found WAN Connection Device[Linksys Inc.] [] Windows XP UPnP Status: WAN IP: 218.30.*.* Windows XP UPnP Status: Port Mapping Existed!

    此时我们用BC进行下载,如果用户列表中有“远程”,或者用电骡eMule连接服务器后显示为高ID,那么就大功告成了!

    五、对几款聊天软件的简单对比说明:

    目前常用的聊 天软件主要有MSN、Netmeeting和QQ等,这3款软件中只有MSN支持UPnP功能,而且发现在MSN的选项中并没有设置 UPnP功能的选项,也就是说MSN始终是默认打开UPnP功能的。另外,MSN似乎也没有象BC或者电骡eMule那样提供可以手动进行端口映射的端口 号,因此只要没有打开UPnP功能,MSN的功能就会受限,比如不能进行语音通信等;

    而Netmeeting虽然不支持UPnP功能,但是却提供了可以进行手动进行端口映射的端口号,如果你是内网用户,只要手动进行1503和1720两个端口的映射即可正常使用所有音功能;

    QQ是用UDP的方式,通过UDP服务器来实现音以及文件的传输,跟UPnP没有什么关系,所以无论内网还是外网,使用QQ都畅行无阻,只是传输的速率要慢些;

    说实话,本人平时也不常上网聊天,所以对这些聊天软件了解也不深,如果有说得不对的地方,欢迎高手指点。






一、

(原创)Linux端口映射技术文档

目的:
      通过221.231.141.195的2200端口访问172.16.58.110的22端口
      通过221.231.141.195的2222端口访问172.16.58.220的22端口
操作:
      221.231.141.195的22端口已经映射到172.16.58.240的22端口,所以我们通过SecureCRT连到221.231.141.195上(实际上是连到了172.16.58.240上)然后添加两条以下规则:
      iptables -t nat -A PREROUTING -d 172.16.58.240 -p tcp --dport 2200 -j DNAT --to 172.16.58.110:22
      iptables -t nat -A PREROUTING -d 172.16.58.240 -p tcp --dport 2222 -j DNAT --to 172.16.58.220:22
      规则含义是:如果数据包的目标地址是172.16.58.240、端口是2200、协议是tcp,就将这个包进行目标地址转换(-j DNAT),转换的目标地址是172.16.58.110的22端口。
      开启路由转发功能
      echo "1" >/proc/sys/net/ipv4/ip_forward

      保存规则:
      iptables-save >/etc/sysconfig/iptables
      然后分别在172.16.58.110、172.16.58.220上编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件:
      添加:GATEWAY=172.16.58.240(指向端口转发的那台服务器,这里是172.16.58.240)
      然后:ifdown eth0 && ifup eth0
      OK,这样即可达到目的!



二、

ssh -C -g root@127.0.0.1 -L 5000:61.235.139.123:5000

输入机器的root密码

后台执行:ssh -C -f -N -g root@127.0.0.1 -L 5000:61.235.139.123:5000



另:
ssh -C -f -N -g -R remote_port:local:port user@remotehost
可 以将远端服务器一个端口remote_port绑定到本地端口port,其中-C是进行数据压缩,-f是后台操作,只有当提示用户名密码的时候才转向前 台。-N是不执行远端命令,在只是端口转发时这条命令很有用处。-g 是允许远端主机连接本地转发端口。-R表明是将远端主机端口映射到本地端口。如果是-L,则是将本地端口映射到远端主机端口。



关于ssh端口转发的深入实例
2007-05-13 17:02

Thursday, 5. April 2007, 13:44:15


转自geminis@


ssh的三个强大的端口转发命令:
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host ssh -C -f -N -g -D listen_port user@Tunnel_Host


-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。

-p port Connect to this port. Server must be on the same port.
被登录的ssd服务器的sshd服务端口。

-L port:host:hostport
将 本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-R port:host:hostport
将 远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-D port
指定一个本地机器 “动态的'’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.

-C Enable compression.
压缩数据传输。

-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。

-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。注:这个参数我在实践中似乎始终不起作用,参见III)





 iptables实现端口转发的过程
设我们有一台计算机,有两块网卡,eth0连外网,ip为1.2.3.4;eth1连内网,ip为192.168.0.1.现在需要把发往地址1.2.3.4的81端口的ip包转发到ip地址192.168.0.2的8180端口,设置如下:
1. iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp -m tcp --dport 81 -j DNAT --to-destination192.168.0.2:8180
2. iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.0.0 -d 192.168.0.2 -p tcp -m tcp --dport 8180 -j SNAT --to-source 192.168.0.1

真实的传输过程如下所示:
假设某客户机的ip地址为6.7.8.9,它使用本机的1080端口连接1.2.3.4的81端口,发出的ip包源地址为6.7.8.9,源端口为1080,目的地址为1.2.3.4,目的端口为81.
主 机1.2.3.4接收到这个包后,根据nat表的第一条规则,将该ip包的目的地址更该为192.168.0.2,目的端口更该为8180,同时在连接跟 踪表中创建一个条目,(可从/proc/net/ip_conntrack文件中看到),然后发送到路由模块,通过查路由表,确定该ip包应发送到 eth1接口.在向eth1接口发送该ip包之前,根据nat表的第二条规则,如果该ip包来自同一子网,则将该ip包的源地址更该为 192.168.0.1,同时更新该连接跟踪表中的相应条目,然后送到eth1接口发出.

此时连接跟踪表中有一项:

连接进入: src=6.7.8.9 dst=1.2.3.4 sport=1080 dport=81
连接返回: src=192.168.0.2 dst=6.7.8.9 sport=8180 dport=1080
是否使用: use=1

而 从192.168.0.2发回的ip包,源端口为8180,目的地址为6.7.8.9,目的端口为1080,主机1.2.3.4的TCP/IP栈接收到该 ip包后,由核心查找连接跟踪表中的连接返回栏目中是否有同样源和目的地址和端口的匹配项,找到后,根据条目中的记录将ip包的源地址由 192.168.0.2更该为1.2.3.4, 源端口由8180更该为81,保持目的端口号1080不变.这样服务器的返回包就可以正确的返回发起连接的客户机,通讯就这样开始.

还有一点, 在filter表中还应该允许从eth0连接192.168.0.2地址的8180端口:
iptables -A INPUT -d 192.168.0.2 -p tcp -m tcp --dport 8180 -i eth0 -j ACCEPT


    在网上搜索好多,对linux配置端口映射都不够详细,我在RedHat8.0上用iptables配置了端口映射,讲述详细的配置过程,供大家参考。
【实现功能】
  PC A是
  eth0      172.18.10.212  内网
  eth1      219.239.xx.xx  外网

  PC B是    172.18.10.205  内网

  A的8080端口映射到B的80端口

【步骤】
1、 首先应该做的是/etc/sysctl.conf配置文件的  net.ipv4.ip_forward = 1 默认是0
    这样允许iptalbes FORWARD。
2、 在/etc/rc.d/init.d目录下有iptables 文件,使用格式如下
    Usage: ./iptables {start|stop|restart|condrestart|status|panic|save}
    相当与service iptables {....}
    把iptables 服务停止,清除以前的规则,存盘
    到/etc/rc.d/init.d目录下,运行
  
    ./iptables stop
    iptalbes -F
    iptalbes -X
    iptalbes -Z
    ./iptables save
3、 重新配置规则
iptables -t nat -A PREROUTING -d 219.239.xx.xx -p tcp --dport 8080 -j DNAT --to-destination 172.18.10.205:80
iptables -t nat -A POSTROUTING -d 172.18.10.205 -p tcp --dport 80 -j SNAT --to 172.18.10.212
iptables -A FORWARD -o eth0 -d 172.18.10.205 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 172.18.10.205 -p tcp --sport 80 -j ACCEPT
DNAT SNAT 的请参考帮助,这里不再陈述。
4、 新的规则存盘
    ./iptables save
    规则存盘后在/etc/sysconfig/iptables这个文件里面,若你对这个文件很熟悉
    直接修改这里的内容也等于命令行方式输入规则。
5、 启动iptables 服务
    ./iptables start
    在/proc/net/ip_conntrack文件里有包的流向,如下面
   tcp      6 53 TIME_WAIT src=221.122.59.2 dst=219.239.xx.xx sport=7958 dport=8080 packets=9 bytes=1753
            src=172.18.10.205 dst=172.18.10.212 sport=80 dport=7958 packets=9 bytes=5777 [ASSURED] use=1

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