Thursday, 5. April 2007, 13:44:15
转自geminis@http://floss.zoomquiet.org/data/20070104103806/
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
-fForkintobackgroundafterauthentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-pportConnecttothisport.Servermustbeonthesameport.
被登录的ssd服务器的sshd服务端口。
-Lport:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口.工作原理是这样的,本地机器上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,同时远程主机和host的hostport端口建立连接.可以在配置文件中指定端口的转发.只有root才能转发特权端口.IPv6地址用另一种格式说明:port/host/hostport
-Rport:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.工作原理是这样的,远程主机上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转向出去,同时本地主机和host的hostport端口建立连接.可以在配置文件中指定端口的转发.只有用root登录远程主机才能转发特权端口.IPv6地址用另一种格式说明:port/host/hostport
-Dport
指定一个本地机器“动态的'’应用程序端口转发.工作原理是这样的,本地机器上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,根据应用程序的协议可以判断出远程主机将和哪里连接.目前支持SOCKS4协议,将充当SOCKS4服务器.只有root才能转发特权端口.可以在配置文件中指定动态端口的转发.
-CEnablecompression.
压缩数据传输。
-NDonotexecuteashellorcommand.
不执行脚本或命令,通常与-f连用。
-gAllowremotehoststoconnecttoforwardedports.
在-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-tnat-APREROUTING-d1.2.3.4-ptcp-mtcp--dport81-jDNAT--to-destination192.168.0.2:8180
2.iptables-tnat-APOSTROUTING-s192.168.0.0/255.255.0.0-d192.168.0.2-ptcp-mtcp--dport8180-jSNAT--to-source192.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.9dst=1.2.3.4sport=1080dport=81
连接返回:src=192.168.0.2dst=6.7.8.9sport=8180dport=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-AINPUT-d192.168.0.2-ptcp-mtcp--dport8180-ieth0-jACCEPT
在网上搜索好多,对linux配置端口映射都不够详细,我在RedHat8.0上用iptables配置了端口映射,讲述详细的配置过程,供大家参考。
【实现功能】
PCA是
eth0172.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
这样允许iptalbesFORWARD。
2、在/etc/rc.d/init.d目录下有iptables文件,使用格式如下
Usage:./iptables{start|stop|restart|condrestart|status|panic|save}
相当与serviceiptables{....}
把iptables服务停止,清除以前的规则,存盘
到/etc/rc.d/init.d目录下,运行
./iptablesstop
iptalbes-F
iptalbes-X
iptalbes-Z
./iptablessave
3、重新配置规则
iptables-tnat-APREROUTING-d219.239.xx.xx-ptcp--dport8080-jDNAT--to-destination172.18.10.205:80
iptables-tnat-APOSTROUTING-d172.18.10.205-ptcp--dport80-jSNAT--to172.18.10.212
iptables-AFORWARD-oeth0-d172.18.10.205-ptcp--dport80-jACCEPT
iptables-AFORWARD-ieth0-s172.18.10.205-ptcp--sport80-jACCEPT
DNATSNAT的请参考帮助,这里不再陈述。
4、新的规则存盘
./iptablessave
规则存盘后在/etc/sysconfig/iptables这个文件里面,若你对这个文件很熟悉
直接修改这里的内容也等于命令行方式输入规则。
5、启动iptables服务
./iptablesstart
在/proc/net/ip_conntrack文件里有包的流向,如下面
tcp653TIME_WAITsrc=221.122.59.2dst=219.239.xx.xxsport=7958dport=8080packets=9bytes=1753
src=172.18.10.205dst=172.18.10.212sport=80dport=7958packets=9bytes=5777[ASSURED]use=1