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上.
1
|
# iptables -t nat -A PREROUTING -p tcp --dport 81 -j REDIRECT --to-ports 8080
|
如果需要本机也可以访问,则需要配置OUTPUT链:
1
|
iptables -t nat -A OUTPUT -p tcp --dport 81 -j REDIRECT --to-ports 8080
|
原因:外网访问需要经过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