Linux iptables 端口转发

准备:

1, UDP端口范围映射

2, tcp 端口范围映射

3, 本机端口转发

4, 单个端口转发

准备:

打开转发
[[email protected] ~]# cat /etc/sysctl.conf  | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

清空规则,修改默认策略,重要数据请备份
[[email protected] ~]# iptables -F -t nat
[[email protected] ~]# iptables -X -t nat
[[email protected] ~]# iptables -P INPUT DROP
[[email protected] ~]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[[email protected] ~]# 

删除reject
[[email protected] ~]# vim /etc/sysconfig/iptables
[[email protected] ~]# service iptables restart

1, UDP端口范围映射

一一匹配:
[[email protected] ~]# iptables -t nat -A PREROUTING -p udp --dport 5000:6000 -j DNAT --to 192.168.66.2:5000-6000

【注意】这样写,将导致不可预测的端口转发匹配:
[[email protected] ~]# iptables -t nat -A PREROUTING -p udp --dport 5000:5010 -j DNAT --to 192.168.66.2:6000-6010

【nat内机器:192.168.66.2】端口转发匹配验证,输出源端口是9999
[[email protected] ~]# tcpdump -i eth0 -tnn  port 9999
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 172.16.20.245.9999 > 192.168.66.2.5500: UDP, length 1
IP 172.16.20.245.9999 > 192.168.66.2.5500: UDP, length 1
IP 172.16.20.245.9999 > 192.168.66.2.5501: UDP, length 1
IP 172.16.20.245.9999 > 192.168.66.2.5501: UDP, length 1

【nat外机器:172.16.20.245】发送给nat机器,发出的数据包源端口是9999, 目的端口是5500-5555
sudo nc -v -u -p 9999 172.16.20.183 5500-5555

端口转发双向通信验证:

nat里面的机器打开监听:
[[email protected] ~]# nc -l -u 5555

nat外面的机器向nat 发送数据
nc -u 172.16.20.183 5555

互发数据,双方是可以收到的。

可以发现:端口映射完全匹配,双通互发数据成功!

2, tcp 端口范围映射

 
tcp 端口范围映射:
[[email protected] ~]# iptables -t nat -A PREROUTING -p tcp --dport 2000:2500 -j DNAT --to 192.168.66.2:2000-2500

验证:
接收端:【nat内机器:192.168.66.2】
[[email protected] ~]# tcpdump -i eth0 -tnn  portrange 2000-2500
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 172.16.20.245.37446 > 192.168.66.2.2000: Flags [S], seq 1083771445, win 29200, options [mss 1460,sackOK,TS val 3864340 ecr 0,nop,wscale 7], length 0
IP 192.168.66.2.2000 > 172.16.20.245.37446: Flags [R.], seq 0, ack 1083771446, win 0, length 0
IP 172.16.20.245.47912 > 192.168.66.2.2001: Flags [S], seq 629593170, win 29200, options [mss 1460,sackOK,TS val 3864344 ecr 0,nop,wscale 7], length 0
IP 192.168.66.2.2001 > 172.16.20.245.47912: Flags [R.], seq 0, ack 629593171, win 0, length 0
IP 172.16.20.245.34816 > 192.168.66.2.2002: Flags [S], seq 680276410, win 29200, options [mss 1460,sackOK,TS val 3864345 ecr 0,nop,wscale 7], length 0
IP 192.168.66.2.2002 > 172.16.20.245.34816: Flags [R.], seq 0, ack 680276411, win 0, length 0
IP 172.16.20.245.37508 > 192.168.66.2.2003: Flags [S], seq 1070666075, win 29200, options [mss 1460,sackOK,TS val 3864345 ecr 0,nop,wscale 7], length 0
IP 192.168.66.2.2003 > 172.16.20.245.37508: Flags [R.], seq 0, ack 1070666076, win 0, length 0

发送端:【nat外机器:172.16.20.245】发送给nat机器:
sudo nc -z -w1 -v  172.16.20.183 2000-2500
nc: connect to 172.16.20.183 port 2000 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2001 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2002 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2003 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2004 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2005 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2006 (tcp) failed: Connection refused
nc: connect to 172.16.20.183 port 2007 (tcp) failed: Connection refused

可以看见,虽然连接失败,但是发送的seq和ack回应包都有了,就差握手成功了。


3, 本机端口转发

[[email protected] ~]# iptables -t nat -A PREROUTING -p tcp --dport 1234 -j REDIRECT --to-ports 2345
[[email protected] ~]# nc -l -k 2345  #开启监听

1,
局域网其他主机直接来访问本机2345端口:看看tcpdump输出
[email protected]~$ nc 172.16.20.183 2345 #远程机访问本机172.16.20.183 2345

本机tcpdump输出
[[email protected] ~]# tcpdump -i eth0 host 172.16.20.245 -tnn
IP 172.16.20.245.44706 > 172.16.20.183.2345: Flags [S], seq 33366406, win 29200, options [mss 1460,sackOK,TS val 4001328 ecr 0,nop,wscale 7], length 0
IP 172.16.20.183.2345 > 172.16.20.245.44706: Flags [R.], seq 0, ack 33366407, win 0, length 0

2,局域网其他主机直接来访问本机1234端口:看看tcpdump输出
[email protected]~$ nc 172.16.20.183 1234 #远程机访问本机172.16.20.183 1234

tcpdump在本机看一下:
[[email protected] ~]# tcpdump -i eth0 host 172.16.20.245 -tnn
IP 172.16.20.245.47332 > 172.16.20.183.1234: Flags [S], seq 3622624416, win 29200, options [mss 1460,sackOK,TS val 4047126 ecr 0,nop,wscale 7], length 0
IP 172.16.20.183.1234 > 172.16.20.245.47332: Flags [S.], seq 123535638, ack 3622624417, win 14480, options [mss 1460,sackOK,TS val 12018501 ecr 4047126,nop,wscale 6], length 0
IP 172.16.20.245.47332 > 172.16.20.183.1234: Flags [.], ack 1, win 229, options [nop,nop,TS val 4047126 ecr 12018501], length 0
IP 172.16.20.245.47332 > 172.16.20.183.1234: Flags [P.], seq 1:2, ack 1, win 229, options [nop,nop,TS val 4047282 ecr 12018501], length 1
IP 172.16.20.183.1234 > 172.16.20.245.47332: Flags [.], ack 2, win 227, options [nop,nop,TS val 12019122 ecr 4047282], length 0
IP 172.16.20.245.47332 > 172.16.20.183.1234: Flags [P.], seq 2:3, ack 1, win 229, options [nop,nop,TS val 4047325 ecr 12019122], length 1
IP 172.16.20.183.1234 > 172.16.20.245.47332: Flags [.], ack 3, win 227, options [nop,nop,TS val 12019297 ecr 4047325], length 0
IP 172.16.20.245.47332 > 172.16.20.183.1234: Flags [P.], seq 3:4, ack 1, win 229, options [nop,nop,TS val 4047353 ecr 12019297], length 1

可以看到三次握手成功!


4, 单个端口转发

端口转发 tcp模式:将访问本机1122端口数据包转发给192.168.66.2:5566
iptables -t nat -A PREROUTING -p tcp  --dport 1122 -j DNAT --to-destination 192.168.66.2:5566

端口转发 udp模式:将访问本机2233端口数据包转发给192.168.66.2:4455
iptables -t nat -A PREROUTING -p udp  --dport 2233 -j DNAT --to-destination 192.168.66.2:4455
时间: 2024-11-03 22:01:27

Linux iptables 端口转发的相关文章

Linux 服务器--Iptables 端口转发

日常Iptables 端口转发 需求:公司是局域网络,通过一个外网ip,进行互联网的访问.公司的云平台服务器在公网中,虚拟化平台中有一台内部服务器,用于公司某部门的使用,上面运行www 服务,ssh端口,方便平时上传网站文件.现领导要求将此内部服务器交接给此部门,并只让其在公司内部访问,外面的公网是拒绝访问的. 结构图: 2.解决方法:通过linux 服务器的iptables,利用端口转发,在公司内部通过A机器(或者说A代表某个部门),使其访问到B机器上的特定连接转发至内部机器C上.由于机房服务

Linux iptables 端口映射

Linux iptables 端口映射服务器 A 网口em1:11.1.1.251em3:192.168.1.11111.1.1.8 内网数据库192.168.1.*网段需要通过服务器 A 做端口映射访问内网 11.1.1.8 数据库1.首先应该做的是/etc/sysctl.conf 配置文件的 net.ipv4.ip_forward = 1默认是 0.执行:[root@WS  ~]#sysctl -p这样允许 iptalbes FORWARD.2.在/etc/rc.d/init.d 目录下有

Linux通过端口转发来访问内网服务(端口转发访问阿里云Redis数据库等服务)

# 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz&&cd rinetd sed -i 's/65536/65535/g' rinetd.c (修改端口范围) mkdir /usr/man&&make&&make install 说明:IP的端口是双字节,也就是256*256-1, 256*256对计算机来说就是0,因

Linux SSH端口转发

SSH端口转发分为两种,一种是本地端口转发,又称为本地SSH隧道.一直是远程端口转发.SSH端口转发,还必须指定数据传送的目标主机,从而形成点对点的端口转发. 本地端口转发 假定有三台主机A.B.C.由于种种原因(无论是防火墙还是路由原因),AC两台主机之间无法连通.但是B却可以和A.C连通.这时候就可以用本地端口转发来实现A和C通过B来连通. A  192.168.7.27 B  192.168.6.19 C  192.168.30.68 6网段和7网段.30网段都相通,但是7网段和30网段不

linux系统非ROOT用户80端口不能启动tomcat问题的变通办法——通过Iptables端口转发

2010-07-17 13:21:42 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did not find a matching property. 2010-07-17 13:21:42  org.apache.catalina.core.Ap

iptables 端口转发(单网卡)

pc1 ip:192.168.23.252 pc2 ip:192.168.23.253 目的:访问pc1 的web服务跳转到pc2的web服务上 实现步骤: 开启linux 自带的转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward 我这里使用没有任何规则的iptables service iptables stop iptables -F iptables -X iptables -Z service iptables save 转发命令 iptables -

iptables 端口转发 实现访问内网的httpd服务

上篇文章写到通过dhcp实现客户机上网功能,由于公网地址只有一个,我想把内部服务发布到外网就需要通过 "端口转发" 来实现 1.公网服务器: eth0:公网IP eth1:内网IP - 192.168.1.1 2.HTTPD服务器: eth0:内网IP -192.168.1.100 3.实现方法: 通过访问公网IP的8080端口来实现到内网MYSQL服务器的3306端口的访问 4.在公网服务器上: iptables -t nat -A PREROUTING -p tcp --dport

linux配置端口转发

一.使用rinted进行端口转发 将10.50.13.13 80请求转到10.50.13.11 80上 1.安装rinetd $ tar zxf rinetd.tar.gz $ cd rinetd $ make $ make install 2.编辑配置文件 $ vi /etc/rinetd.conf 添加如下内容 $ 0.0.0.0 80 10.50.13.11 80 #本机IP为10.50.13.13 3.启动rinetd服务 $ rinetd -c /etc/rinetd.conf 二.使

linux 系统端口转发

将外部请求的 80 端口转发到 8080 端口 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 将内部使用localhost(127.0.0.1)请求的 80 端口转发到 8080 端口 sudo iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080