iptables做TCP/UDP端口转发【转】

开启路由转发功能

[root@test3domian]# echo 1 > /proc/sys/net/ipv4/ip_forward

1、打开包转发功能:

echo “1” > /proc/sys/net/ipv4/ip_forward

2、修改/etc/sysctl.conf文件,让包转发功能在系统启动时自动生效:

#. Controls IP packet forwarding

net.ipv4.ip_forward = 1

3、打开iptables的NAT功能:

/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

说明:上面的语句中eth0是连接外网或者连接Internet的网卡. 执行下面的命令,保存iptables的规则: service iptables save

4、查看路由表:

netstat -rn 或 route -n

5、查看iptables规则:

iptables -L
————————————————
版权声明:本文为CSDN博主「KK博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43101391/article/details/82953051

 

ssh 也能实现本机的端口转发,只不过原来的 1 条连接会变成 3 条。详情见前一篇 ssh 端口转发博文。而 iptables 的端口转发则是在内核进行。

1、将本地的端口转发到本机端口


将本机的 7777 端口转发到 6666 端口。

iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666

1.242 机器上将 7777 端口转发到 6666,并侦听 6666 端口。

 

1.237 机器上连接 1.242 的 7777 端口,虽然 1.242 的 7777 端口并未被侦听,但是被转发给了处于侦听状态的 6666 端口。

 

 

 

 

 1.237 上查看连接信息

 

 

 

 

1.242 上查看连接信息

 

 

 

 

 注意 1.242 查查看到的连接信息中,本端端口是转发之后的端口 6666,而不是 7777.

删除该端口转发:

查看当前iptables 的 nat 表的所有规则:(不用 -t 指定表名默认的是指 filter 表)

iptables -t nat -nL --line

删除指定表的指定链上的规则, -D 并指定序号即可。

iptables -t nat -D PREROUTING 1

*说明:PREROUTING链修改的是从外部连接过来时的转发,如果本机连接到本机的转发,需要修改 OUTPUT链。

iptables -t nat -A OUTPUT -p tcp --dport 7777 -j REDIRECT --to-port 6666

2、将本机的端口转发到其他机器


通过 1.168 的 6666 端口访问 1.8 的 7777 端口,在 1.168 上设置:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 192.168.1.8:7777
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.8 --dport 7777 -j SNAT --to-source 192.168.1.168

 

 

 

 


 3138 端口从后边的抓包结果中获取。

 分别在 1.168 上抓包和 1.8 上抓包:tcpdump -i virbr0 port 6666 or 7777 -w result.cap.

-i 选项指定网卡,-w 选项保存结果到文件当中。抓包的结果使用 Wireshark 查看如下。

1.168 的抓包结果:

 

 

 

 

可以看到 168 收到的包被转发。因为转发发生在内核,在 1.168 转发机上,使用 ss 看不到任何与 1.6 即 1.8 的连接。

 

 

 

 

 1.8 机器上,看到的就是正常的和 1.168 建立连接并传送数据,1.8 并不知道 1.168 仅仅是转发而已。

3、将一台公网 ip 主机的端口转发到另一台公网 ip 主机

 我有两台AWS主机,一台位于伦敦,一台位于俄勒冈。红色为对应主机的公网 ip. 黑色为私网ip. 将 London 主机的 8016 端口转发到 Oregon 的 8017 端口。

 

 

 

 

在 London 主机上操作:

iptables -t nat -A PREROUTING -p tcp --dport 8016 -j DNAT --to-destination 18.222.236.211:8017
iptables -t nat -A POSTROUTING -p tcp -d 18.222.236.211 --dport 8017 -j SNAT --to-source 10.53.1.49
 在 London 主机上抓包:

 

注意:这里关键的地方在于 SNAT 之后的 source 地址只能是内网地址,不能 London 主机的公网地址。

如果配成了 London 主机的公网地址,抓包结果如下,转发不会成功。

 

虽然通过公网 ip 连接主机,但实际上在主机上抓包显示,数据包的目的地址都是主机的私网地址。DNAT 修改了数据包的目的地址,SNAT修改了数据包的源地址,一旦源地址被修改为本机的公网地址,该数据包将会被丢弃。
————————————————

iptables转发UDP

最近海拔在某个项目实践过程中需要用到UDP端口转发,比如我需要用A服务器做为中转UDP服务器,用户访问A服务网的UDP端口时候转发至后端B服务器对应的UDP端口。

经过在网上查找,发现实现此功能多种方案,比如haproxy、nginx都可以实现,但由于我不想在安装其他的软件,就想着利用系统本身的功能来实现相关转发。经过查询资料和测试海拔发现了一个更为简单的方案——iptables。

请注意:此方案基于iptables,一般centos6自带iptables,centos7需要自行安装iptables。

一般情况下我们是用iptables转发(TCP)代码经常使用如下代码(头条代码显示不完善,凑活着看吧):

iptables -t nat -A PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp --dport 80 -j SNAT --to 10.10.10.1

iptables -A FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT

 

海拔按照一般思维将上述代码中的TCP修改为UDP发现转发失败,经过在网上继续查找相关资料,终于测试成功。

代码如下(10.10.10.1 代表本机IP, 192.168.1.1 代表目的地IP):

iptables -t nat -A PREROUTING -d 10.10.10.1 -p udp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -A FORWARD -o eth0 -d 192.168.1.1 -p udp --dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.1.1 -p udp --sport 80 -j ACCEPT

iptables -t nat -A PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A POSTROUTING -s 192.168.1.1 -p tcp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -A FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT

 

将上述代码复制,然后在ssh链接工具里粘贴执行即可。如果需要永久生效,记得用 iptables save 保存规则。

当然删除规则也很简单只需要执行以下代码:

iptables -t nat -D PREROUTING -d 10.10.10.1 -p udp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -D POSTROUTING -s 192.168.1.1 -p udp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -D FORWARD -o eth0 -d 192.168.1.1 -p udp --dport 80 -j ACCEPT

iptables -D FORWARD -i eth0 -s 192.168.1.1 -p udp --sport 80 -j ACCEPT

iptables -t nat -D PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -D POSTROUTING -s 192.168.1.1 -p tcp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -D FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT

iptables -D FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT

 

利用iptables做端口转发

  • 在做内网渗透的时候,用iptables 做转发感觉还是挺香的,不用再上工具啥的了。
 
#server-A 1.1.1.1
#server-B 2.2.2.2

#在server-A执行命令
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 999 -j DNAT --to-destination 1.1.1.1:80  

iptables -t nat -A POSTROUTING  -d 1.1.1.1 -p tcp -m tcp --dport 80 -j SNAT --to-source 2.2.2.2


service iptables save

iptables -t nat -nL  #查看是否添加
#本地访问
server-A:999 可以成功访问到 server-B:80

访问 http://1.1.1.107:999  获取到  http://2.2.2.2:80 的内容

iptables 笔记

#PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。
#POSTROUTIONG 通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)


iptables -F       #清除预设表filter中的所有规则链的规则。
iptables -X       #清除预设表filter中使用者自定链中的规则。
iptables –Z       #数据包计数器归零。

iptables -L INPUT --line-numbers  #获取要删除的规则在哪行
iptables -D INPUT 行数


service iptables save #如果需要永久生效,则要保存.写入到/etc/sysconfig/iptables文件里.
#写入后记得把防火墙重起一下,才能起作用。(手写文件的情况)

踩坑

  • CentOS 7默认没有了iptables文件。
  • 要自己手动 yum install iptables-services #systemctl status iptables 查看失败的话

参考文档

https://www.cnblogs.com/shijiaqi1066/p/3812510.html

 

需求很简单,把本地81端口映射到8080端口上

1. 所有的81请求转发到了8080上.

如果需要本机也可以访问,则需要配置OUTPUT链:

原因:外网访问需要经过PREROUTING链,但是localhost不经过该链,因此需要用OUTPUT,或者POSTROUTING。POSTROUTING不行,需要看看。

 

Linux开启路由转发功能

标记一下,今天想让一台Red Hat Enterprise Linux 7开通iptables的nat转发功能,找了半天。

A服务器:192.168.30.20/24

B服务器:192.168.30.1/24,eth0;  192.168.40.1/24,eth1

C服务器:192.168.40.20/24

目标:让A可以ping和ssh到c机器。这就需要通过B服务器来跳转。

操作过程:

1、在B服务器上开启内核路由转发参数

临时生效:

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

永久生效的话,需要修改sysctl.conf:

net.ipv4.ip_forward = 1

执行sysctl -p马上生效

2、B服务器开启iptables nat转发

iptables  -t nat  -A POSTROUTING  -s 192.168.30.0/24 -d 192.168.40.0/24 -o eth1 -j  MASQUERADE

# 配置源地址30网段,目标地址40网段的地址转换,从eth1网卡出。

iptables -t nat -A POSTROUTING -s 192.168.40.0/24  -d 192.168.30.0/24 -o eth0 -j MASQUERADE

#配置源地址40网段,目标地址30网段的地址转换,从eth0网卡出。

永久保存:iptables-save > /etc/sysconfig/iptables

TIP:注意对应网卡。

3、在A和C服务器上设置路由为B服务器IP

A:  route add -net 192.168.40.0 netmask 255.255.255.0 gw 192.168.30.1

C: route add -net 192.168.30.0 netmask 255.255.255.0 gw 192.168.40.1

 

转自

版权声明:本文为CSDN博主「zhouguoqionghai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouguoqionghai/article/details/81947603

如何利用iptables让端口映射快速实现?好用的方法推荐-oray贝锐科技花生壳官网
https://hsk.oray.com/news/6446.html 

利用iptables做端口转发 - 0xdd - 博客园
https://www.cnblogs.com/0xdd/p/13178149.html

iptables端口转发命令 – 运维生存时间
http://www.ttlsa.com/linux/iptables-port-redirect/

Linux开启路由转发功能_服务器应用_Linux公社-Linux系统门户网站
https://www.linuxidc.com/Linux/2016-12/138661.htm

 

posted @ 2021-04-22 10:03  paul_hch  阅读(10538)  评论(1编辑  收藏  举报