web-dev-qa-db-ja.com

特定のトラフィックをGREトンネルに強制的に通過させる方法は?

これが私がすることです。

サーバー(パブリックインターネットは222.x.x.xです):

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf  
sysctl -p  
iptunnel add gre1 mode gre local 222.x.x.x remote 115.x.x.x ttl 255  
ip add add 192.168.168.1/30 dev gre1  
ip link set gre1 up  
iptables -t nat -A POSTROUTING -s 192.168.168.0/30 -j SNAT --to-source 222.x.x.x  
iptables -t nat -A PREROUTING -d 222.x.x.x -j DNAT --to-destination 192.168.168.2  

クライアント(パブリックインターネットは115.x.x.xです):

iptunnel add gre1 mode gre local 115.x.x.x remote 222.x.x.x ttl 255  
ip add add 192.168.168.2/30 dev gre1  
ip link set gre1 up  
echo '100 tunnel' >> /etc/iproute2/rt_tables  
ip rule add from 192.168.168.0/30 table tunnel  
ip route add default via 192.168.168.1 table tunnel  

ここまでは、すべて順調に進んでいるようです。しかし、最初の質問は、GREトンネルをデフォルトルートとして使用する方法ですか?クライアントコンピューターは、引き続きデフォルトとして115.x.x.xインターフェイスを使用しています。

2番目の質問、ICMPトラフィックのみを強制的にトンネルを通過させ、他のすべてをデフォルトのインターフェイスに移動させる方法は?私はクライアントコンピューターでこれをやってみます:

ip rule add fwmark 200 table tunnel  
iptables -t mangle -A OUTPUT -p udp -j MARK --set-mark 200  

しかし、これを行った後、私のpingプログラムはタイムアウトします(上記の2つのコマンドを実行せず、代わりにping -I gre1 ipを使用すると、機能します)。後で、トンネルを介したUDPポート53のみなど、他のことも実行したいと思います。

3番目の質問、クライアントコンピューターで、1つのmysqlプログラムにgre1インターフェイス192.168.168.2でリッスンするように強制します。クライアントコンピューターには、もう1つのパブリックインターフェイス(IP 114.x.x.x)があります... iptablesとrouteを使用してトラフィックを適切に転送し、mysqlがこの114.x.x.xパブリックインターフェイスからの要求にも応答するようにする方法は?

2
wew

質問1

チェックアウト デフォルトルートとしてgreトンネルを使用

質問2トンネルを通過するすべてのicmp

iptables -t nat -A POSTROUTING -o gre1 -p icmp -j SNAT --to-source 192.168.168.2

質問3

クライアントマシンで、DNATを使用して、外部ポートからサーバーポートへのポート転送を実行します。

方法2-ポートリフレクション/ポートミラーリング

iptables -t nat -A PREROUTING -p tcp -m tcp -m multiport -d 114.x.x.x --dports 3306 -j DNAT --to-destination 192.168.168.1
iptables -t nat -A POSTROUTING -o gre1 -p tcp -m tcp -m multiport -d 192.168.168.1 --dports 3306 -j SNAT --to-source 192.168.168.2
1
John Siu