web-dev-qa-db-ja.com

iptablesを使用してHTTPおよびSSHポートを内部サーバーに転送するにはどうすればよいですか?

私はルーターを持っていないので、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)トラフィックを内部サーバーに転送したいと思います。

これに対する解決策は何ですか?

5
Rahul

まず、カーネルでパケット転送が有効になっていることを確認してください

# 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
6
sandeep.s85

ポートの転送方法に関するこの素晴らしい DigitalOcean のチュートリアルに基づいて、ここで書き直すことにしました。

私はこれがどのように機能するかについて何時間もの研究を費やしました..私はLinuxに不慣れで、最初は必ずしも簡単ではありません。これが私のサーバーとポート転送の例です:

ファイアウォールサーバー(2 NICカード)-ネットワークの詳細:

  • パブリックIPアドレス:xx.xx.xx.xx
  • プライベートIPアドレス:yy.yy.yy.yy
  • パブリックインターフェイス:eth0
  • プライベートインターフェイス:eth1

内部(例:ssh、web)サーバー(1 NICカード)-ネットワークの詳細:

  • プライベートIPアドレス:zz.zz.zz.zz
  • プライベートインターフェイス:eth0

解決:

カーネルでパケット転送を有効にします。

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

いくつかのメモ:

  • "..- s $ ADMIN -d $ FW_eth0_ip .."(1行目)-セキュリティ上の理由でのみ追加-それはADMIN IPのみがSSHにアクセスできることを意味します(必要でない場合は削除できます)
  • -m conntrack-m stateと同じです
  • SSHのデフォルトポートを1xxxxなどの別のポートに変更することをお勧めします(/ etc/ssh/sshd_config内)
  • チェック TCPとUDPポート番号のリスト
  • ファイアウォールサーバーのSSHにアクセスするためにポート15xx1を使用し、内部15xxx2を使用します

ターミナル:

# access firewall server
$ ssh [email protected] -p 15xx1

# access internal server
$ ssh [email protected] -p 15xx2

使用されているルールの詳細は、言及されているチュートリアルで完全に説明されています。

これですべてです。お役に立てば幸いです。

2
sancro

この質問は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サービスでも同じことができます。

1
Noam Manos

まず、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列に、一致しているルールが表示されます。

1