开启路由转发功能

[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

 

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 端口。

 iptables做TCP/UDP端口转发【转】_服务器

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

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

 

 

 

 1.237 上查看连接信息

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

 

 

 

1.242 上查看连接信息

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

 

 

 

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

删除该端口转发:

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

iptables -t nat -nL --line

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

删除指定表的指定链上的规则, -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


 

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

 

 

 

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

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

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

1.168 的抓包结果:

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

 

 

 

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

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

 

 

 

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

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

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

 iptables做TCP/UDP端口转发【转】_抓包_09

 

 

 

在 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 主机上抓包:

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

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

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

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

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

————————————————

iptables转发UDP

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

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

iptables做TCP/UDP端口转发【转】_服务器_12

请注意:此方案基于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 查看失败的话
  • ​​

 

需求很简单,把本地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