iptables 简单应用(2)

linux 5aimiku 1085次浏览 5个评论

关掉一些敏感的端口以防spam之类的。。。

iptables -A OUTPUT -p tcp -m multiport --dport 24,25,50,57,105,106,109,110,143,158,209,218,220,465,587 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p tcp -m multiport --dport 993,995,1109,24554,60177,60179 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p udp -m multiport --dport 24,25,50,57,105,106,109,110,143,158,209,218,220,465,587 -j DROP
iptables -A OUTPUT -p udp -m multiport --dport 993,995,1109,24554,60177,60179 -j DROP

iptables -I FORWARD -p tcp --dport 25 -j DROP
iptables -I INPUT -p tcp --dport 25 -j DROP
iptables -I OUTPUT -p tcp --dport 25 -j DROP

/sbin/service iptables save

封禁特定网站:

很多时候作为一个ss站站长不想让自己的游戏线路被别人拿来跑油管视频,下面这个方法还不错,通过string字段来屏蔽相关域名

iptables -I OUTPUT -m string --string "XXXX.COM" --algo bm -j DROP
# 添加屏蔽规则
 
iptables -D OUTPUT -m string --string "XXXX.COM" --algo bm -j DROP
# 删除屏蔽规则,上面添加的代码是什么样,那么删除的代码就是把 -I 改成 -D 

-I 是插入iptables规则;
-D 是删除对应的iptables规则;
-m string 是指定模块;
–string “youtube.com” 是指定要匹配的字符串(域名);
–algo bm 是指定匹配字符串模式/算法;
-j DROP 是指匹配到数据包后处理方式,这里是丢弃数据包。
这个模块的作用就是匹配字符串,这个字符串可以是URL,也可以是普通文本,也可以是文件后缀,
比如: .zip ,就会把包含 .zip 的数据库丢弃,这样就会无法下载 .zip 类型的文件了!

利用iptables转发流量(SS中转):

(此部分转载于通过iptables来中转ss流量

最近国内的网络环境是越来越差了,改绕的还是绕,不该绕的也开始绕了…

那么看着那上天的延迟,总要想点办法解决对吧,那么除了出国最好的方案估计就是加钱了,世界加钱可及

加钱买一台阿里云香港B是个不错的方案,但是阿里云到全球的速度却不如香港SoftLayer好,那么我们可以通过中转的方案让香港SL也能随便跑到100M

然而通过haproxy的方式中转的流量不支持UDP,那么就没法用来玩游戏了,所以只能通过iptables中转Shadowsocks TCP和UDP的流量

首先我们要打开服务器的转发功能:vi /etc/sysctl.conf

net.ipv4.ip_forward= 0修改成net.ipv4.ip_forward= 1
保存后执行sysctl -p让修改生效

然后执行下列命令添加iptables规则

iptables -t nat -A PREROUTING -p tcp --dport [端口号] -j DNAT --to-destination [目标IP]
iptables -t nat -A PREROUTING -p udp --dport [端口号] -j DNAT --to-destination [目标IP]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [端口号] -j SNAT --to-source [中转服务器IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [端口号] -j SNAT --to-source [中转服务器IP]

如果需要把10000到20000的端口全部转发到目标服务器的对应端口,就在[端口号]这填写10000:20000
非相同端口的转发也差不多

iptables -t nat -A PREROUTING -p tcp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号]
iptables -t nat -A PREROUTING -p udp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [中转服务器IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [中转服务器IP]

举个栗子,你中转中转服务器的10000端口转发到目标服务器8.8.8.8的53端口上应该这么写:

iptables -t nat -A PREROUTING -p tcp --dport 10000 -j DNAT --to-destination 8.8.8.8:53
iptables -t nat -A PREROUTING -p udp --dport 10000 -j DNAT --to-destination 8.8.8.8:53
iptables -t nat -A POSTROUTING -p tcp -d 8.8.8.8 --dport 53 -j SNAT --to-source [中转服务器IP]
iptables -t nat -A POSTROUTING -p udp -d 8.8.8.8 --dport 53 -j SNAT --to-source [中转服务器IP]

最后别忘了保存规则和重启iptables
service iptables save
service iptables restart

如果你感觉自己特聪明,已经身近百战了,你还能直接编辑iptables文件

vi /etc/sysconfig/iptables
然后重启iptables service iptables restart

udp可以用socat搞定:
socat UDP-LISTEN:XXXX,reuseaddr,fork UDP:X.X.X.X:XXXX &>> youlogfile.log &

然后就连接中转服务器IP爽爽吧~

 

2016/7/3更新:azure出现玄学问题的解决措施

半路出家的我对复杂的iptables设置很是头疼,扒了文章了解后,大概得知我们的需求是由SNAT和DNAT合作完成的。简而言之就是我们的客户机上将服务器设置为我们的跳板机,则数据包发送到跳板机上,然后修改源IP和目标IP地址,重新转发给后面真实的SS服务器上,以此完成整个过程。使用azure国内为跳板。
那么依样画葫芦,摘取一下:

iptables -t nat -A PREROUTING -p tcp --dport 8388 -j DNAT --to-destination SS_VPS_IP:8388
iptables -t nat -A POSTROUTING -p tcp -d SS_VPS_IP --dport 8388 -j SNAT --to-source Azure_IP

以上只转发TCP包,应该能够实现原本基础的功能了,可是经测试无效。检查了Azure网页中的端口映射,检查了iptables是否打开了转发,FORWARD表默认ACCEPT后都没有排除故障,只好用TCPDUMP抓取数据包。抓包后发现,在Azure的机器上,iptables出色的完成了预计的任务(如图)。可是在SS服务器上,则是一个包都没进得来。挠头之余,很是无奈啊。

后来发现,Azure在外层有一层NAT,所给虚拟机的IP虽然是公网IP,但是不是绑定在虚拟机网卡上的IP。Azure的防火墙在收到数据包后进行一次NAT,转发给内部虚拟机。出去的数据包也经过一次NAT,之后才进行发送。
虽然在出咱虚拟机网卡的包的目标地址被正确的修改,指向了SS-vps,但是源地址是该虚拟机的外网IP(Azure叫他:公用虚拟 IP (VIP)地址),这个包在经国Azure的外围防火墙的时候被丢弃,因为认为这个包的源IP不是内部的服务器的。
修改规则后,测试成功。并且SS-tunnel正常。修改后代码如下:

iptables -t nat -A PREROUTING -p tcp --dport 8388 -j DNAT --to-destination SS_VPS_IP:8388
iptables -t nat -A PREROUTING -p udp --dport 8388 -j DNAT --to-destination SS_VPS_IP:8388
iptables -t nat -A POSTROUTING -p tcp -d SS_VPS_IP --dport 8388 -j SNAT --to-source Azure内部 IP 地址
iptables -t nat -A POSTROUTING -p udp -d SS_VPS_IP --dport 8388 -j SNAT --to-source Azure内部 IP 地址

 

当然了正常情况下对于一般的VPS可以参照一下例子使用转发:

需求:
udp端口转发,把103.60.139.5的162端口转发到103.60.139.120:161

echo "1">/proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d 103.60.139.5 -p udp –dport 162 -j DNAT –to-dest 103.60.139.120:161
iptables -t nat -A POSTROUTING -d 103.60.139.120 -p udp –dport 161 -j SNAT –to-source 103.60.139.5

本文版权:霜之哀伤 转载请注明iptables 简单应用(2)
喜欢 (2)or分享 (0)
5aimiku
关于作者:
一条自以为上了大学就脱离苦海的咸鱼,业余喜欢打游戏,平时喜欢折腾各种东西,喜欢ACG,喜欢宅。
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(5)个小伙伴在吐槽
  1. 呀,,我搭的ss不能用多端口,去贴吧求助了,尝试你说的service iptables stop...然后出现如下东东.. [root@vultr ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Failed to stop iptables.service: Unit iptables.service not loaded. 该怎么解决呀aaaaaaa :???:
    iiihhhi2016-06-29 14:52 回复
  2. 呀。我搭的ss只有一个端口能有、去了贴吧求助。尝试用你说的service iptables stop....可以没有解决额, [root@vultr ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Failed to stop iptables.service: Unit iptables.service not loaded. 这是啥意思啊,, :???:
    iiihhhi2016-06-29 14:41 回复
    • 猜想你使用的是CentOS 7之类的系统,防火墙由firewalld来管理,当然你可以还原传统的管理方式。或则使用新的命令进行管理。 假如采用传统请执行一下命令:
      systemctl stop firewalld
      systemctl mask firewalld
      
      并且安装iptables-services:
      yum install iptables-services
      
      设置开机启动:
      systemctl enable iptables
      
      然后你就可以用iptables了
      systemctl [stop|start|restart] iptables
      
      or
      service iptables [stop|start|restart]
      
      service iptables save
      
      都可以用了
      杨博, 卫2016-06-29 17:26 回复
      • 啊啊呀,,原来我发出去了,还发了两次额 。。按你说的弄了。成功啦,其他端口可以用了。感谢感谢 :mrgreen:
        iiihhhi2016-06-30 03:38 回复
        • 不客气 :oops:
          杨博, 卫2016-06-30 13:17 回复