私はルーターを持っていないので、LinuxシステムをCentOS 6.4のルーターにして、パブリックネットワークトラフィックをローカルLANに転送します。 2つのNIC=カードがあります。1つはパブリックIPアドレス(eth1)用で、もう1つはプライベートIPアドレス(eth2)用です。
自分のローカルLANに接続されているサーバーがあります。192.168.1.2だとします。
x.x.x.xはパブリックIPアドレス用です(このIPアドレスはeth1にあります)。
LinuxシステムルーターのIPアドレスは192.168.1.1を想定しています(このIPアドレスはeth2にあります)。
どこのどのネットワークの誰かがこれを使用するとき、つまり
ssh x.x..x.x
(パブリックIPアドレス)または PuTTY を使用
それはサーバーに行きます。
サーバーでSELinuxとiptablesファイアウォールを無効にします。
LinuxシステムルーターでIptablesの変更をいくつか行いましたが、それはルーターとして機能するそれ自体に適用され、他のネットワークや同じネットワークからのメインサーバーには適用されません。
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22
しかし、それは機能しません。
また、同じLinuxシステムルーターからiptablesを使用して、すべてのHTTP(80)トラフィックを内部サーバーに転送したいと思います。
これに対する解決策は何ですか?
まず、カーネルでパケット転送が有効になっていることを確認してください
# echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf
に以下の行を追加して、永続化することもできます
net.ipv4.ip_forward = 1
ルーターとして機能するLinuxマシンでこれを行う必要があります。ルータマシンで次のルールを試すことができます。
iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j DNAT --to-destination 192.168.1.2:22
また、NATルーターボックスからのルールの出力をお知らせください。
iptables -t nat -L -n -v
ポートの転送方法に関するこの素晴らしい DigitalOcean のチュートリアルに基づいて、ここで書き直すことにしました。
私はこれがどのように機能するかについて何時間もの研究を費やしました..私はLinuxに不慣れで、最初は必ずしも簡単ではありません。これが私のサーバーとポート転送の例です:
ファイアウォールサーバー(2 NICカード)-ネットワークの詳細:
内部(例:ssh、web)サーバー(1 NICカード)-ネットワークの詳細:
解決:
カーネルでパケット転送を有効にします。
echo 1 > /proc/sys/net/ipv4/ip_forward
変数を定義します。
# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"
# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"
# Services:
SSH="22"
HTTP="80"
Iptablesポート転送(-m conntrackを使用):
iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip
いくつかのメモ:
ターミナル:
# access firewall server
$ ssh [email protected] -p 15xx1
# access internal server
$ ssh [email protected] -p 15xx2
使用されているルールの詳細は、言及されているチュートリアルで完全に説明されています。
これですべてです。お役に立てば幸いです。
この質問はiptablesに関するものですが、FirewallDも実行している場合は、内部ネットワークのHTTPにアクセスする方法を次に示します。
まず、内部サーバーFirewallDでhttpトラフィックを許可します。
# firewall-cmd --permanent --add-service=http
次に、httpトラフィックを外部IPから内部IPのポート80に転送します。
# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11
SSHサービスでも同じことができます。
まず、Linuxゲートウェイでルーティングを有効にします。
echo 1 > /proc/sys/net/ipv4/ip_forward
次に、ネットワークインターフェース(eth1など)と必要なポートに次のルールを追加します。
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
ルールをiptables -L -v
で確認すると、pkts列とbytes列に、一致しているルールが表示されます。